Odoo and SAP SuccessFactors integration
Odoo manages your finance, procurement, and inventory. SAP SuccessFactors manages your workforce and compensation. Connecting them keeps your employee roster and cost centers synchronized between systems, so new hires in SuccessFactors appear in Odoo's HR module with the correct cost center assignment, and compensation changes in SuccessFactors are reflected in Odoo for payroll and GL mapping. ml-connector handles the different authentication schemes on each side and moves the data on a schedule you control.
What moves between them
Employee records flow primarily from SAP SuccessFactors into Odoo. New hires and terminations in SuccessFactors are synced to Odoo's HR module, along with employee names, email addresses, phone numbers, and employment status. Job assignments and cost center codes flow from SuccessFactors so that employees in Odoo are correctly assigned to cost centers for payroll and GL allocation. Cost center and department codes are synchronized in both directions to ensure that Odoo's GL dimensions match SuccessFactors' organizational structure. Compensation data is read from SuccessFactors to inform payroll calculations in Odoo but is not written back.
How ml-connector handles it
ml-connector stores both credential sets encrypted and generates the SAML assertion required by SuccessFactors on each API session, signing it with your RSA private key to request a 24-hour OAuth2 bearer token. On the Odoo side it accepts the full instance URL (Odoo Online, Odoo.sh, or self-hosted) and API key, and validates that the integration user has access to the HR and accounting modules. Because both systems are pull-only, ml-connector polls Odoo and SuccessFactors on a schedule tied to your HR calendar rather than relying on webhooks. It uses write_date on Odoo and lastModifiedDateTime on SuccessFactors to fetch only changed records since the last sync, reducing API volume. SuccessFactors enforces a maximum of 10 concurrent API threads per client, so ml-connector issues requests serially and backs off on HTTP 429 or 503 throttle responses. Employee records in SuccessFactors are deactivated but never deleted, so ml-connector checks the employment status field to reflect terminations in Odoo. The OData V2 datetime format is unusual (milliseconds since epoch in responses), so ml-connector converts it to ISO 8601 for Odoo. Cost centers and departments are mapped first, so every employee record references a cost center that already exists in Odoo before the employee is created.
A real-world example
A mid-sized manufacturing company runs Odoo for accounting, purchasing, and inventory, and uses SAP SuccessFactors for HR and payroll across three regions and a head office. Before the integration, the HR team manually exported employee changes from SuccessFactors each week and emailed them to the finance team, who entered them into Odoo's HR module by hand and had to hunt for the correct cost center code in SuccessFactors each time. With Odoo and SuccessFactors connected, employee changes flow automatically every day, each employee is assigned to the correct cost center without manual lookup, and the finance team's GL cost center allocations are always based on current organizational structure. The manual data entry step is eliminated, and the two systems stay in agreement without ongoing effort.
What you can do
- Sync new hires, terminations, and employee updates from SAP SuccessFactors into Odoo's HR module automatically.
- Map employee job assignments to cost centers in Odoo so GL postings land on the correct organizational dimension.
- Keep cost center codes and department structures synchronized between Odoo and SuccessFactors in both directions.
- Authenticate SAP SuccessFactors with OAuth2 SAML Bearer Assertion and handle datacenter-specific API hostnames, and Odoo with API key and username.
- Poll on a configurable schedule with write_date and lastModifiedDateTime filters, retries on throttle, and a full audit trail on every record.
Questions
- Which direction does data move between Odoo and SAP SuccessFactors?
- The main flow is from SAP SuccessFactors into Odoo. Employee records, job assignments, and cost center codes move from SuccessFactors into Odoo's HR and accounting modules. Cost centers and departments are synchronized in both directions so organizational structure stays aligned. Compensation data is read from SuccessFactors to support payroll in Odoo but is not written back.
- How does ml-connector handle SAP SuccessFactors' OAuth2 SAML Bearer Assertion authentication?
- ml-connector stores your RSA private key encrypted and generates a signed SAML assertion on each API session, then exchanges it for a 24-hour OAuth2 bearer token. The assertion includes a timestamp and signed digest, so ml-connector requests a fresh token before the 24-hour expiry window closes. This means your private key never leaves the encrypted credential store.
- What happens if SAP SuccessFactors returns a throttle response or Odoo is temporarily unavailable?
- ml-connector backs off and retries on HTTP 429 or 503 throttle responses from SuccessFactors, respecting the system's 10-concurrent-thread limit by issuing API requests serially. If Odoo is temporarily unavailable or returns an error, ml-connector queues the record for replay so no data is lost when the system recovers.
Related integrations
More Odoo integrations
Other systems that connect to SAP SuccessFactors
Connect Odoo and SAP SuccessFactors
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started