ml-connector
Microsoft Dynamics 365 Business CentralSlack

Microsoft Dynamics 365 Business Central and Slack integration

Microsoft Dynamics 365 Business Central runs your finance and operations. Slack is where your team talks and acts. Connecting the two turns finance events into Slack messages and lets a Slack click finish the work in the ERP. When a purchase invoice or sales invoice is created, changed, or sent for approval in Business Central, ml-connector posts a clear Block Kit message into the right Slack channel, and an Approve or Post button in Slack triggers the Business Central posting action without anyone opening the ERP. ml-connector handles the very different APIs on each side and keeps the two in step on the cadence you set.

How Microsoft Dynamics 365 Business Central works

Microsoft Dynamics 365 Business Central exposes vendors, customers, purchase invoices, sales invoices, purchase orders, GL accounts, items, and employees through its REST API v2.0, built on OData v4, scoped under a company on a tenant-specific environment URL. Authentication is OAuth 2.0 client credentials against Microsoft Entra ID, so an unattended connector signs in with a client ID and secret and no user is involved. Business Central pushes change notifications through a subscription webhook, but those notifications carry only what changed and not the data, so the record is fetched after the signal. Subscriptions expire every three days and must be renewed, and purchase orders are not webhook-supported, so they are read by polling with an OData lastModifiedDateTime filter.

How Slack works

Slack is a communication platform, not an ERP, so it has no native vendor, invoice, purchase order, or GL account objects. It exposes channels, messages, users, and files through the Slack Web API, where every call uses a non-expiring bot token with the xoxb- prefix passed as a bearer header, and methods are namespaced like conversations.list and chat.postMessage. Posting a message is the chat.postMessage method, rich layouts use Block Kit blocks with a plain text fallback, and users are matched by email through users.lookupByEmail. Slack pushes workspace activity through the Events API, signing each request with an HMAC-SHA256 header from the signing secret, and your endpoint must return 2xx within three seconds or Slack retries.

What moves between them

The main flow runs from Microsoft Dynamics 365 Business Central into Slack. As purchase invoices, sales invoices, and other finance records are created or changed, ml-connector reads the record after each change signal and posts a Block Kit notification into the matching Slack channel with the vendor or customer, amount, due date, and status. Interactive Approve or Post actions flow the other direction: a Slack button click or event is verified and turned into the Business Central Microsoft.NAV.post bound action that moves a draft invoice to Open. Employee records align the two sides so an approval message can mention the right Slack user. Purchase orders, which have no webhook in Business Central, are polled on a schedule. Slack holds no financial state, so ml-connector never treats it as a system of record.

How ml-connector handles it

ml-connector stores both credential sets encrypted: the Business Central client ID and secret used for the Entra ID client-credentials token, and the Slack bot token. It registers a Business Central subscription per company and answers the mandatory validation handshake by echoing the validationToken, then renews each subscription before the three-day expiry so notifications never lapse. Because a Business Central notification is only a change signal, the connector fetches the named resource over OData before building the Slack message. Outbound posts use chat.postMessage with Block Kit blocks and a plain text fallback, and the connector respects Slack's one-message-per-second-per-channel limit and backs off on a 429 Retry-After. Inbound Slack events and button clicks are verified with the signing secret over the raw body, deduplicated by event_id, and acknowledged within three seconds before the work is queued. Business Central employee emails are resolved to Slack users with lookupByEmail so approval pings land on the right person. Purchase orders, which have no webhook, are polled with a lastModifiedDateTime filter. Throttled calls on either side are retried with exponential backoff, and every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A 150-person specialty distributor runs Microsoft Dynamics 365 Business Central for purchasing, receiving, and accounts payable, and the whole company lives in Slack. Before the integration, every supplier invoice over a threshold sat in Business Central waiting for a manager to log in and approve it, so approvals slipped past due dates and the AP clerk chased people by hand. With Business Central and Slack connected, each invoice that needs sign-off posts into the team's approvals channel with the vendor, amount, and due date, and the manager taps Approve right in Slack. That click posts the invoice in Business Central through the posting action, the channel updates to show it is handled, and late approvals stop being the reason a payment misses its date.

What you can do

  • Post new and changed Business Central purchase and sales invoices into the right Slack channel as Block Kit messages.
  • Let a Slack Approve or Post button trigger the Business Central posting action that moves a draft invoice to Open.
  • Match Business Central employee emails to Slack users with lookupByEmail so approval pings reach the right person.
  • Bridge Business Central Entra ID client-credentials login and the Slack bot token, with signed Slack event verification.
  • Renew Business Central subscriptions before their three-day expiry and poll webhook-less purchase orders on a schedule.

Questions

Which direction does data move between Microsoft Dynamics 365 Business Central and Slack?
The main flow is Business Central into Slack, where invoices and approvals are posted as messages. Interactive actions flow back: a Slack Approve or Post click triggers the Business Central posting action that moves a draft invoice to Open. Slack holds no financial records, so it is never used as a system of record.
Why can Slack only notify and act, not store finance data?
Slack is a communication platform and has no native vendor, invoice, purchase order, or GL account objects. ml-connector uses it as the notification and approval layer: Business Central finance records are posted as Block Kit messages, and Slack button clicks are turned into Business Central posting actions. The financial state always stays in Business Central.
How does the integration handle Business Central webhooks and Slack event verification?
Business Central subscriptions expire every three days and notifications carry only a change signal, so ml-connector renews each subscription before expiry and fetches the record over OData before posting. Incoming Slack events are verified with the signing secret over the raw body, deduplicated by event_id, and acknowledged within three seconds. Purchase orders, which have no Business Central webhook, are polled on a schedule.

Related integrations

Connect Microsoft Dynamics 365 Business Central and Slack

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started