ml-connector
Microsoft Dynamics 365 Business CentralJAGGAER

Microsoft Dynamics 365 Business Central and JAGGAER integration

Microsoft Dynamics 365 Business Central runs finance, purchasing, and accounts payable. JAGGAER runs sourcing, purchasing, supplier management, and invoice automation. Connecting the two means the supplier invoices captured in JAGGAER flow into Business Central for matching and AP posting, while the vendor master and chart of accounts stay aligned so procurement always codes to real finance records. ml-connector handles the very different APIs on each side and moves the data on a schedule you control. Because JAGGAER reads GL accounts for coding but does not write them, and payment status is read only on its side, the ledger and posting stay in Business Central where they belong.

How Microsoft Dynamics 365 Business Central works

Microsoft Dynamics 365 Business Central exposes vendors, purchase invoices, purchase orders, GL accounts, dimensions, and items through the Business Central API v2.0, a REST API built on OData v4. It authenticates with Microsoft Entra OAuth2 client credentials in a service-to-service flow, and the tenant ID and environment name are part of the base URL, so there is no single shared hostname. Most resources support push webhooks through a subscription API, but the notifications are change signals only and the record must be fetched afterward, subscriptions expire every three days, and purchase orders are not webhook enabled. GL accounts and general ledger entries are read only through the API, and draft purchase invoices stay drafts until the bound Microsoft.NAV.post action posts them.

How JAGGAER works

JAGGAER ONE is a Source-to-Pay platform, and its J1P Public API exposes invoices, purchase orders, suppliers, chart-of-account coding, custom fields, contracts, and catalog items over REST with JSON payloads. It authenticates with OAuth2 client credentials against a Keycloak endpoint in the fixed realm J1p-integrations, on a tenant-specific host that must be captured as a credential, and the access token expires in about one hour. Invoices are read at /ji/v1/invoices/{id} and imported through /ji/v1/invoices/ocr/, GL accounts are imported for coding but not written, and payment status is read only back to the supplier. JAGGAER claims an event-driven push mode but does not document it publicly, so the J1P API is treated as poll only, while supplier-side PO delivery and invoice receipt can also run over cXML.

What moves between them

The main flow runs from JAGGAER into Microsoft Dynamics 365 Business Central. ml-connector reads the supplier invoices captured in JAGGAER through the J1P invoice endpoint and posts them into Business Central as draft purchase invoices, mapped to the matching vendors, GL accounts, and dimensions. Master data flows the other direction: Business Central vendors and the chart of accounts are pushed into JAGGAER so suppliers and accounting codes line up with the finance system. Purchase orders are kept aligned so an invoice in JAGGAER references a Business Central purchase order, and JAGGAER payment status reflects what has been paid in Business Central. GL accounts are read only in Business Central and JAGGAER does not write GL accounts or payment records, so the ledger stays in Business Central and ml-connector never writes financial entries back into JAGGAER.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the JAGGAER side it requests an OAuth2 client credentials token from the Keycloak realm J1p-integrations on the customer host, caches it, and refreshes it before the roughly one hour expiry. On the Business Central side it runs the Entra client credentials flow against the api.businesscentral.dynamics.com scope and builds the base URL from the stored tenant and environment name, since BC publishes no shared host. Because the J1P API has no publicly documented webhook, ml-connector polls JAGGAER invoices on a schedule rather than waiting for a push, and reads each invoice header and its line items by id. Vendors and GL accounts are mapped first, so every imported invoice line references a Business Central vendor and account that already exist, and the purchase order reference is carried so JAGGAER matching and the Business Central document line up. Business Central draft purchase invoices are not posted automatically; ml-connector creates them as drafts and leaves the Microsoft.NAV.post action to a controlled step so nothing posts to the ledger unreviewed. Business Central has no idempotency key header and JAGGAER deduplicates on the supplier invoice number, so ml-connector filters on the document number before creating a record and uses a stable BullMQ jobId built from the JAGGAER invoice id to avoid double booking a re-read invoice. Where Business Central webhooks fire on a vendor or invoice change, ml-connector takes the signal, fetches the changed record, and renews the three day subscription before it expires. Every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A mid-sized manufacturer with around 700 employees runs Microsoft Dynamics 365 Business Central for finance and accounts payable and uses JAGGAER for sourcing, purchasing, and invoice capture across several sites. Before the integration, buyers raised purchase orders and suppliers submitted invoices in JAGGAER, then an AP clerk rekeyed each approved invoice into Business Central, which meant invoices sat for days, GL coding was sometimes wrong, and the supplier list in JAGGAER drifted out of step with the finance system. With Microsoft Dynamics 365 Business Central and JAGGAER connected, each captured invoice lands in Business Central within the polling window as a draft for review, coded to the right vendor and dimension and matched to its purchase order, while new vendors and account changes in Business Central appear in JAGGAER automatically. The rekeying step is gone and AP starts from records that already reconcile.

What you can do

  • Pull supplier invoices captured in JAGGAER through the J1P invoice endpoint and post them into Microsoft Dynamics 365 Business Central as draft purchase invoices.
  • Push the Business Central vendor master and chart of accounts into JAGGAER so suppliers and procurement coding stay aligned with finance.
  • Match each JAGGAER invoice to its Business Central purchase order and report payment status back to JAGGAER.
  • Bridge Entra OAuth2 and the environment URL on the Business Central side with the JAGGAER Keycloak token from the J1p-integrations realm.
  • Poll JAGGAER on a schedule with document number and jobId dedup, retries, and a full audit trail on every record.

Questions

Which direction does data move between Microsoft Dynamics 365 Business Central and JAGGAER?
The main flow is JAGGAER into Microsoft Dynamics 365 Business Central. Captured supplier invoices move from JAGGAER into Business Central as draft purchase invoices, while the Business Central vendor master and chart of accounts are pushed back into JAGGAER. JAGGAER reads GL accounts for coding but does not write them and its payment status is read only, so the ledger stays in Business Central and ml-connector never writes financial entries back into JAGGAER.
Does JAGGAER push invoices, or does ml-connector poll for them?
ml-connector polls. JAGGAER claims an event-driven push mode for its J1P API but does not document it publicly, so it is treated as poll only until JAGGAER professional services configures event delivery for the tenant. ml-connector reads invoices from the J1P invoice endpoint on a schedule you control and tracks the last processed invoice so each run only picks up new captures.
How does the integration bridge the two different authentication models?
ml-connector handles both. On the Business Central side it runs the Microsoft Entra OAuth2 client credentials flow and builds the base URL from the stored tenant and environment name, since BC has no shared host. On the JAGGAER side it requests a client credentials token from the Keycloak realm J1p-integrations on the customer-specific host and refreshes it before the roughly one hour expiry.

Related integrations

Connect Microsoft Dynamics 365 Business Central and JAGGAER

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

Get started