Acumatica and Microsoft Dynamics 365 Sales integration
Acumatica runs finance, inventory, and order processing. Microsoft Dynamics 365 Sales runs the sales pipeline and customer relationships. Connecting them keeps the customer list, product catalog, and order-to-cash records in agreement so sales reps quote against real items and finance receives orders without re-keying. Acumatica stays the system of record for posting, since Dynamics 365 Sales has no general ledger. ml-connector moves the records between two very different APIs on a schedule you control, or in near real time where event triggers are configured.
What moves between them
Customer and item reference data moves from Acumatica into Dynamics 365 Sales, so accounts and the product catalog in the CRM reflect the ERP master. When an opportunity is won and a quote is converted in Dynamics, the resulting sales order, and the invoice where one is raised, flows back into Acumatica as a SalesOrder or SalesInvoice against the matched customer. Customer and item codes are aligned in both directions so every order line references a record that already exists on the other side. General ledger accounts, AP bills, and vendors stay inside Acumatica and are never written into Dynamics, because the Sales module has no accounting ledger. Cadence is scheduled polling, with event triggers used where they are configured.
How ml-connector handles it
ml-connector stores both credential sets encrypted and holds two separate OAuth tokens. On the Acumatica side it accepts the full instance URL and the endpoint version per customer, since Acumatica publishes no shared base URL and a version mismatch returns 404, and it wraps every field value in the required value object. On the Dynamics side it builds the Entra ID scope from the environment URL, refreshes the bearer token on its roughly 60-minute expiry, and uses PATCH for updates with ETags for safe concurrency. Acumatica customers map to Dynamics accounts and Acumatica items map to Dynamics products; Dynamics sales orders and invoices map back to Acumatica SalesOrder and SalesInvoice. For change detection it prefers Dataverse delta tokens and Acumatica LastModifiedDateTime filters, and consumes webhook events where Push Notifications or Dataverse steps are registered. Neither side signs payloads with HMAC, so shared-secret headers are validated on inbound events. Both APIs return HTTP 429 under load, Acumatica from license-tier throttling and Dynamics from its five-minute service protection window with a Retry-After header, so ml-connector backs off and respects the wait. Because Acumatica has no idempotency key, it checks for an existing record by natural key, such as the customer code or order reference, before creating, so retries do not duplicate orders. Every record carries a full audit trail and can be replayed if a downstream call fails.
A real-world example
A mid-sized industrial equipment distributor with around 200 staff runs Acumatica for inventory, order processing, and finance, while the outside sales team works deals in Microsoft Dynamics 365 Sales. Before the integration, reps quoted from a stale spreadsheet of part numbers and prices, and every won deal was re-typed into Acumatica by an order desk, which introduced wrong item codes and delayed shipments. With the two systems connected, the Acumatica item catalog and customer list flow into Dynamics so reps quote against live products, and each won order writes straight into Acumatica as a sales order on the correct customer. The order desk stops re-keying, item-code errors drop, and finance sees new orders the same day they close.
What you can do
- Push Acumatica customers and items into Microsoft Dynamics 365 Sales as accounts and products so reps quote against live data.
- Write won Dynamics sales orders and invoices back into Acumatica as SalesOrder and SalesInvoice records against the matched customer.
- Map customer and item codes on both sides so every order line references a record that already exists.
- Bridge Acumatica OAuth and the Microsoft Entra ID client-credentials token, refreshing each before it expires.
- Detect changes with Dataverse delta tokens and Acumatica LastModifiedDateTime, with retries and a full audit trail on every record.
Questions
- Which direction does data move between Acumatica and Microsoft Dynamics 365 Sales?
- Customers and items move from Acumatica into Dynamics so the CRM reflects the ERP master, and won sales orders and invoices move from Dynamics back into Acumatica. Customer and item codes are aligned in both directions. Acumatica remains the system of record for posting, since Dynamics 365 Sales has no general ledger.
- Can Microsoft Dynamics 365 Sales hold the accounting entries from Acumatica?
- No. Dynamics 365 Sales runs on Dataverse and does not include GL accounts, AP or AR ledger entries, or vendor records, which live in Dynamics 365 Finance or Business Central instead. ml-connector keeps all general ledger and AP activity inside Acumatica and syncs only the shared order-to-cash records: customers, products, sales orders, and invoices.
- How does the integration bridge the two different authentication systems?
- Acumatica uses OAuth against its own per-instance identity server with a version-locked endpoint URL, while Dynamics uses OAuth client credentials through Microsoft Entra ID with a scope built from the environment URL. ml-connector stores both credential sets encrypted, holds a separate token for each system, and refreshes them on their own expiry. It also respects each API rate limit with backoff so neither side is overrun.
Related integrations
More Acumatica integrations
Other systems that connect to Microsoft Dynamics 365 Sales
Connect Acumatica and Microsoft Dynamics 365 Sales
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started