ml-connector
OdooWise

Odoo and Wise integration

Odoo runs your accounting and operations. Wise runs your cross-border payments and multi-currency accounts. Connecting the two means every international transfer and currency movement in Wise flows into Odoo's general ledger without manual posting. Payment reconciliation happens automatically, and FX gains and losses are recorded in the correct accounts. ml-connector bridges the two platforms and keeps your books current.

How Odoo works

Odoo is an open-source ERP suite available as Odoo Online (SaaS at https://<subdomain>.odoo.com), Odoo.sh (PaaS), or self-hosted. It exposes accounting records, payments, purchase orders, customers, products, employees, and GL accounts through XML-RPC over HTTP POST to {base_url}/xmlrpc/2/object or JSON-2 REST to {base_url}/json/2/<model>/<method>. Authentication requires an API key paired with a username. Data is pulled via polling with a write_date filter and high-water-mark timestamp to fetch only new records. Webhooks via Automated Actions exist in Enterprise + Studio but are not production-grade, so polling is the recommended approach for external integrations.

How Wise works

Wise is a global payments platform exposing profiles, multi-currency balances, balance statements, recipients, transfer quotes, completed transfers, and activity logs through REST APIs at https://api.wise.com (production) or https://api.sandbox.transferwise.tech (sandbox). Authentication uses OAuth 2.0 with 12-hour token expiry and long-lived refresh tokens, or a Personal API Token (Bearer). Data is available both via REST polling and through webhooks that fire on transfersstate-change, balancesupdate, balancescredit, and other payment events, with RSA-SHA256 signature verification. Rate limits are 100 requests per second and 1000 per minute for partner OAuth accounts.

What moves between them

Wise transfers and balance updates flow into Odoo. After each transfer completes in Wise, ml-connector polls the transfer history and balance statements, then creates matching payment records (account.payment) and account movement lines (account.move.line) in Odoo allocated to the bank account and currency accounts specified in the mapping. Balance movements between Wise currency accounts are recorded as inter-account transfers. Currency gains and losses from Wise conversions are posted to the FX revaluation account in Odoo. The sync runs on a schedule you set; high-frequency polling captures rapid-fire transfers, while less frequent schedules work for daily or weekly reconciliation cycles.

How ml-connector handles it

ml-connector stores both Odoo API keys and Wise OAuth credentials encrypted and refreshes the Wise token before expiry. It polls Wise for transfer state changes and balance updates, fetches the full transfer and quote history to calculate FX impact, and creates Odoo payment records only if they do not already exist (deduplication via Wise transfer ID). Multi-currency transfers require two line items in Odoo: one in the source currency, one in the destination currency, with a third line capturing any FX gain or loss. Because Wise enforces a 4-step sequence for transfers (quote, recipient, transfer order, fund payment) and recipients are immutable, ml-connector respects those constraints and does not attempt bidirectional write-back. Rate limiting on the Wise side (100 req/sec, 1000 req/min) is handled via exponential backoff and jitter. Every payment record carries a full audit trail and can be replayed if a downstream Odoo GL post fails.

A real-world example

A mid-sized services company operates in four countries and runs Odoo Online for accounting and operations. The team moves money between currency accounts at Wise multiple times a week to fund payroll in each region and collect invoices in local currencies. Before the integration, the finance team manually entered each transfer and currency conversion into Odoo after the fact, leading to reconciliation delays and FX rounding errors. With Odoo and Wise connected, each transfer creates a payment record and GL posting in real time, allocated to the correct entity and currency account. The finance team now closes month-end with all Wise activity already in the ledger and no manual re-entry.

What you can do

  • Record completed Wise transfers into Odoo as payment records and journal lines allocated to the correct bank and currency accounts.
  • Automatically post currency gains and losses from Wise conversions to Odoo's FX revaluation account.
  • Match Wise balance statements to Odoo bank reconciliation so every transfer is accounted for.
  • Authenticate Odoo with API keys and Wise with OAuth 2.0 or personal tokens, refreshing credentials before expiry.
  • Poll on a schedule you control with deduplication, retries, and a full audit trail on every record.

Questions

Does ml-connector push payment data back into Wise or only into Odoo?
Only into Odoo. Wise is the source of truth for transfers, quotes, and recipients. ml-connector reads transfer history and balance statements from Wise and creates matching payment and GL records in Odoo so your accounting system stays in sync. No data flows back to Wise.
How does the integration handle multi-currency transfers and FX gains or losses?
Each multi-currency transfer creates two line items in Odoo: one in the source currency at the debit amount, one in the destination currency at the credit amount. A third line posts any FX gain or loss to Odoo's designated FX revaluation account. This approach preserves the exact values Wise reports and makes reconciliation between the two systems seamless.
What happens if a transfer fails in Wise or is cancelled after ml-connector has already created the Odoo record?
ml-connector monitors transfer state changes via webhooks or polling and updates the Odoo payment record to reflect the new state (cancelled, failed, rejected). Cancelled transfers can be voided or deleted in Odoo if the mapping specifies that behavior, so your ledger stays accurate.

Related integrations

Connect Odoo and Wise

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

Get started