SAP Business One and Microsoft Dynamics 365 Sales integration
SAP Business One runs your finance and operations. Dynamics 365 Sales manages your customer pipeline and deals. Connecting the two keeps sales data aligned across both systems so your finance team and sales organization are working from the same customer records, orders, and payment status. Sales orders created in Dynamics 365 Sales can be mirrored into SAP Business One's purchasing system, and invoice status flows back so sales can see when customers are paid up. ml-connector bridges the on-premise ERP and cloud CRM with no manual re-entry.
What moves between them
The main data flow runs from SAP Business One into Dynamics 365 Sales. Sales orders and invoices from SAP are pulled via OData queries and created or updated as orders and invoices in Dynamics 365 Sales, with business partners mapped to accounts. Customer payment status and invoice records flow in the same direction so the sales team sees real-time cash collection. Reference data such as product lists and price levels are synchronized in both directions to keep quotes and orders valid on both sides. One-way reads keep the systems aligned without overwriting transactional records in SAP.
How ml-connector handles it
ml-connector maintains SAP Business One's session token and reuses it across multiple API calls to avoid the 5-second cold-start overhead of each login. It queries SAP with OData $filter on UpdateDate to poll for new and changed records on a schedule you set, typically daily or after business hours. When records arrive, ml-connector checks for duplicates using SAP's DocNum field before inserting to prevent re-syncing the same order or invoice. On the Dynamics 365 Sales side, it authenticates with a Dataverse OAuth token obtained from Entra ID and uses the standard OData Create and Update operations to write accounts, orders, and invoices. Product records and price levels are synced first so every quote and order reference valid SKUs and pricing. When Dynamics 365 webhooks are enabled, ml-connector can receive invoice and order status changes in near-real-time; otherwise it polls Dynamics 365 Sales on the same schedule as SAP. Both systems use OData pagination, so ml-connector respects $skip and $top to handle large datasets. Network timeouts trigger exponential backoff with jitter before surfacing an alert.
A real-world example
A mid-market distributor runs SAP Business One on-premise for inventory, purchasing, and financial accounting across three regional warehouses. The sales team uses Dynamics 365 Sales to track customer pipelines and manage quotes. Before the integration, orders entered in Dynamics 365 Sales had to be re-keyed into SAP Business One by hand, and the warehouse team had no visibility into which orders were promised to customers. When an invoice posted in SAP, the sales team had no way to know except through email. With SAP Business One and Dynamics 365 Sales connected, sales orders created in the CRM automatically appear in SAP's purchase workflow, inventory reservations are visible back in Dynamics 365 Sales, and payment status flows to the sales pipeline so the team can prioritize follow-up. Month-end reconciliation is faster because order and invoice records already match across both systems.
What you can do
- Sync SAP Business One sales orders, invoices, and business partners into Dynamics 365 Sales as orders, invoices, and accounts.
- Pull SAP Business One data via OData with UpdateDate filtering to detect new and changed records without re-syncing duplicates.
- Reuse SAP Business One session tokens across multiple calls to eliminate the 5-second cold-start overhead of each login.
- Authenticate Dynamics 365 Sales with OAuth 2.0 Entra ID and map SAP customers and products to Dynamics 365 Sales records.
- Receive near-real-time status changes from Dynamics 365 Sales webhooks or fall back to polling when webhooks are not enabled.
Questions
- Which direction does data flow between SAP Business One and Dynamics 365 Sales?
- The primary flow is from SAP Business One into Dynamics 365 Sales. Sales orders, invoices, and customer records are pulled from SAP and created or updated in Dynamics 365 Sales so your sales team sees order status and payment information. Product and price data can be synchronized in both directions to keep quotations valid. Transactional records such as invoices are read-only on the Dynamics 365 Sales side, so ml-connector does not write payments or adjustments back into the ERP.
- How does ml-connector handle SAP Business One's session token and cold-start overhead?
- ml-connector obtains a session token once via a login call and reuses it across multiple OData requests to the same SAP instance, avoiding the 5-second startup cost for each API call. The token expires after 30 minutes of inactivity and returns an HTTP -5002 error, so ml-connector monitors expiry and refreshes proactively before timeout. On-premise instances often require direct network access to the SAP Service Layer port, which is configured per customer.
- What happens if SAP Business One and Dynamics 365 Sales record the same sale differently?
- ml-connector uses SAP Business One's DocNum field as the deduplication key when polling, so the same order is never synced twice even if the polling job runs multiple times. Product records are synchronized first before orders so every line item references a valid SKU and price in Dynamics 365 Sales. If a record changes in SAP after it has been synced, the UpdateDate filter picks up the change on the next poll and ml-connector updates the corresponding record in Dynamics 365 Sales.
Related integrations
More SAP Business One integrations
Other systems that connect to Microsoft Dynamics 365 Sales
Connect SAP Business One and Microsoft Dynamics 365 Sales
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started