Odoo and Microsoft Dynamics 365 Sales integration
Odoo runs procurement, finance, and HR. Microsoft Dynamics 365 Sales manages the sales pipeline and customer relationships. Connecting the two keeps your vendor records and purchase processes visible in your CRM, and gives the sales team visibility into the orders and invoices tied to customer accounts. New vendors created in Odoo land in Dynamics 365 Sales as accounts, and purchase orders automatically surface as records linked to the right customer, without manual re-entry.
What moves between them
Purchase orders and invoices flow from Odoo into Dynamics 365 Sales as sales orders and order records. Vendor records in Odoo sync to account records in Dynamics 365 Sales. The sync runs on a daily or weekly schedule via polling, with the option to receive webhooks from Dynamics 365 Sales for changes initiated in the CRM. Odoo is the system of record for procurement and vendor data; Dynamics 365 Sales extends visibility to the sales team without writing back to Odoo.
How ml-connector handles it
ml-connector stores the Odoo API key encrypted and authenticates against the customer's specific Odoo instance URL (Online, Odoo.sh, or self-hosted). It polls Odoo's purchase orders and vendors on a configurable schedule using write_date filters for high-water-mark timestamps to avoid reprocessing. For Dynamics 365 Sales, ml-connector obtains an OAuth2 bearer token via Client Credentials, maps Odoo vendors to account records and purchase orders to sales orders, and writes each record via the OData API. Vendor names become account names, and purchase order line items become sales order lines with product references. If a Dynamics 365 Sales webhook is registered, ml-connector can also listen for changes to accounts and update the linked vendor record in Odoo (if the Odoo instance allows write-back). Rate limits on Dynamics 365 Sales trigger backoff and retry. Every record carries an audit trail.
A real-world example
A mid-sized B2B distributor runs Odoo for procurement, vendor management, and GL accounting, and uses Dynamics 365 Sales to manage customer opportunities and orders. The sales team previously saw no visibility into the company's vendor and purchase order activity, creating friction when customers asked about product sourcing or when the sales team tried to quote delivery timelines. After the integration, sales users see a vendor directory as accounts in Dynamics 365 Sales, and when an opportunity moves to a firm order, the team can see what the procurement side has already purchased for that customer, avoiding duplicate orders and accelerating fulfillment. Month-end reconciliation is faster because invoice records from Odoo are available in Dynamics 365 Sales for audit.
What you can do
- Sync Odoo vendors into Dynamics 365 Sales as account records with contact information and payment terms.
- Poll Odoo purchase orders on a configurable schedule and write them to Dynamics 365 Sales as sales orders linked to customer accounts.
- Map Odoo invoice records into Dynamics 365 Sales order documents for audit and reconciliation.
- Authenticate Odoo via API key and Dynamics 365 Sales via OAuth2 Client Credentials, handling token refresh and Odoo instance URL variety.
- Poll with high-water-mark timestamps to avoid reprocessing, with automatic retries on rate limits and a full audit trail on every record.
Questions
- Which direction does data move between Odoo and Dynamics 365 Sales?
- Vendors, purchase orders, and invoices flow from Odoo into Dynamics 365 Sales as accounts, sales orders, and order records. The sync is one-directional from Odoo to Dynamics 365 Sales, with Odoo as the system of record. If webhooks are enabled in Dynamics 365 Sales, ml-connector can listen for CRM changes and optionally update the linked vendor or order in Odoo.
- How does ml-connector handle Odoo's different hosting options and API variants?
- ml-connector accepts the full Odoo instance URL (Odoo Online, Odoo.sh, or self-hosted) per customer and authenticates with the API key. It supports both XML-RPC and JSON-2 transports, with JSON-2 preferred for newer instances. Polling with write_date filters ensures reliable sync without relying on Odoo's non-production-grade webhooks.
- What happens if Dynamics 365 Sales rejects a record due to size or schema mismatch?
- ml-connector enforces the 256 KB payload limit before sending, splits large records if needed, and retries transient errors (502, 503, 504) with exponential backoff. Schema validation maps Odoo fields to Dynamics 365 Sales OData properties, and unmatched fields are logged in the audit trail for manual review. The integration does not fail on a single bad record; it moves to the next and surfaces failures in alerts.
Related integrations
More Odoo integrations
Other systems that connect to Microsoft Dynamics 365 Sales
Connect Odoo and Microsoft Dynamics 365 Sales
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started