ml-connector
OdooPaylocity

Odoo and Paylocity integration

Odoo runs your purchasing, inventory, and finance. Paylocity runs payroll and HR for your US workforce. Connecting the two keeps employee records and payroll GL in sync. New hires and terminations in Paylocity flow into Odoo, and payroll journals post into Odoo's general ledger after each pay run without manual entry. ml-connector bridges the very different APIs and keeps both systems in agreement throughout the pay cycle.

How Odoo works

Odoo exposes employees, general ledger accounts, analytical accounts, purchase orders, and vendor invoices through XML-RPC (traditional) or JSON-2 (Odoo 19+) HTTP POST APIs. Authentication uses an API key paired with username login, with the API key passed in the Authorization header for JSON-2 or included in subsequent calls for XML-RPC. Odoo Online instances use https://<subdomain>.odoo.com as the base URL, while self-hosted and Odoo.sh deployments use their own domain. Odoo has no native webhooks suitable for production, so records are read by polling using write_date filters with a high-water-mark timestamp.

How Paylocity works

Paylocity exposes employees, pay statements, earnings, deductions, and companies through REST JSON APIs at https://api.paylocity.com/api/v2. Authentication uses OAuth2 client credentials, exchanging a client_id and client_secret for a 3600-second Bearer token. Paylocity publishes webhook events for New Hire, Employee Change, Termination, and Payroll Processed on HTTPS POST, though event payloads carry identifiers only and require follow-up API calls to fetch full record details. Webhook retries attempt delivery for up to 24 hours with 30-minute intervals on failure.

What moves between them

The primary flow is from Paylocity into Odoo. After each payroll run, ml-connector reads Paylocity payroll processed events and fetches the full pay statement and earnings details, then posts the labor cost totals into Odoo's general ledger accounts. Employee records flow both directions: new hires and terminations in Paylocity trigger Odoo employee creates or termination records, while active employees are periodically synced to keep role and department data current. Reference data such as work locations and pay grades are aligned so Odoo has a current directory of your workforce.

How ml-connector handles it

ml-connector stores both Odoo API key and Paylocity client credentials encrypted. For Odoo, it uses the api_key authentication method (recommended for Odoo 14+) and respects the XML-RPC or JSON-2 protocol available in your instance. For Paylocity, it exchanges the client_secret for an OAuth2 Bearer token before each request window and handles token refresh when calls return 401. ml-connector polls Odoo employees and GL accounts on a daily or weekly cadence, using write_date filters to fetch only changed records since the last run. It subscribes to Paylocity webhook events for immediate employee changes and payroll completion, and also polls as a backup in case an event webhook is missed or delayed. Payroll journals are mapped to the matching Odoo GL accounts before posting, and every record carries a full audit trail so a failed downstream call can be replayed without duplication.

A real-world example

A mid-sized US services firm runs Odoo for accounting and procurement, and Paylocity for payroll and benefits across two offices. Before the integration, payroll journal entries were exported from Paylocity as CSV and manually re-entered into Odoo's general ledger each month, a process that introduced keying errors and delayed month-end close. Employee changes in Paylocity were not reflected in Odoo, so the HR directory was out of sync and POs sometimes went to terminated employees. With Odoo and Paylocity connected, payroll GL posts automatically after each run, mapped to the correct GL accounts, and employee hires and terminations sync in minutes rather than weeks. Month-end close is faster and payroll data is always current.

What you can do

  • Sync new hires and terminations from Paylocity into Odoo employee records and update active employee data automatically.
  • Post Paylocity payroll GL entries into Odoo's general ledger after each pay run, mapped to the correct accounts.
  • Handle Odoo API key authentication and Paylocity OAuth2 token management with automatic token refresh.
  • Subscribe to Paylocity webhook events for immediate employee and payroll changes, with polling as a backup.
  • Track every record in a full audit trail and replay failed GL postings without duplication.

Questions

What authentication does ml-connector use for Odoo and Paylocity?
For Odoo, ml-connector uses API key authentication (recommended for Odoo 14 and later) paired with your username. For Paylocity, it uses OAuth2 client credentials to obtain a Bearer token before each request, handling token refresh automatically when needed. Both credential sets are stored encrypted.
Does the integration rely on webhooks or polling?
ml-connector uses both. It subscribes to Paylocity webhook events for immediate employee and payroll changes, which are usually delivered within minutes. It also polls both Odoo and Paylocity on a regular schedule as a backup, ensuring no changes are missed if a webhook delivery fails or is delayed.
How does ml-connector avoid duplicate payroll GL postings in Odoo?
Every record, including GL postings, carries a unique identifier and audit trail. ml-connector checks the audit log before posting, and if a GL entry for a pay run already exists, it skips the duplicate. If a posting fails midway, the audit record allows the full flow to be replayed safely on the next cycle.

Related integrations

Connect Odoo and Paylocity

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

Get started