ml-connector
OdooPaychex

Odoo and Paychex integration

Odoo runs your accounting, purchasing, and HR. Paychex runs your payroll and workforce. Connecting the two keeps your HR records and payroll data aligned, and brings payroll GL postings into Odoo so your labor costs post to the right accounts without re-keying. New hires and terminations flow from Paychex into Odoo, and payroll allocations stay synchronized across both systems. ml-connector handles the different authentication methods and moves data on a schedule you control.

How Odoo works

Odoo exposes employees, cost centers, accounting dimensions, GL accounts, and partner records through XML-RPC over HTTP POST at {base_url}/xmlrpc/2/object, and through JSON-2 REST at {base_url}/json/2/<model>/<method> on Odoo 19+. Authentication uses an API key paired with a username; XML-RPC obtains a session uid first, while JSON-2 passes the API key as a Bearer token. Polling with write_date filters is the recommended approach for production integrations, since Odoo webhooks via Automated Actions require Enterprise edition with Studio and lack HMAC signature verification.

How Paychex works

Paychex Flex exposes workers, jobs, locations, payroll components, checks, and pay periods through REST APIs at https://api.paychex.com. Authentication uses OAuth2 Client Credentials; every request requires a bearer token obtained from the token endpoint. Paychex publishes webhook events through event domains like WRKR_DEM (worker demographic), WRKR_EMPL (worker employment), and CLT_ACCESS (client access), but webhook payloads contain only notification metadata; full data must be fetched via GET endpoints. Webhook security uses Basic Auth, API Key, OAuth2, or OAuth2 Basic, but no HMAC signature. Paychex retries webhook deliveries every 5 minutes on non-2XX responses.

What moves between them

The main data flow is Paychex into Odoo. Workers, jobs, locations, and pay components from Paychex are synced into Odoo's HR and accounting models so headcount and payroll dimensions remain in agreement. If your Paychex instance generates payroll GL postings, ml-connector can read those transactions and post them into Odoo's general ledger, allocated to Odoo cost centers and GL accounts. Worker changes are triggered by Paychex webhook events; reference data is aligned on a regular schedule to catch updates that occur outside webhooks.

How ml-connector handles it

ml-connector stores Odoo API keys and Paychex OAuth2 credentials encrypted per customer, and obtains Paychex bearer tokens proactively so webhook delivery latency does not cause token-expiry failures. It translates Paychex webhook events for workers, jobs, and locations into Odoo hr.employee, hr.job, and account.analytic.account record creations and updates. Since Odoo's API respects integration user access rights and record rules, ml-connector provisions an integration user with HR and accounting permissions before syncing. Payroll GL postings are mapped to existing Odoo GL accounts and cost centers, so postings land on valid accounts. Rate limiting is handled with exponential backoff and retry. Every record carries an audit trail and can be replayed if a downstream call fails.

A real-world example

A mid-sized service company runs Odoo for accounting and HR, and Paychex Flex for payroll across three regional offices. Before the integration, the HR team exported worker and job data from Paychex manually and entered it into Odoo, and the accounting team received payroll GL summaries separately and posted them by hand into the general ledger. Month-end close required chasing differences between Paychex payroll totals and Odoo labor accounts. With Odoo and Paychex connected, new hires and location changes flow directly into Odoo, job records stay synchronized, and payroll journals post into Odoo's GL automatically allocated to the correct offices. Month-end close starts with labor accounts already balanced.

What you can do

  • Sync Paychex workers into Odoo HR employees so headcount stays aligned across both systems.
  • Sync Paychex jobs and locations into Odoo so payroll allocation dimensions are always current.
  • Post Paychex payroll GL documents into Odoo's general ledger allocated to the correct GL accounts and cost centers.
  • Authenticate Odoo with API keys and Paychex with OAuth2, with secure encrypted credential storage and token refresh.
  • Process Paychex webhook events for worker changes in near real-time, with full audit trail and replay capability on every record.

Questions

Which direction does data move between Odoo and Paychex?
The main flow is Paychex into Odoo. Workers, jobs, locations, and pay components move from Paychex into Odoo's HR and accounting models, so both systems stay aligned on headcount and payroll allocation dimensions. Payroll GL documents generated by Paychex can also be posted into Odoo's general ledger. Odoo HR and GL data does not flow back to Paychex.
How does ml-connector handle the different authentication methods?
Odoo uses API keys paired with username login; Paychex uses OAuth2 Client Credentials. ml-connector stores both credential sets encrypted and obtains Paychex bearer tokens proactively before they expire so webhook delivery latency does not cause authentication failures. Odoo API keys and usernames are sent with every request as documented in Odoo's API.
What happens when a worker is hired or terminated in Paychex?
Paychex sends a webhook event notification to ml-connector when a worker is added (WRKR_DEM) or employment changes (WRKR_EMPL). ml-connector fetches the full worker record from Paychex and creates or updates the matching Odoo hr.employee record, including job, location, and other details. If the Odoo integration user lacks HR permissions, the update fails and is recorded in the audit log for replay.

Related integrations

Connect Odoo and Paychex

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

Get started