ml-connector
Sage 100SAP SuccessFactors

Sage 100 and SAP SuccessFactors integration

Sage 100 holds your financial records and GL accounts. SAP SuccessFactors holds your employees, job assignments, and cost center allocations. Connecting the two ensures that when finance records are created in Sage 100, they reference employee cost centers and job codes that actually exist in SuccessFactors, eliminating dangling references and month-end reconciliation failures. Employee moves and cost center changes in SuccessFactors flow to Sage 100 so GL account assignments stay accurate without manual review.

How Sage 100 works

Sage 100 is an on-premises ERP that exposes AP, GL, inventory, and sales orders through SOAP eBusiness Web Services and a local Windows COM agent. The SOAP surface covers only sales orders and AR; full AP, GL, PO, and vendor access requires the local BOI COM layer wrapped by a Windows service running on the customer's server. Sage 100 has no webhooks, no OAuth, and no idempotency keys; integration requires polling via DateLastUpdated or DateCreated fields on a schedule (AP every 15 minutes, GL accounts daily). Every SOAP call passes username and password directly; the BOI agent requires Windows service account auth plus API key or mutual TLS. A three-character company code must be included in every call, and users must be individually enabled for Web Services in Sage 100 admin.

How SAP SuccessFactors works

SAP SuccessFactors is a cloud HCM system exposing employees, jobs, cost centers, and org structure through REST OData V2/V4. Every call requires OAuth 2.0 SAML Bearer assertion: register a client in Admin Center, sign a SAML assertion with an RSA private key, POST to the datacenter-specific token endpoint, and present the returned 24-hour Bearer token on each request. Concurrent requests are throttled to 10 threads per client, returning 429 or 503 when exceeded. Employee records separate into PerPerson/EmpJob (Employee Central) and User (Core HR), requiring confirmation of customer licensing. Date/time values use OData V2 non-standard format (/Date(milliseconds)/), and default page size is 20 records (must explicitly set $top=1000). Webhooks are configured through the Admin Center UI only, not via API.

What moves between them

The integration pulls employee and cost center reference data from SAP SuccessFactors every 4 hours to validate cost center codes. When Sage 100 GL journal entries or AP invoices are created, ml-connector checks that the assigned cost center exists in SuccessFactors and logs a validation result. Employee job changes in SuccessFactors are polled on the same schedule and compared against Sage 100 vendor or customer records, flagging mismatches for review. No data is written back to SuccessFactors; the flow is read-only from cloud HCM into on-premises finance.

How ml-connector handles it

ml-connector runs on or near the customer's Sage 100 server and connects outbound to the SuccessFactors OData endpoint via HTTPS. For Sage 100, it maintains the local BOI agent connection (or SOAP over HTTP where available), passing username and password per call and polling for changes using DateLastUpdated filters per entity. For SuccessFactors, it generates SAML assertions signed with the customer's registered RSA private key, POSTs to the datacenter-specific OAuth token endpoint (e.g., api4.successfactors.com/oauth/token), and caches the returned Bearer token across requests until expiry. When token refresh returns 401, it re-signs a fresh SAML assertion and re-authenticates. OData datetime filters are formatted to SuccessFactors spec (datetime'2026-01-01T00:00:00'). Cost center and FOJobCode entities are cached locally with lastModifiedDateTime tracking so subsequent polls fetch only deltas. Validation failures (cost center missing, job code mismatch) are logged with the record ID, timestamp, and recommendation for manual review. Concurrent requests to SuccessFactors respect the 10-thread throttle by queuing and backing off on 429 responses. Sage 100 COM record locks are handled with exponential backoff on collision exceptions.

A real-world example

A mid-market manufacturing company runs Sage 100 on-premises for AP, GL, and inventory across three plants. SAP SuccessFactors is their HR system of record for 200 employees, with job codes and cost centers assigned per employee. Before integration, the finance team manually reviewed GL entries weekly to confirm that cost center codes matched employee assignments in HR, and deactivated employees sometimes lingered in Sage 100 AP vendor lists. Monthly close required a spreadsheet reconciliation of cost center changes. With Sage 100 and SuccessFactors connected, each GL entry is validated against live cost center data from SuccessFactors on post, and employee status changes are reflected automatically in review reports. Close process starts with a clean cost center reconciliation, and dangling employee records are identified within 4 hours of deactivation.

What you can do

  • Validate GL and AP cost center codes against SAP SuccessFactors cost center reference data on every transaction.
  • Sync employee job assignments and cost center allocations from SuccessFactors to Sage 100 on a 4-hour poll cycle.
  • Authenticate Sage 100 SOAP calls with per-call username and password, and SuccessFactors OData with OAuth 2.0 SAML Bearer assertions.
  • Flag cost center mismatches and employee deactivations for manual review with full audit trail.
  • Handle Sage 100 on-premises architecture, SAML token refresh, and OData V2 datetime formatting transparently.

Questions

Does the integration write back to SAP SuccessFactors?
No. The flow is read-only from SuccessFactors into Sage 100. ml-connector pulls employee, job, and cost center reference data from SuccessFactors to validate GL and AP entries in Sage 100, but does not create or modify employee records or compensation data in SuccessFactors. GL postings and financial transactions remain managed within Sage 100.
How does ml-connector reach Sage 100 if it is on-premises?
ml-connector is deployed on or adjacent to the customer's Sage 100 server so it can connect to the local BOI COM layer or the local SOAP endpoint. It polls Sage 100 periodically using the customer's username and password passed directly in SOAP calls (Sage 100 does not support OAuth). If SOAP is unavailable, the BOI agent provides AP, GL, and vendor access via the local Windows COM interface.
What happens when a cost center code exists in SAP SuccessFactors but not in Sage 100?
ml-connector logs the validation failure with the transaction ID, timestamp, and the missing cost center code. The GL entry or AP invoice is not rejected; instead, the mismatch is recorded in the audit trail for the finance team to review and correct in Sage 100. This prevents silent failures and gives clear visibility into data alignment issues.

Related integrations

Connect Sage 100 and SAP SuccessFactors

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

Get started