ml-connector
Sage IntacctSAP SuccessFactors

Sage Intacct and SAP SuccessFactors integration

Sage Intacct runs your general ledger and accounts payable. SAP SuccessFactors manages your workforce and compensation. Connecting them keeps your chart of accounts aligned with your actual headcount and cost structure. When SuccessFactors records a new hire or termination, that person flows into Intacct's dimensions so payroll can post labor costs to the right GL accounts and cost centers. Cost center and department definitions are kept in sync in both directions, so allocations always land on valid lines.

How Sage Intacct works

Sage Intacct is a cloud-based ERP and accounting system that exposes vendors, AP bills, AP payments, GL accounts, and dimensions through a single XML gateway endpoint at https://api.intacct.com/ia/xml/xmlgw.phtml. Authentication is session-based: a senderId, senderPassword, companyId, userId, and userPassword exchange into a sessionid via an initial getAPISession call, and the session is cached for 50 minutes before refresh. Intacct does not offer webhooks, so all data flows are polling-driven or manual. Sessions are isolated per senderId, companyId, and userId in-process, and HTTP 200 responses may contain application-level errors that must be parsed from XML body tags rather than relying on HTTP status alone.

How SAP SuccessFactors works

SAP SuccessFactors is a Human Capital Management platform where Employee Central is the system of record for employees, jobs, organization structure, cost centers, and compensation. It exposes these entities via REST OData V2 and V4 at a datacenter-specific base URL (e.g., https://api4.successfactors.com/odata/v2) and authenticates with OAuth 2.0 SAML Bearer assertion by signing a SAML assertion with an RSA private key and exchanging it for a 24-hour Bearer token. X.509 mutual TLS is supported on newer datacenters as an alternative. Webhooks are not programmatically subscribed; intelligent Services events are configured through the Admin Center UI for predefined HR lifecycle events. Pull-only via delta sync using lastModifiedDateTime filters is the recommended approach, and the API enforces a maximum of 10 concurrent threads per client and an OData page size of 20 records with a maximum of 1000.

What moves between them

Employee and cost center records flow from SAP SuccessFactors into Sage Intacct. When a new hire is added to SuccessFactors or a termination is processed, ml-connector pulls those changes via OData query filtering on lastModifiedDateTime and posts the dimensions and GL account mappings into Intacct. Cost centers and departments are aligned in both directions so payroll posting always references valid GL accounts and cost center codes. SuccessFactors employee data is the authority; Intacct dimensions are updated to match, never the reverse.

How ml-connector handles it

ml-connector manages OAuth 2.0 SAML Bearer token generation and refresh for SuccessFactors, signing the SAML assertion with the customer's private key and obtaining 24-hour tokens that are refreshed before expiry. On the Intacct side, it handles session-based authentication with the initial getAPISession call, caches the sessionid for the full 50-minute window, and refreshes on expiry. It polls SuccessFactors using OData filters on lastModifiedDateTime to retrieve only changed employees and cost centers, respects the OData page size limit of 1000 records per request, and handles HTTP 429 throttle responses by backing off and retrying. All data destined for Intacct is serialized into XML, with forbidden XML control characters stripped before entity reference escaping. Each record carries the uniqueid flag for server-side deduplication on retried operations. Cost center and employee mappings are validated against the Intacct dimension hierarchy before posting, so a GL account mismatch fails gracefully with a full audit trail rather than posting to a wrong account.

A real-world example

A mid-sized professional services firm runs Sage Intacct for general accounting and project cost tracking, and uses SAP SuccessFactors for HR and compensation management across three regional offices. Before the integration, the finance team manually exported employee lists and cost center assignments from SuccessFactors each month and re-entered them into Intacct's dimensions so payroll allocations would land on the correct GL accounts and cost center codes. New hires were missed in the GL for weeks until someone noticed, and terminated employees lingered in the GL until a separate cleanup run. With SuccessFactors and Intacct connected, every hire and termination automatically flows into Intacct dimensions, cost center changes in HR are reflected in the GL within polling intervals, and month-end close begins with headcount and cost structure already reconciled. The manual export-and-re-enter step is eliminated.

What you can do

  • Sync SuccessFactors employees, jobs, and cost centers into Sage Intacct GL dimensions and account mappings.
  • Authenticate SAP SuccessFactors with OAuth 2.0 SAML Bearer assertion and Sage Intacct with session-based auth, managing token refresh and session expiry.
  • Pull employee and cost center changes from SuccessFactors using OData delta sync with lastModifiedDateTime filters, respecting page size limits and throttle responses.
  • Serialize all records into Intacct's XML format, stripping forbidden control characters and validating GL account and cost center references before posting.
  • Maintain a full audit trail on every employee and cost center record, with deduplication on retry via the Intacct uniqueid flag.

Questions

Which direction does data move between SuccessFactors and Intacct?
Employee and cost center records flow from SAP SuccessFactors into Sage Intacct. ml-connector polls SuccessFactors for hires, terminations, and cost center changes, then posts those dimension updates into Intacct so payroll allocations land on valid GL accounts. Cost centers are the authority in SuccessFactors; Intacct dimensions are updated to match. Financial records, GL accounts, and AP data never move back to SuccessFactors.
How does the integration handle SuccessFactors' OAuth token and Intacct's session-based auth?
ml-connector generates SAML assertions signed with the customer's RSA private key and exchanges them for SuccessFactors' 24-hour Bearer tokens, managing refresh before expiry. On the Intacct side, it exchanges senderId, senderPassword, companyId, userId, and userPassword for a sessionid via the getAPISession call, caches that session for the full 50-minute lifetime, and refreshes on expiry. Both auth flows are handled transparently; retries use the same cached session or token until expiry.
What happens if an employee or cost center in SuccessFactors does not map to a valid Intacct GL account?
Before posting any dimension or cost center update, ml-connector validates the GL account and cost center references against the Intacct hierarchy. If a reference is invalid, the record fails validation with a detailed audit entry explaining the mismatch, and no partial or wrong-account posting occurs. The customer can correct the mapping in SuccessFactors or Intacct and retry without manual re-keying.

Related integrations

Connect Sage Intacct and SAP SuccessFactors

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

Get started