Microsoft Dynamics 365 Business Central and Zuora integration
Microsoft Dynamics 365 Business Central runs your finance, receivables, and general ledger. Zuora runs your subscription billing and revenue. Connecting the two brings posted invoices, payments, and credit memos from Zuora into Business Central as sales invoices and customer payments without manual re-entry. Billing accounts in Zuora map to customers in Business Central, so the recurring revenue you bill and the ledger you close on stay in agreement. ml-connector handles the very different APIs on each side and moves the data on the schedule and webhook triggers you control.
What moves between them
The main flow runs from Zuora into Microsoft Dynamics 365 Business Central. After each billing run, ml-connector reads posted Zuora invoices, payments, and credit memos and writes them into Business Central as sales invoices, customer payment journal lines, and sales credit memos against the matching customer and GL accounts. Billing accounts move the same direction so the Business Central customer master reflects new and changed Zuora accounts. Reference data such as currency codes and account mappings is aligned so each billing document lands on a valid Business Central customer and account. Posted ledger and receivable documents are not written back into Zuora, which remains the subscription billing system of record.
How ml-connector handles it
ml-connector stores both credential sets encrypted. On the Zuora side it runs the client-credentials grant against the tenant base URL for the customer region, then caches and reuses the one-hour bearer token so it does not trip the lower AUTH rate limit, refreshing it shortly before expiry. On the Business Central side it mints an Entra ID token, then targets the named environment and company id, building every resource path under that company. It subscribes to Zuora callout notifications for Invoice Posted, Payment Processed, and credit memo events; because a callout carries only an object id, it re-fetches the full record from Zuora before writing, and where an HMAC header is configured it verifies the signature first. Zuora payment notifications fire for electronic payments only, so external or manual payments are picked up on a scheduled poll instead. Zuora accounts map to Business Central customers by account number, posted Zuora invoices become Business Central sales invoices created as drafts and then posted with the Microsoft.NAV.post bound action, and Zuora payments become customer payment journal lines applied to the matching invoice. Both APIs return HTTP 429 under load, so ml-connector reads Zuora rate-limit headers and backs off against Business Central's per-environment limits. Zuora accepts an idempotency-key on writes, while Business Central has none, so ml-connector checks for an existing document by the invoice number before creating one, carries a stable BullMQ jobId, and deduplicates callout ids. Every record carries a full audit trail and can be replayed if a downstream call fails.
A real-world example
A B2B software company with around 200 employees bills several thousand customers through Zuora on monthly and annual subscriptions, and runs Microsoft Dynamics 365 Business Central for finance and accounting. Before the integration, the finance team exported invoice and payment registers from Zuora each period and re-keyed the revenue totals into Business Central by hand, then spent the first days of close chasing differences between billed revenue in Zuora and the receivable and ledger balances. With Business Central and Zuora connected, each billing run's posted invoices, payments, and credit memos flow into Business Central automatically against the right customers and GL accounts, and account changes keep both customer masters aligned. Close starts with revenue and receivables already reconciled, and the manual re-keying step is gone.
What you can do
- Post Zuora invoices and payments into Microsoft Dynamics 365 Business Central as sales invoices and customer payment journal lines after every billing run.
- Keep the Business Central customer master aligned with new and changed Zuora billing accounts.
- Bring Zuora credit memos into Business Central as sales credit memos so adjustments reach the ledger, where the Invoice Settlement feature is enabled.
- Bridge Zuora client-credentials OAuth and Microsoft Entra ID tokens, mapping currencies and accounts so each document lands on a valid customer.
- Trigger on Zuora HMAC callout notifications with event re-fetch, or poll on a schedule, with retries and a full audit trail on every record.
Questions
- Which direction does data move between Microsoft Dynamics 365 Business Central and Zuora?
- The main flow is Zuora into Business Central. Posted invoices, payments, and credit memos move from Zuora into Business Central as sales invoices, customer payments, and sales credit memos, and billing accounts flow the same direction to keep the customer master aligned. Zuora stays the subscription billing system of record, so ml-connector does not write posted ledger documents back into Zuora.
- How does the integration handle Zuora callout notifications and their minimal payload?
- Zuora callout notifications usually carry only the event object id, not the full record. ml-connector verifies the HMAC signature where it is configured, then re-fetches the invoice, payment, or credit memo from Zuora by id before writing anything to Business Central. Callout ids are deduplicated, and because payment notifications fire for electronic payments only, external payments are caught on a scheduled poll instead.
- How does ml-connector deal with Zuora token reuse and the Business Central invoice posting flow?
- Zuora bearer tokens expire after one hour and the token endpoint has a strict per-IP limit, so ml-connector caches and reuses each token and refreshes it just before expiry rather than requesting one per call. On the Business Central side a sales invoice is created as a draft and then posted with the Microsoft.NAV.post bound action, since posting is a separate step. Because Business Central has no idempotency-key header, the connector checks for an existing invoice by number before creating one and carries a stable job id so a retry never posts a duplicate.
Related integrations
More Microsoft Dynamics 365 Business Central integrations
Other systems that connect to Zuora
Connect Microsoft Dynamics 365 Business Central and Zuora
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started