ml-connector
Microsoft Dynamics 365 Business CentralZoho CRM

Microsoft Dynamics 365 Business Central and Zoho CRM integration

Microsoft Dynamics 365 Business Central is the system of record for finance, customers, and inventory. Zoho CRM is where the sales team works leads, accounts, and deals. Connecting the two keeps the customer list, product catalog, and billing history in agreement across both. Customers and items created or changed in Business Central appear as Accounts and Products in Zoho CRM, and posted sales invoices copy across so reps can see what a customer has actually been billed. Business Central stays the financial source of truth; Zoho CRM gets a current, read-aligned view of it.

How Microsoft Dynamics 365 Business Central works

Microsoft Dynamics 365 Business Central exposes customers, items, vendors, sales orders, posted sales invoices, GL accounts, and dimensions through the Business Central API v2.0, a REST surface built on OData v4 with JSON payloads. All entity paths nest under a specific company, and the environment name (such as production) is part of the base URL. Authentication is OAuth 2.0 client credentials against Microsoft Entra ID, so the connector runs unattended with no signed-in user. Business Central supports push webhooks through a subscription API: notifications carry the change type and resource but no record data, expire after 3 days, and are verified with a clientState shared secret rather than an HMAC signature.

How Zoho CRM works

Zoho CRM exposes Accounts, Contacts, Products, Invoices, Sales Orders, Quotes, and Vendors through its REST API v8 over JSON. Each call uses an OAuth 2.0 bearer token whose access token lasts one hour and is refreshed from a long-lived refresh token, and the API base URL must come from the api_domain field in the token response because the org may live in any of seven datacenters. Zoho pushes notifications through a watch channel that carries only record IDs, expires in about a day, and is verified with a token string echoed in the body. The financial modules used here, including Invoices and Products, require a Professional plan or above.

What moves between them

The main flow runs from Microsoft Dynamics 365 Business Central into Zoho CRM. Customers sync into Zoho Accounts, and items sync into Zoho Products, keyed on the stable Business Central number field. Posted sales invoices copy from Business Central into Zoho Invoices, with header totals and line items mapped into the Invoiced_Items subform, so reps see real billing against the matching Account. Contact details captured against a Business Central customer can also populate Zoho Contacts. Money is recorded in Business Central, so Zoho CRM is treated as a read-aligned destination for financial records; sales and inventory accounting are never written back from Zoho into Business Central.

How ml-connector handles it

ml-connector stores both credential sets encrypted. For Business Central it requests an Entra ID client-credentials token against the tenant and the api.businesscentral.dynamics.com/.default scope, then builds the company-scoped base URL from the stored environment name. For Zoho CRM it exchanges the refresh token for an access token roughly five minutes before the hour expires and always reads the api_domain from the token response to hit the right datacenter. Matching is by business key: a Business Central customer number maps to a Zoho Account, and an item number maps to a Zoho Product, with the Upsert API and a duplicate-check field preventing double records. Change capture uses webhooks on both sides plus a fallback poll, since neither system sends record data in its notification: ml-connector receives the change signal, then fetches the full record by ID. Because Business Central subscriptions lapse after 3 days and Zoho watch channels after about a day, a scheduled job renews both before they expire. Business Central purchase orders are not webhook-eligible, so any PO-related sync falls back to polling with a lastModifiedDateTime filter. Zoho daily API credits and Business Central rate limits both return HTTP 429, so calls back off and retry, large initial loads use Zoho bulk write, and every record carries an audit trail and can be replayed if a downstream call fails.

A real-world example

A mid-sized industrial supplies distributor with about 90 staff runs Microsoft Dynamics 365 Business Central for finance, inventory, and invoicing, while its outside sales team lives in Zoho CRM. Before the integration, a rep on a customer call could not see whether an open invoice had been paid without messaging accounting, and new accounts were typed into both systems with mismatched names and addresses. With the two connected, every customer and product in Business Central appears in Zoho CRM, and each posted invoice copies across automatically, so reps see current balances and billing history beside the deal. Duplicate data entry stops, and the sales conversation is finally backed by the same numbers the finance team sees.

What you can do

  • Sync Microsoft Dynamics 365 Business Central customers into Zoho CRM Accounts, keyed on the BC customer number.
  • Push Business Central items into Zoho Products so quotes and orders reference a current catalog.
  • Copy posted Business Central sales invoices into Zoho CRM, mapping line items into the invoice subform.
  • Bridge Entra ID client-credentials auth on Business Central with the refreshing Zoho OAuth token and correct datacenter.
  • Renew both webhook subscriptions before they expire and fall back to polling, with retries and a full audit trail.

Questions

Which direction does data move between Microsoft Dynamics 365 Business Central and Zoho CRM?
The main flow is Business Central into Zoho CRM. Customers, items, and posted sales invoices move from Business Central into Zoho Accounts, Products, and Invoices. Business Central is the financial source of record, so ml-connector treats Zoho CRM as a read-aligned destination and does not write sales or inventory accounting back into Business Central.
How does the integration keep up with changes when neither system sends record data in its notification?
Both Business Central and Zoho CRM webhooks carry only a change signal and the record ID, not the record itself. ml-connector receives the notification, then fetches the full record by ID from the source. Business Central subscriptions expire after 3 days and Zoho watch channels after about a day, so a scheduled job renews both before they lapse, and a periodic poll backfills anything a webhook missed.
Does the Zoho CRM datacenter and plan matter for this connection?
Yes. A Zoho org can live in any of seven datacenters, so ml-connector always reads the api_domain returned in the OAuth token response rather than assuming a fixed URL. The Invoices and Products modules used in this sync require a Zoho CRM Professional plan or above, so edition is verified before those flows are enabled.

Related integrations

Connect Microsoft Dynamics 365 Business Central and Zoho CRM

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

Get started