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.
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
More Odoo integrations
Other systems that connect to ADP
Connect Odoo and ADP
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started