ml-connector
SYSPROMicrosoft Dynamics 365 Sales

SYSPRO and Microsoft Dynamics 365 Sales integration

SYSPRO runs manufacturing and distribution finance. Dynamics 365 Sales runs the sales pipeline. Connecting them syncs your customer master and sales orders between systems, so sales sees current credit status from SYSPRO, and SYSPRO invoices are tied to the original Dynamics 365 Sales orders. When a new customer is booked in SYSPRO, the sales team has an account in Dynamics 365 Sales to attach opportunities and leads. When Dynamics 365 Sales closes an order, it flows into SYSPRO with full traceability back to the original sales transaction.

How SYSPRO works

SYSPRO exposes customers, suppliers, invoices, purchase orders, inventory, and general ledger accounts through three API layers: e.net Business Objects (REST and SOAP, read and write), OData (REST, read-only), and Workflow Service (limited). The cloud product authenticates with a session token obtained by logging into the Utilities/Logon endpoint, and each request carries a UserId GUID. On-premise deployments use the same APIs but require a customer-supplied server URL. SYSPRO has no outbound webhook system, so records are retrieved by polling OData tables with filters on timestamp fields like PostDate and InvoiceDate, typically every 5 to 15 minutes for financial data.

How Microsoft Dynamics 365 Sales works

Microsoft Dynamics 365 Sales exposes accounts, contacts, leads, opportunities, quotes, sales orders, and invoices through the Dataverse REST OData v4.0 API. Authentication uses OAuth 2.0 via Microsoft Entra ID with the client credentials flow for server-to-server integrations. Dynamics 365 Sales supports inbound webhooks through the Dataverse Event Framework, with synchronous or asynchronous execution and a 256 KB payload limit. Webhook events cover Create, Update, Delete, Assign, SetState, Win, Lose, QualifyLead, ConvertQuoteToSalesOrder, FulfillSalesOrder, and GenerateInvoiceFromOrder, plus custom actions. Access tokens expire in approximately 60 minutes.

What moves between them

Customer and invoice data flows from SYSPRO into Dynamics 365 Sales. SYSPRO customers are created or updated as Dynamics 365 Sales accounts, with invoice records becoming sales orders or invoice records in the CRM. Sales orders created in Dynamics 365 Sales can be read from SYSPRO to verify invoicing and credit status. Reference data such as product pricing and price lists is aligned so sales quotes reference SYSPRO products. The main flow is unidirectional read from SYSPRO and write to Dynamics 365 Sales, with read-back to SYSPRO used for verification and credit checking.

How ml-connector handles it

ml-connector polls SYSPRO's OData layer every 5 to 15 minutes to detect new or changed customers and invoices, filtering on timestamp fields like PostDate. For each customer, it authenticates to SYSPRO with the supplied session token and extracts the customer name, address, credit limit, and balance due. It then authenticates to Dynamics 365 Sales using OAuth 2.0 client credentials against Microsoft Entra ID, and creates or updates the corresponding account record. Invoice data is mapped from SYSPRO's ApInvoice and ApPosting tables into Dynamics 365 Sales sales order or invoice records, with the invoice amount partitioned into separate webhook deliveries if it exceeds the 256 KB payload limit. ml-connector refreshes the SYSPRO session token on expiry and refreshes the Dynamics 365 Sales OAuth token when it approaches 60-minute expiry. Both tokens are stored encrypted. On webhook delivery failure or 502/503/504 response from Dynamics 365 Sales, ml-connector retries the request and logs the full audit trail, so failed records can be replayed manually once the issue is resolved.

A real-world example

A mid-sized industrial distribution company runs SYSPRO for order fulfillment and accounting, and uses Dynamics 365 Sales to track customer opportunities and sales pipelines. The sales team manually looked up customer credit limits in SYSPRO's customer master every time they quoted a deal, and once an order shipped, the finance team had to manually key the invoice into Dynamics 365 Sales to tie it back to the original sales opportunity. With SYSPRO and Dynamics 365 Sales connected, each new customer added to SYSPRO appears in Dynamics 365 Sales the next polling cycle, and the sales team can see real-time credit exposure without leaving the CRM. Invoices are attached automatically to their originating sales orders, giving finance a complete audit trail and eliminating the manual re-entry step at billing time.

What you can do

  • Sync SYSPRO customers into Dynamics 365 Sales accounts, including address, credit limit, and balance due.
  • Map SYSPRO invoices to Dynamics 365 Sales sales orders or invoice records, partitioned to respect the 256 KB webhook payload limit.
  • Poll SYSPRO's OData layer on a configurable schedule and refresh session tokens automatically on expiry.
  • Authenticate SYSPRO with session tokens and Dynamics 365 Sales with OAuth 2.0 client credentials via Microsoft Entra ID.
  • Deliver records to Dynamics 365 Sales via webhook, with retry on 502/503/504 errors and a full audit trail for replay.

Questions

Which direction does data move between SYSPRO and Dynamics 365 Sales?
The main flow is SYSPRO into Dynamics 365 Sales. Customer and invoice records are read from SYSPRO's OData layer and written to Dynamics 365 Sales accounts and sales orders via webhook. Dynamics 365 Sales orders can be read back to SYSPRO for credit checking and invoicing verification, but Dynamics 365 Sales does not modify SYSPRO records directly.
How does SYSPRO's session token work with polling?
SYSPRO requires login to the Utilities/Logon endpoint to obtain a session token tied to a UserId GUID, and that token must be passed on every subsequent OData query. ml-connector stores the token encrypted, refreshes it on expiry or logoff timeout, and polls the customer and invoice OData tables at regular intervals with filters on PostDate and InvoiceDate to detect changes.
Does the 256 KB webhook payload limit affect how invoices are delivered to Dynamics 365 Sales?
Yes. If an invoice payload exceeds 256 KB, ml-connector partitions it into multiple webhook deliveries, each staying under the limit. This ensures all invoice detail reaches Dynamics 365 Sales while respecting the Dataverse webhook size constraint. Each partition is tracked separately in the audit log.

Related integrations

Connect SYSPRO and Microsoft Dynamics 365 Sales

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

Get started