ml-connector
Sage IntacctMicrosoft Dynamics 365 Sales

Sage Intacct and Microsoft Dynamics 365 Sales integration

Sage Intacct handles your accounting and GL. Dynamics 365 Sales drives your pipeline and quotes. Connecting them keeps customer master records, quotes, and sales order totals aligned between sales and accounting. New accounts and contacts in Dynamics 365 populate as customers or vendors in Intacct, and every quote-to-order conversion flows GL values into Intacct's dimensions so accounting sees the same revenue and cost data that sales entered. ml-connector manages the very different APIs on each side: XML on Intacct, REST on Dynamics 365, and the session caching and OAuth token refresh that keep both systems talking.

How Sage Intacct works

Sage Intacct is a cloud-based ERP and accounting system accessed through a single XML gateway endpoint at https://api.intacct.com/ia/xml/xmlgw.phtml. Authentication is session-based: an initial getAPISession call exchanges partner credentials and user credentials for a sessionid, cached for 50 minutes per company and user combination. Once authenticated, all operations serialize through XML POST requests to the same gateway endpoint. Intacct publishes vendors, AP bills, payments, GL accounts, and dimensions as writable entities. Intacct does not support webhooks; all data flows are polling-driven or manually triggered on a schedule you control. Session tokens expire after 50 minutes and are automatically refreshed on the next call.

How Microsoft Dynamics 365 Sales works

Microsoft Dynamics 365 Sales is a cloud-based CRM application built on Microsoft Dataverse. It is accessed via REST APIs (OData v4.0) at https://{org-name}.api.crm.dynamics.com/api/data/v9.2/. Authentication uses OAuth 2.0 via Microsoft Entra ID, with tokens expiring in approximately 60 minutes. Dynamics 365 Sales exposes accounts, contacts, leads, opportunities, quotes, sales orders, invoices, and products. Webhook delivery is supported through the Dataverse Event Framework for Create, Update, Delete, Assign, SetState, and custom actions, with a 256 KB payload size limit and automatic 60-second timeout with one retry for 502/503/504 errors. Dynamics 365 Sales does not include GL accounts, AP or AR ledger entries, or vendor records; those features require Dynamics 365 Finance or Business Central.

What moves between them

The main flow runs from Dynamics 365 Sales into Sage Intacct. Customer account and contact records flow from Dynamics 365 into Intacct as customers or vendors, syncing display names, addresses, and tax IDs. Quotes created in Dynamics 365 are read by ml-connector and stored in Intacct as reference records. When a quote is won and converted to a sales order in Dynamics 365, the order total flows into Intacct as a GL entry allocated to the correct GL account and dimension (such as cost center or project). Reference data such as products and price levels are synchronized in both directions so Dynamics 365 sales prices remain consistent with Intacct product master. Intacct GL accounts and dimensions are read-only from the Dynamics 365 side; ml-connector never writes to Intacct's chart of accounts.

How ml-connector handles it

ml-connector stores Sage Intacct session credentials and Microsoft Entra ID client credentials encrypted, managing session caching on the Intacct side to avoid redundant getAPISession calls within the 50-minute window. Each request serializes XML operations for Intacct, handling forbidden C0 control characters by stripping them before entity reference encoding. OAuth tokens for Dynamics 365 are refreshed when any call returns a 401, ensuring continuous access without manual intervention. Dynamics 365 webhooks notify ml-connector of quote and sales order changes when available; for Intacct, all reads are polling-driven on a schedule you define. Customer records sync first so every sales order references a vendor that exists in Intacct; ml-connector maps Dynamics 365 account and contact fields to Intacct VENDOR and CUSTOMER dimensions. GL postings use the Intacct uniqueid flag for server-side deduplication so retried operations do not double-post. Every record carries a full audit trail, and failed syncs are queued for replay once connectivity is restored.

A real-world example

A B2B software company runs Dynamics 365 Sales for pipeline management across four sales regions and Sage Intacct for accounting and GL. Before the integration, the finance team received weekly quote reports from sales and manually entered customer names and order totals into Intacct as GL entries, often missing updates when quotes were revised or lost. Month-end close required reconciliation between the Dynamics 365 pipeline value and what actually posted to the revenue GL accounts. With Dynamics 365 and Sage Intacct connected, every quote-to-order transition in sales automatically populates a corresponding vendor record and GL posting in Intacct. Customer master records stay in sync, and GL values flow in real time so the accounting team sees current pipeline impact without manual entry or reconciliation work.

What you can do

  • Sync Dynamics 365 accounts and contacts into Sage Intacct as customers and vendors with addresses and tax IDs.
  • Post Dynamics 365 sales order totals into Intacct GL accounts allocated to the correct dimensions and cost centers.
  • Maintain product master and price list alignment between Dynamics 365 and Intacct so quotes reflect current pricing.
  • Authenticate Intacct with session-based XML credentials and Dynamics 365 with OAuth 2.0, managing token expiry and session caching.
  • Poll for Dynamics 365 changes on your schedule, with full audit trails and deduplication for failed-and-retried operations.

Questions

Which direction does data move between Sage Intacct and Dynamics 365 Sales?
The primary flow is Dynamics 365 into Sage Intacct. Customer accounts and contacts sync from Dynamics 365 into Intacct, and sales orders and their GL impact flow the same direction. Product and price data aligns in both directions so Dynamics 365 quotes stay current with Intacct product master. Intacct GL accounts and dimensions are read-only from the Dynamics 365 side; ml-connector never writes back to Intacct's chart of accounts.
How does ml-connector handle Sage Intacct's XML gateway and 50-minute session limit?
ml-connector caches the sessionid from Intacct's getAPISession call for the full 50-minute window, avoiding redundant authentication calls. All operations serialize as XML POST requests to the single gateway endpoint. Sessions are keyed on company and user, so ml-connector maintains separate session caches per tenant. When a session expires, the next operation automatically triggers a fresh getAPISession call and continues without interruption.
Does Sage Intacct have webhook support, or is ml-connector polling only?
Sage Intacct does not publish webhooks; ml-connector polls Intacct on a schedule you define to pull vendor, customer, and GL account changes. Dynamics 365 Sales supports webhooks through the Dataverse Event Framework, so ml-connector can listen for quote and sales order events in real time, or fall back to polling if webhooks are not enabled in your Dynamics 365 environment.

Related integrations

Connect Sage Intacct and Microsoft Dynamics 365 Sales

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

Get started