Odoo and Plaid integration
Odoo manages your general ledger, purchase orders, and payments. Plaid connects to your bank accounts and enables ACH or wire transfers. Linking them keeps your Odoo payment records aligned with actual bank transactions, pulls Plaid's authoritative transaction history into your accounting system, and lets Odoo trigger transfers through Plaid without manual re-keying. ml-connector handles the API differences and keeps both systems in sync on a schedule you control.
What moves between them
Payment records and GL account metadata flow from Odoo into Plaid as reference data for mapping. Bank transactions flow from Plaid into Odoo, matched against Odoo's account.move records by date, amount, and counterparty. When Odoo account.payment records are created, ml-connector can initiate transfers through Plaid's transfer endpoints (ACH or wire based on configuration), with transfer descriptions limited to 15 characters for RTP and 10 for ACH. Plaid webhooks notify ml-connector of new transactions and transfer events, while ml-connector polls Odoo on a regular cadence for new payments.
How ml-connector handles it
ml-connector stores both credential sets encrypted and uses Odoo's API key for XML-RPC or JSON-2 calls depending on the instance version; for JSON-2 instances it passes the API key as a Bearer token, and for older instances it calls authenticate() to obtain a uid before subsequent operations. On the Plaid side it manages per-user access tokens obtained through the Link flow and stores them encrypted per Odoo bank account. Every Plaid webhook is verified before processing: ml-connector fetches Plaid's JWK public key, validates the JWT signature with ES256, checks that iat is within 5 minutes, and computes the SHA-256 hash of the raw body to confirm request_body_sha256. When Odoo payment records reference a mapped bank account, ml-connector extracts the amount, description (truncated to Plaid's limits), and counterparty, then calls Plaid's transfer endpoints with an idempotency key for deduplication. Plaid returns 429 rate limits per gateway node, so ml-connector backs off and retries. Every record carries a full audit trail and can be replayed if a downstream call fails.
A real-world example
A mid-sized import-export trading company uses Odoo accounting for payables and general ledger, and holds operating accounts across three banks. Before integration, the accounting team recorded payments in Odoo, initiated transfers through each bank's portal separately, and manually reconciled the bank feeds to Odoo's payment records each week, a process that often surfaced timing mismatches between Odoo and actual bank postings. With Odoo and Plaid connected, the accounting team creates a payment in Odoo, ml-connector initiates the transfer through Plaid automatically, and Plaid's transaction webhook updates Odoo with the actual posted date and confirmation number. The weekly reconciliation now starts with transactions already matched, and the manual transfer step is eliminated.
What you can do
- Initiate ACH and wire transfers from Odoo payments through Plaid, with descriptions automatically truncated to Plaid's limits.
- Sync Plaid bank transactions and balances into Odoo as reference data for payment reconciliation.
- Map Odoo bank accounts to Plaid Items and manage per-user access tokens encrypted and scoped per account.
- Verify Plaid webhook signatures using JWT with ES256, confirm message freshness with iat claims, and validate body integrity with SHA-256.
- Poll Odoo's payment records on a schedule and detect new transactions via Plaid webhooks, with retries and full audit trails on every record.
Questions
- How does ml-connector verify Plaid webhook signatures?
- Every Plaid webhook includes a JWT token signed with the ES256 algorithm. ml-connector fetches Plaid's JWK public key, validates the JWT signature, confirms the algorithm is ES256, checks that the iat claim is within 5 minutes of the current time, and computes the SHA-256 hash of the raw HTTP body to verify it matches the request_body_sha256 claim. If any check fails, the webhook is rejected.
- Can ml-connector initiate transfers in both directions between Odoo and Plaid?
- Transfers flow from Odoo to Plaid. When an Odoo account.payment is created on a mapped bank account, ml-connector calls Plaid's transfer endpoint to move funds. Plaid transactions flow into Odoo for reconciliation, but Odoo cannot initiate transfers back to Plaid since Plaid's transfer API is write-only for outbound movements.
- Does this integration work with all Odoo versions and editions?
- External API access in Odoo requires the Custom pricing plan and is not available on One App Free or Standard editions. For XML-RPC authentication, Odoo Online users must have a password set by an admin. JSON-2 is available on Odoo 19+, while older versions use XML-RPC. Both transport methods are supported, though XML-RPC and JSON-RPC are scheduled for removal in Odoo 22 (2028).
Related integrations
More Odoo integrations
Other systems that connect to Plaid
Connect Odoo and Plaid
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started