ml-connector
OdooDeel

Odoo and Deel integration

Odoo runs your finance and HR. Deel runs your global payroll and compliance across 150+ countries. Connecting the two ensures your general ledger reflects the true cost of labor and your employee records in Odoo stay aligned with Deel contracts, onboarding, and terminations. New contractors and employees in Deel flow to Odoo, and the invoice totals from each payroll cycle post into Odoo's general ledger without manual re-entry.

How Odoo works

Odoo is available as a SaaS, PaaS, or self-hosted instance. It exposes journals, accounts, employees, and cost centers through XML-RPC (HTTP POST to {base_url}/xmlrpc/2/) and JSON-2 REST (HTTP POST to {base_url}/json/2/) APIs. Authentication uses an API key paired with username login; XML-RPC returns a user ID (uid) after successful authenticate(), while JSON-2 uses the API key as a Bearer token. Key entities include account.move (journals), account.account (GL accounts), account.analytic.account (cost centers), and hr.employee. Odoo Online, Odoo.sh, and self-hosted sites each have their own base URL. Polling is recommended because Odoo webhooks (via Automated Actions and Studio) are not production-grade and lack HMAC signature headers. API access requires a Custom pricing plan, and Odoo users must have a password set before XML-RPC can authenticate.

How Deel works

Deel provides a REST API at https://api.letsdeel.com/rest/v2 (production) and https://api-sandbox.demo.deel.com/rest/v2 (sandbox). It authenticates with Bearer tokens (Organization Token for server-to-server, no expiry) or OAuth2 (30-day access tokens, 90-day refresh tokens). Deel exposes contracts, people, invoices, worker-invoices, payslips, and payroll-inputs. It supports webhooks for real-time events (contract.created, hris.employee.created, hris.employee.terminated) with HMAC-SHA256 signature verification. Deel rate limits with HTTP 429 and Retry-After headers, uses offset-based pagination (default 25), and requires Idempotency-Key headers (UUID v4, 24-hour TTL) on POST and PATCH requests. Deel is HRIS and payroll only; it does not expose standalone GL account data or vendor master records.

What moves between them

The main flow is Deel into Odoo. Each payroll cycle, ml-connector reads Deel invoices (which aggregate costs by contract and country), maps those costs to Odoo's analytical accounts (cost centers) and expense accounts, and posts the totals as journals into Odoo's general ledger. Employee and contractor records flow from Deel into Odoo; new contracts trigger new hr.employee records or update existing ones with current status and cost allocations. Reference data such as cost center mapping and expense account assignment is configured per customer.

How ml-connector handles it

ml-connector stores the Deel Organization Token encrypted and presents it as a Bearer token on each REST call, refreshing when an endpoint returns 401. On the Odoo side it accepts the full instance URL (Odoo Online, Odoo.sh, or self-hosted) and validates that the API key is active before writing. Because Odoo webhooks are not production-grade, ml-connector polls Deel on a schedule tied to your payroll calendar rather than relying on Deel webhooks; if webhooks are enabled, ml-connector can also listen to contract and termination events. Before posting a journal into Odoo, ml-connector maps each Deel cost to the correct analytical account (cost center) so the journal lines reference accounts that already exist. Deel rate limits are handled with exponential backoff and Retry-After headers. Every record carries an audit trail and can be replayed if a downstream call fails. Odoo's XML-RPC API includes the authenticated user's access rights and record rules, so ml-connector respects the integration user's Odoo permissions.

A real-world example

A mid-sized professional services firm uses Odoo to manage projects, purchasing, and finance, and uses Deel to handle payroll, contractor invoicing, and benefits across three countries. Before the integration, the finance team received Deel invoices and contractor cost reports each month, then manually distributed the labor costs across Odoo's project cost centers and posted them to the expense accounts in the general ledger. This took 2 to 3 days and often contained re-keying errors. With Odoo and Deel connected, invoices flow automatically into Odoo at the end of each payroll cycle, allocated to the correct project cost centers, and the ledger is ready for close with no manual distribution step.

What you can do

  • Post Deel invoice totals and contractor payroll costs into Odoo's general ledger each cycle, mapped to the correct cost centers.
  • Keep Odoo employee and contractor records in sync with Deel contracts, onboarding, and terminations.
  • Map Deel costs to Odoo analytical accounts (cost centers) and expense accounts so labor costs land on the right GL dimensions.
  • Authenticate Deel with Bearer tokens and Odoo with XML-RPC or JSON-2 login and API key.
  • Poll Deel on a payroll cadence, handle rate limits with exponential backoff, and maintain a full audit trail on every record.

Questions

Which direction does data move between Odoo and Deel?
The main flow is Deel into Odoo. Payroll invoices and employee records move from Deel into Odoo's general ledger and HR module. Cost allocation and expense account mapping are configured per customer so invoices land on the correct dimensions. Odoo employee records are read and updated to reflect Deel contracts and terminations.
How does ml-connector handle the differences between Deel's global payroll model and Odoo's general ledger?
ml-connector maps Deel invoices (which aggregate costs by contract, country, and currency) to Odoo analytical accounts (cost centers) and expense accounts defined during setup. Each invoice line is split across cost centers based on the contract's allocation, and the journal is posted in the currency and period that matches the Odoo accounting calendar.
Why does ml-connector poll Deel instead of relying on Deel webhooks?
Odoo's webhook system (Automated Actions and Studio) is not production-grade and lacks HMAC signature headers. Deel webhooks are reliable but Odoo cannot consume them safely. ml-connector polls Deel on a schedule tied to your payroll calendar instead, and can also listen to Deel webhook events if they are enabled in Deel's settings.

Related integrations

Connect Odoo and Deel

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

Get started