ml-connector
QuickBooks OnlineSAP SuccessFactors

QuickBooks Online and SAP SuccessFactors integration

QuickBooks Online tracks company finances and payroll, while SAP SuccessFactors is the system of record for employees and compensation. When a new hire starts in SuccessFactors, they should appear in QuickBooks Online so payroll is set up. When someone is terminated in SuccessFactors, the same change should flow into QuickBooks Online to stop duplicate entries. ml-connector bridges the two systems and moves the records on a schedule you control.

How QuickBooks Online works

QuickBooks Online exposes Employees, Vendors, Customers, Accounts, Classes, Departments, Bills, JournalEntries, and other accounting entities through the QuickBooks Online Accounting API v3 at https://quickbooks.api.intuit.com/v3/company/{realmId}. Authentication uses OAuth 2.0 Authorization Code flow with 1-hour access tokens and refresh tokens that rotate every 24-26 hours. The platform supports webhooks for Create, Update, Delete, Merge, and Void operations on most entities, though webhook payloads contain only the entity ID and require a follow-up GET to fetch the full record. Change-data-capture polling is also available at the cdc endpoint with 30-day history. Requires exact object representation with SyncToken for concurrency control on all creates and updates.

How SAP SuccessFactors works

SAP SuccessFactors exposes employee and organizational data through OData V2 and V4 endpoints at datacenter-specific hostnames like https://api4.successfactors.com/odata/v2. Authentication uses OAuth 2.0 with SAML Bearer Assertion: sign a SAML assertion with an RSA private key and POST it to https://<api-host>/oauth/token to get a 24-hour bearer token. Webhooks can push HR lifecycle events (NewHire, Termination, JobInfoChange) via Intelligent Services configured in the Admin Center UI, though the recommended pattern is pull-only via delta sync using lastModifiedDateTime filter. SuccessFactors enforces a max of 10 concurrent threads per client and returns HTTP 429 or 503 when throttled. Hard deletes are not supported; employees are deactivated instead. Default page size is 20 records, max 1000 - requests must explicitly set $top=1000 or records will be silently missed.

What moves between them

New hires and terminations flow from SAP SuccessFactors into QuickBooks Online. When an employee is added in SuccessFactors Employee Central, ml-connector reads the PerPerson and EmpJob records and creates a corresponding Employee in QuickBooks Online. When an employee is terminated in SuccessFactors, ml-connector updates the matching QuickBooks Online Employee to inactive status. Cost centers (FOCostCenter) from SuccessFactors are mapped to Classes in QuickBooks Online so that payroll allocations land on the correct department. The sync runs on a cadence you control, typically aligned with your payroll calendar.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the QuickBooks Online side, it holds the OAuth 2.0 refresh token and automatically refreshes the access token when it expires. On the SuccessFactors side, it holds the RSA private key used to sign SAML assertions, generates a fresh assertion on each authentication attempt, and manages the 24-hour bearer token across multiple API calls. When SuccessFactors returns HTTP 429 or 503, ml-connector backs off exponentially and retries. The integration polls SuccessFactors for new and changed employees using the lastModifiedDateTime filter to avoid re-processing old records, maps each SuccessFactors employee to the correct QuickBooks Online Employee via a unique identifier (such as employee ID), and ensures SuccessFactors cost centers are pre-mapped to QuickBooks Online Classes before employee records are created. Because QuickBooks Online requires exact object representation with SyncToken for updates, ml-connector fetches the current Employee record, increments the SyncToken, and includes it in the PATCH. Every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A mid-sized professional services firm runs QuickBooks Online for accounting and uses SAP SuccessFactors for core HR across multiple offices in different regions. Before the integration, the finance team manually created employee records in QuickBooks Online whenever HR notified them of a new hire, and forgot to deactivate departing employees, resulting in duplicate payroll entries and reconciliation chaos. SuccessFactors cost centers (one per office location) were never reliably mapped to QuickBooks Online Classes, making it impossible to see labor costs by location. With QuickBooks Online and SAP SuccessFactors connected, every new hire in SuccessFactors automatically creates an Employee in QuickBooks Online, terminations are reflected instantly, and cost center allocations are enforced consistently. The finance team no longer manually enters employee records and can track labor costs accurately by location.

What you can do

  • Sync new hires from SAP SuccessFactors into QuickBooks Online as Employees on a schedule tied to your payroll calendar.
  • Mark employees as inactive in QuickBooks Online when they are terminated in SAP SuccessFactors.
  • Map SAP SuccessFactors cost centers to QuickBooks Online Classes so payroll allocations are accurate and auditable.
  • Manage OAuth 2.0 refresh tokens for QuickBooks Online and SAML Bearer Assertion token refresh for SAP SuccessFactors automatically.
  • Retry failed syncs with exponential backoff and maintain a full audit trail for every employee record moved.

Questions

Which direction does employee data flow between QuickBooks Online and SAP SuccessFactors?
The flow is from SAP SuccessFactors into QuickBooks Online. New hires and terminations in SuccessFactors are reflected in QuickBooks Online. Cost centers are mapped in both directions to ensure payroll allocations are consistent. QuickBooks Online is updated but not written back to SuccessFactors.
How does ml-connector handle the SAML Bearer Assertion authentication that SAP SuccessFactors requires?
ml-connector stores your RSA private key encrypted in its credential vault. When it needs to authenticate to SuccessFactors, it generates a fresh SAML assertion, signs it with the private key, and exchanges it for a 24-hour bearer token. The token is reused across multiple API calls within that 24-hour window and refreshed automatically when it expires.
What happens when QuickBooks Online or SAP SuccessFactors is temporarily unavailable?
ml-connector backs off exponentially and retries failed calls. When SuccessFactors returns HTTP 429 (throttled), ml-connector waits and tries again. Every synced record is logged in an audit trail so failed or partial syncs can be replayed once the system is back online.

Related integrations

Connect QuickBooks Online and SAP SuccessFactors

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

Get started