ml-connector
OdooBambooHR

Odoo and BambooHR integration

Odoo runs your enterprise resource planning across finance, inventory, purchasing, and HR. BambooHR runs your people data and HR workflows. Connecting the two keeps your employee records, job titles, and compensation aligned. When a new hire enters Odoo, their record flows to BambooHR so benefits, time-off, and payroll can begin. When employment status or compensation changes in either system, ml-connector propagates the change to keep both systems current and prevent data silos between finance and HR.

How Odoo works

Odoo exposes employee records, job information, compensation history, departments, and analytic accounts (cost centers) through its REST JSON-2 API, available on Odoo 19 and later, or via the older XML-RPC protocol on earlier versions. Authentication uses an API key paired with a username login call to obtain a session identifier. The Odoo API respects the integration user's access rights and record rules, so the scope of what ml-connector can read depends on the user role configured in Odoo. Odoo does not expose webhooks in core editions, so ml-connector polls the API on a schedule, using write_date filtering to fetch only changed records since the last sync.

How BambooHR works

BambooHR exposes employee records, employment status, job information, compensation, and benefits through a REST API at a customer-specific subdomain. Authentication uses OAuth 2.0 Authorization Code flow (recommended for new integrations) or legacy API key via Basic Auth, and access tokens expire after one hour. BambooHR webhooks can notify ml-connector when employees are created, updated, or deleted, allowing two-way sync to detect upstream changes. Webhook payloads are lightweight and require a follow-up API call to fetch full employee details, and all webhooks are signed with SHA-256 HMAC for validation.

What moves between them

Employee records flow from Odoo to BambooHR on a schedule you define, typically daily or weekly. ml-connector matches employees by email address, so an email change in either system requires manual reconciliation. Job title, department, and compensation are synced from Odoo to BambooHR to keep HR systems current with organizational changes. When BambooHR webhooks are enabled, employment status changes (termination, rehire) flow back to Odoo, allowing finance systems to align headcount and cost allocations. Reference data such as departments and job codes are kept in sync so payroll allocations land on valid organizational dimensions.

How ml-connector handles it

ml-connector stores both API credentials encrypted and retrieves Odoo employee records using JSON-2 API calls filtered by write_date to find only changed records since the last sync. It then queries BambooHR to find matching employees by email, and updates or creates employee records with the Odoo job title, department, and compensation data. BambooHR's OAuth 2.0 token is refreshed automatically when it expires (1 hour), and ml-connector validates webhook signatures using SHA-256 HMAC to ensure incoming employee changes are authentic. When BambooHR webhooks signal an employee update, ml-connector fetches the full employee record and propagates employment status and compensation back to Odoo, allowing two-way sync. Email is the stable match key - if email changes in either system without corresponding update in the other, the employee record creates a duplicate until manually reconciled. Every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A mid-sized manufacturing company runs Odoo for accounting, inventory, and purchasing, and uses BambooHR for HR, payroll, and benefits administration across three locations. Before the integration, the HR manager manually exported employee lists from Odoo every month and uploaded changes to BambooHR by hand, causing delays when new hires started or roles changed. The finance team in Odoo had stale headcount data and struggled to allocate labor costs to the right departments and cost centers. With Odoo and BambooHR connected, employee data syncs automatically so BambooHR reflects new hires and role changes within hours, and finance in Odoo stays current with real organizational structure. The manual export-and-upload step is gone, and both teams see the same employee roster.

What you can do

  • Sync employees from Odoo to BambooHR, matching by email address and updating job title, department, and compensation.
  • Monitor BambooHR webhooks to detect employment status changes and propagate terminations and rehires back to Odoo.
  • Authenticate Odoo with API key and BambooHR with OAuth 2.0, refreshing BambooHR's access token automatically when it expires.
  • Poll Odoo on a schedule you control using write_date filtering to fetch only changed records since the last sync.
  • Track which records have been synced and maintain a full audit trail so any record can be replayed if a downstream call fails.

Questions

Which direction does employee data move between Odoo and BambooHR?
Employee records flow primarily from Odoo to BambooHR so job title, department, and compensation stay current in your HR system. When BambooHR webhooks are enabled, employment status changes such as terminations and rehires flow back to Odoo so finance systems stay aware of headcount changes and can adjust cost allocations. Email is the match key, so email changes in either system without a corresponding update in the other create duplicate records.
How does ml-connector handle Odoo's lack of native webhooks?
ml-connector polls the Odoo API on a schedule you define, typically daily or weekly, using write_date filtering to fetch only changed records since the last sync. This avoids constant querying and keeps API usage low. BambooHR webhooks are optional - when enabled, they notify ml-connector of employee updates within minutes, allowing faster two-way sync. Without webhooks, changes in BambooHR will be detected on the next Odoo polling cycle.
What happens if an employee email address changes?
Email is the stable match key between Odoo and BambooHR. If an employee email changes in one system without a corresponding update in the other, ml-connector will treat the old and new email as separate employees and create a duplicate record. This requires manual reconciliation in both systems. Planning email changes across both systems at the same time, or updating both systems first before re-enabling the sync, avoids duplicates.

Related integrations

Connect Odoo and BambooHR

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

Get started