ml-connector
Sage X3Microsoft Dynamics 365 Sales

Sage X3 and Microsoft Dynamics 365 Sales integration

Sage X3 runs procurement, inventory, and finance. Dynamics 365 Sales manages the sales pipeline and customer relationships. Connecting them keeps your customer master and product catalog in sync across systems, and sales opportunities and quotes from Dynamics 365 flow back into Sage X3 so the ERP has visibility into the sales process. ml-connector bridges the very different APIs and authentication schemes on each side and moves data on a schedule you control.

How Sage X3 works

Sage X3 on-premise and cloud instances expose suppliers, customers, purchase orders, sales invoices, GL accounts, and products through REST (api1 legacy or preferred endpoint) and GraphQL (Xtrem) APIs. Authentication uses OAuth2 client credentials (JWT bearer) for GraphQL or HTTP Basic Authentication for the REST api1 path, with access tokens valid for five minutes and refresh tokens for thirty days. Because Sage X3 has no native webhook system, records are read by polling with delta detection against updatedDate and modifiedDateTime fields. The server URL, port, and X3 folder name are customer-specific with no central tenant registry, and the REST api1 endpoint uses a default page size of twenty records.

How Microsoft Dynamics 365 Sales works

Microsoft Dynamics 365 Sales exposes accounts, contacts, leads, opportunities, quotes, and orders through the OData v4.0 REST API at https://{org-name}.api.crm.dynamics.com/api/data/v9.2/. Authentication uses OAuth 2.0 via Microsoft Entra ID with client credentials flow for server-to-server integrations. Dynamics 365 supports webhooks via the Dataverse Event Framework for Create, Update, Delete, Assign, SetState, and sales-specific actions like QualifyLead and ConvertQuoteToSalesOrder, with a 256 KB payload size limit and 60-second timeout plus one automatic retry. Webhook signatures use a shared secret rather than HMAC, and OAuth tokens expire in approximately sixty minutes.

What moves between them

Customer and supplier master records flow from Sage X3 into Dynamics 365 Sales as accounts, mapped by their external identifiers. Product and pricing data move the same direction so the sales team quotes from an accurate catalog. Opportunities and quotes created in Dynamics 365 Sales flow back into Sage X3 as sales order headers so the ERP can plan procurement and fulfill customer demand. Changes are detected by polling Sage X3 on a schedule you define and by receiving Dynamics 365 webhook events for quote and opportunity updates, so the integration combines push and pull mechanisms.

How ml-connector handles it

ml-connector stores both credential sets encrypted and handles the different authentication models on each side: it refreshes Sage X3 access tokens when they expire in five minutes and maintains Entra ID bearer tokens for Dynamics 365. Because Sage X3 requires a customer-specific server URL and folder name, ml-connector accepts these per customer and polls the configured endpoint at a schedule you define. Customers and suppliers are mapped to Dynamics 365 accounts via an external identifier so the same entity always maps to the same record on repeat runs. Dynamics 365 webhook events for quote and opportunity changes trigger immediate order creation in Sage X3 rather than waiting for the next poll cycle. Products are mapped by SKU and prices aligned to the Dynamics 365 price level tied to each customer. Webhook payloads are validated against the Dataverse Event Framework shared secret, and every record carries a full audit trail so failed syncs can be replayed after the root cause is fixed.

A real-world example

A mid-sized manufacturing distributor runs Sage X3 for inventory, procurement, and financial accounting across three regional warehouses. Sales teams use Dynamics 365 Sales to track customer interactions and build quotes. Before integration, the sales team created quotes in Dynamics 365 but the order never reached the ERP until the customer sent a PO and finance manually entered it into Sage X3, creating delay and duplicate data entry. New customers entered in Dynamics 365 required manual master data setup in Sage X3 before the first order could be fulfilled. With Dynamics 365 Sales and Sage X3 connected, every new account in Dynamics 365 syncs to Sage X3's customer master immediately, quotes created by the sales team flow into Sage X3 as draft orders that procurement can plan against, and product prices are always current because they sync nightly. The process cuts three days out of the quote-to-order-to-fulfillment cycle.

What you can do

  • Sync Sage X3 customers and suppliers into Dynamics 365 Sales as accounts and keep them in one-way sync on a scheduled interval.
  • Map Sage X3 products and price lists into Dynamics 365 Sales so the sales team quotes from the current catalog.
  • Flow Dynamics 365 opportunities and quotes back into Sage X3 as sales orders so procurement and fulfillment teams see the sales pipeline.
  • Handle Sage X3 token expiry and Entra ID authentication, validate Dynamics 365 webhook signatures, and poll Sage X3 on a schedule you control.
  • Maintain a full audit trail on every customer, product, and order record, with retry and replay on failure.

Questions

Which direction does data move between Sage X3 and Dynamics 365 Sales?
Customer and supplier master data and products flow from Sage X3 into Dynamics 365 Sales as accounts and products. Opportunities and quotes created in Dynamics 365 flow back into Sage X3 as sales orders. Price updates flow one-way from Sage X3 to Dynamics 365 so quotes are always based on current pricing.
How does the integration handle Sage X3's lack of native webhooks?
ml-connector polls Sage X3 on a schedule you define, checking the updatedDate field on customers, suppliers, and products to detect changes since the last run. This approach avoids the need for Sage X3 webhooks and works equally well for on-premise and cloud instances. Dynamics 365 webhook events for quotes and opportunities trigger immediate sync back to Sage X3 so those changes do not wait for the next poll.
How are Sage X3 customers and suppliers mapped to Dynamics 365 accounts?
ml-connector uses the external identifier field on Dynamics 365 accounts to store the Sage X3 customer or supplier ID, so the same entity always maps to the same record across runs. Customers in Sage X3 become accounts in Dynamics 365, and suppliers can optionally sync as separate account records or be matched to existing accounts by name.

Related integrations

Connect Sage X3 and Microsoft Dynamics 365 Sales

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

Get started