ml-connector
OdooAdyen

Odoo and Adyen integration

Odoo tracks sales, invoices, and customer accounts. Adyen processes and settles payments across online, mobile, and in-person channels. Connecting them keeps your cash position accurate and reconciled. Payment captures and settlements flow from Adyen into Odoo's general ledger without re-keying, customer payment status stays in sync, and disputes are tracked as credit memos. ml-connector bridges the two by listening to Adyen webhooks and importing settlement reports on a schedule you control.

How Odoo works

Odoo (Odoo Online, Odoo.sh, or self-hosted) exposes invoices, customers, payments, general ledger accounts, and transactions through JSON-2 REST APIs over HTTP POST to its instance URL. Authentication is API key paired with username (for XML-RPC) or Bearer token with API key (for JSON-2). Odoo respects the API user's access rights and record rules. Outgoing webhooks via Automated Actions exist in Enterprise + Studio, but are not production-grade, so reading requires polling the keyEntities list with write-date timestamps for incremental sync.

How Adyen works

Adyen is a payments platform that does not include an ERP: it has no native vendors, purchase orders, GL accounts, or cost centers. It exposes payment events (AUTHORISATION, CAPTURE, REFUND, CANCELLATION), dispute events, and settlement reports through REST APIs and HMAC-SHA256-signed webhooks. Authentication is API Key in the X-API-Key header, scoped to a merchant account. Adyen webhooks are the primary transport for real-time payment notifications; settlement and reconciliation reports are pulled from REST endpoints or scheduled pushes. Write operations (captures, refunds, cancellations) are idempotent but not updateable once submitted.

What moves between them

Payment events and settlement data flow from Adyen into Odoo. When a payment is authorized or captured through Adyen, ml-connector receives the webhook notification, matches the payment to an Odoo invoice by amount and customer, and posts the receivable into Odoo's general ledger. After each settlement period, Adyen reports are imported to reconcile cash received against invoices paid. Refunds and chargebacks flow as credit memos in Odoo. Customer sync is one-way: Odoo customers are read to match incoming Adyen payments, but not written back.

How ml-connector handles it

ml-connector subscribes to Adyen webhooks using a registered endpoint and verifies every notification with HMAC-SHA256. When a CAPTURE or REFUND event arrives, it looks up the matching Odoo invoice by amount, date, and customer email, then posts the payment into the correct GL account in Odoo via the JSON-2 API. Settlement reports are pulled daily from Adyen and compared against Odoo cash accounts to flag reconciliation gaps. Disputed transactions trigger credit memo entries in Odoo so the finance team can track them separately. Adyen API keys and webhook secrets are stored encrypted in ml-connector. Because Odoo does not push payment updates and Adyen does not read invoices, the sync is one-directional and fully asynchronous: Odoo acts as the invoice ledger and Adyen as the authoritative source of payment and settlement truth.

A real-world example

A mid-sized e-commerce business runs Odoo for order management, invoicing, and accounting, and uses Adyen for online payment processing across web and mobile channels. Before integration, the finance team reconciled Adyen settlement statements to Odoo cash accounts by hand every morning, manually flagged disputed transactions as credit memos, and spent days chasing discrepancies when payment amounts did not match invoice totals. With Odoo and Adyen connected, each Adyen capture flows into Odoo as a posted payment, settlement totals are reconciled automatically against the cash account, and disputes are logged as credit memos the same day. Month-end close is faster because the cash account is already reconciled, and the payment-lookup step is eliminated.

What you can do

  • Post Adyen payment captures, refunds, and cancellations into Odoo's general ledger, allocated to the correct receivable accounts.
  • Match Adyen payments to Odoo invoices by amount, date, and customer, and update invoice status when payment is received.
  • Reconcile Adyen settlement reports against Odoo cash accounts daily, flagging discrepancies and aging items.
  • Track chargebacks and payment disputes in Odoo as credit memos with full audit detail for the finance team.
  • Verify Adyen webhook signatures with HMAC-SHA256 and retry failed posts to Odoo with exponential backoff and full error logging.

Questions

Which direction does data move between Odoo and Adyen?
Payment events and settlement data flow from Adyen into Odoo. Captures, refunds, and disputes post into Odoo's general ledger and are matched to invoices. Customer and invoice data are read from Odoo to match incoming payments, but not written back to Adyen, since Adyen is a payment processor with no concept of invoices or GL accounts.
How does ml-connector verify Adyen webhooks and prevent replay attacks?
Every Adyen webhook arrives with an HMAC-SHA256 signature in the notification header. ml-connector verifies the signature using the webhook secret scoped to the Adyen account, rejecting any notification with an invalid signature. This prevents tampered or replayed events from posting into Odoo.
What happens if an Odoo invoice amount does not match the Adyen payment amount?
ml-connector flags the mismatch in the audit log and the Adyen payment is held for manual review rather than posting immediately. The finance team can then investigate the difference, adjust the Odoo invoice if needed, and manually trigger the post once resolved. This prevents out-of-balance GL entries.

Related integrations

Connect Odoo and Adyen

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

Get started