Odoo and UKG integration
Odoo runs your ERP and general ledger. UKG runs payroll and workforce management. Connecting them keeps your labor costs and headcount aligned. After each payroll run, payroll GL documents flow from UKG into Odoo's chart of accounts, mapped to cost centers and departments. Employee records sync from UKG into Odoo so headcount reflects hires, terminations, and status changes. ml-connector bridges the two distinct authentication systems and schedules the sync to match your payroll calendar.
What moves between them
The main flow is UKG into Odoo. After each payroll run, ml-connector reads UKG's GL export data from /services/payroll/v1/thirdpartypay and posts labor cost journals into Odoo's general ledger, mapped to Odoo cost centers and GL accounts. Employee records flow from UKG into Odoo to keep headcount aligned with hires, terminations, and rehires. Cost centers and departments are synchronized in both directions so payroll allocations reference valid Odoo GL dimensions. Payroll GL documents are read-only in UKG, so ml-connector does not write financial entries back to payroll.
How ml-connector handles it
ml-connector stores Odoo API key and UKG OAuth client credentials encrypted and handles the distinct authentication flows on each side: UKG OAuth tokens expire in 1 hour, so ml-connector refreshes the token before each request and tracks expiry to avoid silent outages. For Odoo, it uses the API key with username to establish sessions over JSON-2 or XML-RPC depending on your Odoo version and passes the integration user's ID with every call. UKG's two-pass employee fetch is automatic: ml-connector calls /personnel/v1/employee-ids, then fetches the full profile for each UUID returned. Cost centers and job codes are mapped first, so every payroll journal line references a GL account and cost center that exists in Odoo. Because Odoo does not have production-grade webhooks, ml-connector polls UKG's delta endpoints and payroll exports on a schedule tied to your payroll calendar. It respects Odoo's write_date filters for efficient change detection, retries transient failures, and maintains a full audit trail so any record can be replayed if a downstream post fails.
A real-world example
A regional staffing company runs Odoo for accounting and payroll administration across three branch offices, and uses UKG Ready for workforce management, time tracking, and compensation data across their placement consultants. Before the integration, the accounting team exported payroll journal reports from UKG each pay period and manually re-entered labor costs into Odoo's general ledger by cost center, spending 4-6 hours per payroll cycle on data entry and reconciliation. With Odoo and UKG connected, payroll GL documents post automatically after each run, allocated to the correct branch and cost center. The accounting team now validates the postings in a single batch review rather than re-keying, cutting payroll close time by 80% and eliminating transcription errors.
What you can do
- Post UKG payroll GL journals and third-party pay data into Odoo's general ledger, allocated to the correct cost centers and branches.
- Sync UKG employee records, compensation details, and status changes into Odoo so headcount and organizational structure stay aligned.
- Map UKG cost centers, departments, and job codes to Odoo GL accounts and analytic accounts so payroll journals land on valid dimensions.
- Handle UKG OAuth 2.0 token refresh cycles, HTTP Basic Auth headers, and Odoo API key authentication with automatic session management.
- Poll UKG payroll exports and Odoo records on a configurable schedule with write_date filtering, retries, and a full audit trail.
Questions
- Which direction does data move between Odoo and UKG?
- The main flow is UKG into Odoo. Payroll GL journals, third-party pay data, and employee records move from UKG into Odoo, while cost centers and departments are aligned in both directions so payroll allocations reference valid Odoo GL accounts. Payroll GL documents are read-only in UKG, so ml-connector does not write financial entries back.
- How does ml-connector handle UKG's OAuth token expiry and Odoo's API key authentication?
- UKG OAuth tokens expire in 1 hour, so ml-connector refreshes the token before each request and tracks expiry to prevent silent failures. For Odoo, ml-connector stores the API key and username, uses them to establish sessions, and passes the integration user's ID with every operation so Odoo's access rules and record filters are enforced.
- Why does ml-connector use polling rather than relying on UKG webhooks?
- UKG webhooks have a 14-day event retention window, and the UKG platform recommends secondary polling for integrations that cannot tolerate event loss. ml-connector polls UKG's delta endpoints and Odoo's write_date filters on a schedule tied to your payroll calendar, ensuring no payroll GL data is missed.
Related integrations
More Odoo integrations
Other systems that connect to UKG
Connect Odoo and UKG
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started