Odoo and GoCardless integration
Odoo runs your finance and operations. GoCardless runs your recurring and one-off bank debit collections. Connecting the two keeps your accounts receivable and your customer records in agreement. New customers in Odoo sync to GoCardless mandates, and each payment collected flows into Odoo as a receipt against the right invoice. Payout reconciliation is automatic, so your bank transactions match your cash records without manual re-keying.
What moves between them
The integration flows from GoCardless into Odoo. After each payment collection, ml-connector reads GoCardless payment and payout events via webhooks and posts them into Odoo as payment receipts, bank transactions, and journal entries allocated to the matching customer invoice. Customer records flow in both directions so Odoo invoices reflect GoCardless mandates and subscription status. Payout schedules and refund records sync into Odoo as bank activity and credit memos. New customers created in Odoo can trigger mandate creation in GoCardless if configured.
How ml-connector handles it
ml-connector stores the GoCardless bearer token encrypted and validates every webhook signature using HMAC-SHA256 before processing the event, returning 2xx only on a valid signature so GoCardless does not mark the endpoint healthy on bad authentication. On the Odoo side it uses the API key and base URL per customer instance, polling for new invoices or receipts where Odoo webhooks are unavailable, and converting payout records (which are read-only in GoCardless) into Odoo bank transaction records for reconciliation. GoCardless amount fields are integers in pence or cents, so ml-connector converts them to Odoo's decimal currency format. Customer records are mapped first, so every payment references a customer that already exists in Odoo. When a payout is created by GoCardless, ml-connector fetches the payout_items and posts them as bank entries in Odoo's operating account journal. Every record carries a full audit trail and can be replayed if a downstream call fails.
A real-world example
A mid-sized B2B SaaS company runs Odoo for accounting and customer management, and uses GoCardless to collect monthly subscription payments via bank debit across their EU customer base. Before the integration, the finance team reviewed GoCardless dashboards weekly to identify new payments and payouts, then manually posted them in Odoo as bank transactions and reconciled customers against mandates, a process that took hours and introduced errors when payments arrived out of sequence. With Odoo and GoCardless connected, each payment posts to Odoo automatically as a receipt against the customer invoice, payouts flow into the bank journal on day of deposit, and the customer mandate list in Odoo stays aligned with GoCardless subscriptions. Reconciliation is instant, and the finance team focuses on exceptions rather than data entry.
What you can do
- Sync GoCardless customers, mandates, and subscriptions into Odoo as partners with AR tracking.
- Post GoCardless payments into Odoo as receipts against customer invoices in the correct currency.
- Convert GoCardless payouts into Odoo bank transaction records for cash reconciliation.
- Verify GoCardless webhook signatures and retry failed events with a full audit trail.
- Map payout items to Odoo journal entries and track refunds as credit memos.
Questions
- Which direction does data move between Odoo and GoCardless?
- The main flow is from GoCardless into Odoo. Payments, payouts, and customer records from GoCardless flow into Odoo as receipts, bank transactions, and partner records. New customers created in Odoo can optionally trigger mandate creation in GoCardless. Invoices in Odoo are read-only in GoCardless, so ml-connector does not write billing data back to GoCardless.
- How does the integration handle GoCardless payout records and currency conversion?
- Payouts are created automatically by GoCardless and are read-only, so ml-connector fetches payout records and their items and converts them into Odoo bank journal entries. GoCardless amount fields are integers in the smallest currency unit, so ml-connector converts them to Odoo's decimal format using the customer's home currency. Every payout carries the GoCardless payment_id for full traceability.
- What happens when a GoCardless webhook fails or arrives out of order?
- ml-connector validates every webhook using HMAC-SHA256 signature verification and returns 2xx only on a valid signature, so GoCardless continues retrying invalid requests. If an Odoo posting fails, the webhook record is stored with full state and can be manually replayed. Payments that arrive out of sequence are handled by matching the customer and invoice before posting, so late arrivals do not break reconciliation.
Related integrations
More Odoo integrations
Other systems that connect to GoCardless
Connect Odoo and GoCardless
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started