ml-connector
Microsoft Dynamics 365 Business CentralServiceNow

Microsoft Dynamics 365 Business Central and ServiceNow integration

Microsoft Dynamics 365 Business Central runs finance, purchasing, and inventory, while ServiceNow runs the procurement and accounts payable workflow through its Source-to-Pay Operations suite. This connection keeps the two in agreement so buyers and AP staff work in ServiceNow against vendor, account, and cost center masters that come from Business Central, and the purchase orders and approved invoices they produce post back into Business Central without re-keying. ml-connector handles the very different APIs on each side and moves the records on a schedule you control. Because the chart of accounts and posted ledger live in Business Central, that system stays the financial system of record.

How Microsoft Dynamics 365 Business Central works

Microsoft Dynamics 365 Business Central exposes vendors, customers, purchase invoices, purchase orders, sales invoices, GL accounts, general ledger entries, dimensions, items, and employees through its REST API v2.0, built on OData v4, with every resource scoped under a company id and a named environment in the URL. It authenticates with OAuth 2.0 client credentials against Microsoft Entra ID using an app registration, and supports incremental reads by filtering on lastModifiedDateTime. It also offers push notifications through a subscription API that signals what changed without the data, expires after three days, and does not cover purchase orders, so those are read by polling.

How ServiceNow works

ServiceNow runs each customer on an isolated instance at its own subdomain, and its Source-to-Pay Operations suite stores vendors in core_company, purchase orders in proc_po, accounts payable invoices in sn_apo_invoice, GL accounts in itfm_gl_accounts, and cost centers in cmn_cost_center, all reached through the Table API with JSON payloads. It authenticates with OAuth 2.0 client credentials when an admin has enabled that grant, or basic auth as a fallback, and tokens expire after about thirty minutes. ServiceNow has no registerable outbound webhook system, so the connector reads on a schedule using the sys_updated_on field, and bulk loads go through Import Set staging tables with a coalesce field for upsert.

What moves between them

Master data flows from Microsoft Dynamics 365 Business Central into ServiceNow: vendors, GL accounts, dimensions used as cost centers, and items are pushed into the Source-to-Pay staging tables so procurement and accounts payable staff work against current records. Transactional data flows back the other way: purchase orders raised in ServiceNow proc_po and invoices approved in sn_apo_invoice are read and created in Business Central as purchase orders and draft purchase invoices, then posted. Reference data is aligned first so every ServiceNow line resolves to a valid Business Central vendor, account, and dimension. The posted ledger stays in Business Central, so ml-connector never writes general ledger entries into ServiceNow.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the Business Central side it requests an Entra ID client credentials token for the api.businesscentral.dynamics.com scope and builds the base URL from the stored environment name and company id. On the ServiceNow side it requests an OAuth token from the instance oauth_token.do endpoint, refreshes it before the roughly thirty minute expiry, and falls back to basic auth where the client credentials grant is not enabled. It subscribes to Business Central change notifications for vendors, accounts, and invoices, answers the mandatory validation handshake, renews each subscription before the three day expiry, and fetches the changed record because the notification carries no data. Purchase orders are not webhook eligible in Business Central, so they are polled with a lastModifiedDateTime filter. ServiceNow has no registerable webhook at all, so its tables are polled with a sys_updated_on query, or an admin-configured Business Rule and Outbound REST Message can push as an optional trigger. Vendors, GL accounts, and cost centers are mapped first so postings land on valid dimensions. Neither system offers an idempotency key header, so ml-connector dedupes on the Business Central document number and the ServiceNow sys_id with a BullMQ jobId, and bulk loads into ServiceNow use Import Set coalesce so a re-read does not create duplicates. HTTP 429 on either side triggers backoff with jitter, and every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A mid-sized facilities services company with about six hundred staff runs Microsoft Dynamics 365 Business Central for finance and purchasing, and adopted the ServiceNow Source-to-Pay suite so site managers could raise purchase requests and approve supplier invoices in the same portal they already used for IT and facilities tickets. Before the integration, a finance clerk re-keyed every approved ServiceNow purchase order and invoice into Business Central, and kept a spreadsheet of vendor numbers and cost centers to stop the two systems drifting apart. With the two systems connected, vendors, GL accounts, and cost centers flow from Business Central into ServiceNow so buyers pick from real values, and each approved purchase order and invoice posts back into Business Central within the polling window. The manual re-keying is gone and the vendor master no longer disagrees between the two systems.

What you can do

  • Push Microsoft Dynamics 365 Business Central vendors, GL accounts, and dimensions into the ServiceNow Source-to-Pay staging tables.
  • Read ServiceNow purchase orders and approved AP invoices and create them in Business Central as purchase orders and posted invoices.
  • Map ServiceNow cost centers and vendors to Business Central dimensions and vendor numbers so postings land on valid accounts.
  • Authenticate Business Central with Entra ID client credentials and ServiceNow with OAuth or basic auth on the customer instance.
  • React to Business Central change subscriptions and poll ServiceNow on a schedule, with dedup, retries, and a full audit trail on every record.

Questions

Which direction does data move between Microsoft Dynamics 365 Business Central and ServiceNow?
Both directions, by record type. Vendors, GL accounts, dimensions, and items flow from Business Central into the ServiceNow Source-to-Pay staging tables so procurement staff work against current masters. Purchase orders and approved invoices flow back from ServiceNow into Business Central as purchase orders and posted invoices. The posted general ledger stays in Business Central, so ml-connector never writes ledger entries into ServiceNow.
Does ServiceNow push changes, or does ml-connector poll for them?
ml-connector polls ServiceNow by default. ServiceNow has no registerable outbound webhook system, so the connector reads its tables on a schedule using a sys_updated_on query to fetch only what changed. A ServiceNow admin can optionally configure a Business Rule and an Outbound REST Message to push to the connector for near real time delivery, which is documented as an add-on rather than the default.
How does the integration handle Business Central webhooks and its three day subscription expiry?
ml-connector subscribes to Business Central change notifications for vendors, accounts, and invoices, answers the required validation handshake, and renews each subscription before its three day expiry so notifications never lapse. Because a notification only signals what changed and carries no data, the connector fetches the changed record afterward. Purchase orders are not webhook eligible in Business Central, so those are read by polling on a lastModifiedDateTime filter.

Related integrations

Connect Microsoft Dynamics 365 Business Central and ServiceNow

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

Get started