ml-connector
QuickBooks DesktopSAP SuccessFactors

QuickBooks Desktop and SAP SuccessFactors integration

QuickBooks Desktop is your on-premises general ledger. SAP SuccessFactors is your cloud HR system. Connecting them keeps your employee roster and cost center structure in QuickBooks Desktop synchronized with the hires, terminations, and role changes in SuccessFactors. New hires flow into QuickBooks Desktop as employee records, terminations mark records inactive, and cost center changes ensure payroll allocations land on the correct accounts.

How QuickBooks Desktop works

QuickBooks Desktop exposes vendors, customers, accounts, employees, and bills through SOAP QBXML over HTTPS. Authentication uses a session-token handshake: a customer-hosted QBWC agent calls your remote SOAP endpoint with username and password, your service returns a session GUID, and subsequent QBXML requests in that session use the token. QuickBooks must be open and logged into the company file for QBWC to process requests. Polling is the only sync mechanism, with QBWC calling your service on a configurable interval (minimum 1 minute, typical 5-15 minutes). Changes are detected using ModifiedDateRangeFilter, and deleted transactions are found via TxnDeletedQueryRq. No OAuth is required, and no Intuit app registration is needed.

How SAP SuccessFactors works

SAP SuccessFactors exposes employees, jobs, cost centers, and organizational structure through REST OData V2 endpoints. Authentication uses OAuth2 with SAML Bearer assertion: sign a SAML assertion with your private key and POST it to the token endpoint to receive a 24-hour Bearer token. The datacenter-specific base URL (such as api4.successfactors.com for US East) must be determined from the customer's login URL. Key entities include PerPerson for employees, EmpJob for job assignments, FOCostCenter for cost centers, and FODepartment for departments. SuccessFactors can push events via configured webhooks for predefined lifecycle events like NewHire and Termination, though pull-based delta sync using lastModifiedDateTime is the more reliable integration pattern.

What moves between them

The primary flow runs from SAP SuccessFactors into QuickBooks Desktop. After each payroll cycle or on a schedule you define, ml-connector reads active employees and terminated employees from SuccessFactors, writes them into QuickBooks Desktop as employee records (or marks them inactive if terminated), and syncs cost centers and departments as dimensions for payroll allocation. Cost center data flows in both directions to ensure QuickBooks Desktop employees are tagged with valid cost centers. No financial data flows backwards into SuccessFactors, since SuccessFactors has no AP or GL module.

How ml-connector handles it

ml-connector handles the very different authentication models: it stores both the QBWC credentials (username and password for the SOAP handshake) and the SuccessFactors OAuth2 SAML keypair encrypted, signs new SAML assertions daily before they expire, and manages the session-token lifecycle on the QuickBooks Desktop side. Because QuickBooks Desktop is a local Windows installation, ml-connector polls on your configured schedule rather than relying on webhooks. On each poll, it reads new and updated employees from SuccessFactors (using lastModifiedDateTime), transforms them to the QuickBooks Desktop Employee entity (matching PerPerson to Name, EmpJob to JobTitle, FOCostCenter to a custom field or linked vendor cost code), and uses the QBXML EditSequence mechanism to safely update existing records without conflicts. Terminations become inactive records in QuickBooks Desktop; new hires create new Employee records. QBXML queries must be paginated under the 60-second timeout, so ml-connector splits large employee batches. Every operation carries an audit trail, and failed writes can be replayed once the downstream conflict is resolved.

A real-world example

A mid-sized professional services firm runs QuickBooks Desktop at the home office for accounting and cost allocation, and uses SAP SuccessFactors for 150 consultants across three offices. Before the integration, the HR team manually exported the employee roster and cost center assignments from SuccessFactors each month and handed them to accounting, who re-entered the changes into QuickBooks Desktop by hand to keep timesheets and indirect cost tracking accurate. New hires took days to flow through, and terminations sometimes left stale employees in the system. With SuccessFactors and QuickBooks Desktop connected, each payroll cycle the active consultant roster and their assigned cost centers sync automatically into QuickBooks Desktop, the onboarding and offboarding workflows mark records active or inactive in QuickBooks Desktop within hours, and the accounting team no longer spends time on manual re-entry.

What you can do

  • Sync active and terminated employees from SAP SuccessFactors into QuickBooks Desktop Employee records, with automatic inactive marking on termination.
  • Map SuccessFactors cost centers and departments to QuickBooks Desktop custom fields or vendor cost allocations so payroll stays assigned to the right accounts.
  • Handle QuickBooks Desktop QBWC session authentication and EditSequence version control to prevent conflicts when multiple systems touch the same records.
  • Poll on a schedule tied to your payroll or HR cycle with automatic SAML token refresh and paginated queries to handle the 60-second QBXML timeout.
  • Maintain a complete audit trail of every employee and cost center sync, with the ability to replay failed writes once downstream issues are resolved.

Questions

Does data flow both ways between QuickBooks Desktop and SAP SuccessFactors?
No, the flow is one-way from SuccessFactors into QuickBooks Desktop. Employee records, job titles, and cost centers flow from SuccessFactors into QuickBooks Desktop so accounting can allocate labor costs and timesheets correctly. QuickBooks Desktop is not the system of record for HR data, so changes made directly in QuickBooks Desktop do not flow back to SuccessFactors.
Why is polling necessary instead of webhooks from SuccessFactors?
QuickBooks Desktop runs on the customer's Windows machine and has no inbound internet capability. The QBWC agent on the customer's machine calls out to your service on a schedule, so ml-connector must poll SuccessFactors on that same outbound rhythm. SuccessFactors webhooks can push events, but they are not required; pull-based sync with lastModifiedDateTime is reliable and eliminates the need to register endpoint URLs with the customer's SuccessFactors tenant.
What happens if a QuickBooks Desktop employee record is edited locally while ml-connector is syncing from SuccessFactors?
QuickBooks Desktop requires the EditSequence field (a version counter) to be current before any update succeeds. ml-connector queries the employee record to get the current EditSequence before writing, so concurrent edits are prevented by re-fetching; if a local edit happens between the read and the write, the QBXML update fails and ml-connector retries on the next polling cycle.

Related integrations

Connect QuickBooks Desktop and SAP SuccessFactors

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

Get started