Odoo and Procore integration
Odoo runs your accounting, purchasing, and cost tracking. Procore manages construction projects and financial commitments. Connecting them keeps your project costs and purchase orders in sync across both systems. Purchase orders and vendor invoices created in Odoo flow into Procore as requisitions and direct costs without re-entry, cost centers align across both systems, and your vendor master stays consistent. ml-connector bridges the very different APIs and authentication models on each side.
What moves between them
Purchase orders and vendor invoices flow from Odoo into Procore as requisitions and direct costs, aligned to project-specific cost codes. Vendors from Odoo sync into Procore's vendor master so purchase orders reference valid suppliers. Cost account mappings flow both directions: Odoo analytic accounts and cost centers are matched to Procore cost codes so each project draws from the correct budget lines. Because Odoo is pull-only for cloud, ml-connector polls on a schedule tied to your accounting and project cycles, checking for new or modified purchase orders and invoices since the last run.
How ml-connector handles it
ml-connector stores both credential sets encrypted: Odoo's API key is passed as a Bearer token on JSON-2 calls (or in XML-RPC headers for legacy instances), and Procore credentials are exchanged for an OAuth 2.0 access token which ml-connector refreshes when it expires after 1.5 hours. Because Procore requires both company_id and project_id on most endpoints, ml-connector accepts a mapping of Odoo analytic accounts to Procore projects, so a purchase order tagged with an Odoo cost center routes to the correct Procore project and cost code. Odoo's access control is enforced client-side; ml-connector respects the integration user's permissions. Procore's real-time webhooks can be enabled where available, or ml-connector falls back to polling Odoo's write_date field with a high-water-mark timestamp. Every record carries a full audit trail, and failed Procore calls are retried with exponential backoff before surfacing to the user.
A real-world example
A mid-sized construction firm uses Odoo for accounting and purchasing across multiple regional offices, and Procore for project tracking and cost management on active construction sites. Before the integration, the procurement team created purchase orders in Odoo, then manually entered them into Procore as requisitions and direct costs, often resulting in discrepancies between the two systems during project close-out. Cost center allocation was error-prone, and month-end reconciliation required chasing POs across both systems. With Odoo and Procore connected, each purchase order and vendor invoice flows automatically into Procore mapped to the correct project and cost code. The vendor master stays synchronized, eliminating duplicate vendor setup, and project costs are accurate from the start. Month-end close is faster because the two systems are already aligned.
What you can do
- Sync Odoo purchase orders and vendor invoices into Procore as requisitions and direct costs, mapped to the correct project and cost code.
- Keep Odoo vendors and Procore vendor master in sync so purchase orders reference valid suppliers on both sides.
- Map Odoo analytic accounts and cost centers to Procore cost codes so project costs land on the correct budget lines.
- Authenticate Odoo with API key auth and Procore with OAuth 2.0 Client Credentials, handling token refresh and expiry.
- Poll Odoo on a schedule tied to your accounting and project cycles, with automatic retries and a full audit trail on every record.
Questions
- Which direction does data move between Odoo and Procore?
- The main flow is Odoo into Procore. Purchase orders, vendor invoices, and vendor records move from Odoo into Procore as requisitions, direct costs, and vendor entries. Cost account mappings are aligned in both directions so that each project in Procore draws from the correct Odoo cost center or analytic account.
- How does ml-connector handle Odoo's polling model and Procore's project-scoped structure?
- ml-connector accepts a mapping of Odoo analytic accounts to Procore projects, and uses that mapping to route each purchase order to the correct Procore project and cost code. Because Odoo is pull-only for cloud, ml-connector polls Odoo's write_date field on a schedule tied to your accounting and project cycles, rather than waiting for a push notification.
- What authentication is required for each system?
- Odoo requires an API key and username, passed as a Bearer token in JSON-2 requests or in XML-RPC headers for legacy instances. Procore requires OAuth 2.0 Client Credentials via a Developer Managed Service Account, which ml-connector exchanges for an access token that expires every 1.5 hours. ml-connector stores both credential sets encrypted and refreshes the Procore token before it expires.
Related integrations
More Odoo integrations
Other systems that connect to Procore
Connect Odoo and Procore
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started