ml-connector
OdooADP

Odoo and ADP integration

Odoo runs your core finance, purchasing, and inventory. ADP runs payroll and workforce management. Connecting them keeps your general ledger and headcount aligned across both systems. After each payroll run, labor cost journals from ADP flow into Odoo's accounting ledger, and employee hires, terminations, and rehires keep your headcount accurate. ml-connector bridges the very different authentication schemes and syncs the records on a schedule you control.

How Odoo works

Odoo exposes customers, vendors, purchase orders, invoices, payments, general ledger accounts, cost centers, employees, and journal entries through XML-RPC and JSON-2 REST APIs, available on Odoo Online, Odoo.sh, and self-hosted sites. Odoo authenticates with an API key paired with a username login; XML-RPC sessions require a uid obtained via an initial authenticate call, and JSON-2 uses the API key as a Bearer token. External API access requires a Custom pricing plan. Odoo has no production-grade webhooks, so records are read by polling with a write_date filter to track changes since the last sync.

How ADP works

ADP exposes workers, payroll input, pay distributions, pay statements, cost centers, general ledger documents, and validation tables through ADP API Central, a paid REST service with OData support. Every call requires OAuth2 client credentials and a mandatory mutual TLS client certificate presented at the TLS handshake; the connection fails without it. Writes to ADP go through event endpoints rather than direct field updates, and general ledger documents are read-only output from payroll processing. ADP can also push worker and payroll events to a registered endpoint, and rate limits are per-node at 75-195 calls per minute depending on tier.

What moves between them

The primary flow runs from ADP into Odoo. After each payroll run, ml-connector reads ADP's general ledger documents and posts the labor cost journals into Odoo's accounting ledger, mapped to the matching Odoo GL accounts and cost centers. Employee records flow the same direction so Odoo headcount reflects ADP hires, terminations, and rehires. Reference data such as cost centers and departments is aligned in both directions so payroll allocations land on valid Odoo financial dimensions. GL postings are read-only in ADP, so ml-connector never writes financial entries back into payroll.

How ml-connector handles it

ml-connector stores both Odoo API credentials and ADP OAuth2 credentials plus the mTLS certificate encrypted, and presents the ADP certificate at the TLS layer on every request. For Odoo it accepts the full instance base URL (Odoo Online, Odoo.sh, or self-hosted) and uses either XML-RPC or JSON-2 depending on the Odoo version. For ADP it refreshes the OAuth2 bearer token when a call returns 401 and tracks the client certificate expiry so a renewal does not cause an outage. Because Odoo has no production webhooks, ml-connector polls both Odoo and ADP on a schedule tied to your payroll calendar. Cost centers and departments are mapped first so every payroll journal line references a GL account that already exists in Odoo. ADP rate limits return HTTP 429 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 professional services firm runs Odoo for accounting, purchasing, and client billing across three offices and uses ADP Workforce Now for payroll across the same locations. Before the integration, the finance team exported payroll registers from ADP every pay period and manually entered labor costs into Odoo by journal entry, then spent the first days of month-end close chasing differences between Odoo headcount and the labor accounts in the ledger. With Odoo and ADP connected, each payroll run's GL journal flows into Odoo automatically, allocated to the cost center for each office, and employee changes keep the two systems in agreement. Month-end close starts with payroll accounts already reconciled, and the manual re-entry step is eliminated.

What you can do

  • Post ADP payroll GL journals into Odoo's accounting ledger after every pay run, allocated to the correct cost centers and analytic accounts.
  • Keep Odoo employee records aligned with ADP hires, terminations, and rehires.
  • Map ADP cost centers and departments to Odoo GL accounts so payroll lands on valid accounts.
  • Authenticate ADP with OAuth2 and the required mutual TLS certificate, and Odoo with API key and username.
  • Poll on a schedule tied to your payroll calendar, with retries, exponential backoff, and a full audit trail on every record.

Questions

Which direction does data move between Odoo and ADP?
The main flow is ADP into Odoo. Payroll GL journals and employee records move from ADP into Odoo, while cost centers and departments are aligned in both directions. ADP general ledger documents are read-only, so ml-connector does not write financial entries back into payroll.
How does ml-connector handle ADP's mandatory mutual TLS certificate requirement?
ml-connector stores the ADP mTLS client certificate encrypted and presents it at the TLS layer on every call to ADP API Central. It tracks the certificate expiry so a renewal can be scheduled before it expires and causes an outage.
How does the integration work with Odoo's different deployment models and API versions?
ml-connector accepts the full Odoo instance URL (Odoo Online at https://<subdomain>.odoo.com, Odoo.sh at https://<subdomain>.odoo.sh, or self-hosted at your domain) and autodetects whether to use XML-RPC or JSON-2 based on the Odoo version. It authenticates using an API key paired with a username, and because Odoo has no production webhooks, it polls on a schedule tied to your payroll calendar.

Related integrations

Connect Odoo and ADP

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

Get started