ml-connector
Microsoft Dynamics 365 Business CentralSAP SuccessFactors

Microsoft Dynamics 365 Business Central and SAP SuccessFactors integration

Microsoft Dynamics 365 Business Central runs finance, purchasing, sales, and inventory for small and mid-market businesses. SAP SuccessFactors is the HR system of record for workers, jobs, org structure, and cost centers. Connecting the two keeps the employee list and the dimension values in Business Central aligned with the HR truth in SuccessFactors, so hires, terminations, and job moves do not have to be re-keyed into the ERP. ml-connector reads worker, job, and cost center data from SuccessFactors and maps it onto Business Central employees and dimensions. Because SuccessFactors holds no invoices, purchase orders, or GL accounts, the ledger stays in Business Central where it belongs.

How Microsoft Dynamics 365 Business Central works

Microsoft Dynamics 365 Business Central exposes employees, customers, vendors, purchase and sales invoices, GL accounts, general ledger entries, dimensions, and items through the Business Central API v2.0, a REST surface built on OData v4 with JSON payloads. Every resource nests under a company path on an environment-specific base URL, so the environment name is captured as a credential. Authentication is OAuth 2.0 client credentials against Microsoft Entra ID, using the scope https://api.businesscentral.dynamics.com/.default, and the registered app must be granted permission sets inside Business Central itself. Business Central supports change-notification webhooks per entity, including employees and dimensions, but the notification carries no payload and the subscription expires after three days, so the connector renews subscriptions and reads the changed record after each signal.

How SAP SuccessFactors works

SAP SuccessFactors exposes Employee Central through the HCM Suite OData V2 API over HTTPS and JSON, including PerPerson, PerPersonal, EmpEmployment, EmpJob, EmpCompensation, FOCostCenter, and FODepartment. The API host is datacenter-specific, so the hostname is captured per tenant rather than assumed. Authentication is OAuth 2.0 SAML Bearer Assertion: an RSA private key signs a SAML assertion that is exchanged for a Bearer token valid for up to 24 hours, and a valid token still needs Role-Based Permissions for every entity read or a call returns 403. Reads use delta sync on lastModifiedDateTime with the page size set explicitly, since the default is only 20 records. Intelligent Services can push HR events such as NewHire, Termination, or JobInfoChange to a configured endpoint signed with HMAC-SHA256, but those subscriptions are set up in the Admin Center, not through an API.

What moves between them

The flow runs from SAP SuccessFactors into Microsoft Dynamics 365 Business Central. ml-connector reads worker, employment, and job records from SuccessFactors and keeps the Business Central employee list current with hires, terminations, rehires, and job changes such as department, title, manager, or cost center. Cost center and department reference data from FOCostCenter and FODepartment is aligned to Business Central dimensions and dimension values so each worker resolves to a valid dimension code. SuccessFactors is the HR system of record and holds no GL accounts, invoices, or purchase orders, so the chart of accounts and the ledger stay in Business Central and ml-connector never writes financial entries back into SuccessFactors.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the SuccessFactors side it signs a SAML assertion with the customer's RSA private key, exchanges it for a Bearer token against the datacenter-specific API host for that tenant, and refreshes the token before its 24-hour expiry; a missing Role-Based Permission shows up as a 403 rather than a 401, so the integration user needs grants for every entity it reads. On the Business Central side it requests an OAuth 2.0 client-credentials token from Microsoft Entra ID with the https://api.businesscentral.dynamics.com/.default scope, builds the base URL from the stored environment name, and scopes every call to the right company. SuccessFactors is read by delta sync on lastModifiedDateTime with the page size set to 1000 so records are not silently missed, and Intelligent Services events such as NewHire or JobInfoChange can trigger an immediate pull where they are configured. SuccessFactors cost centers and departments are mapped to Business Central dimensions first, so every employee write lands on a dimension value that already exists. Business Central has no idempotency-key header, so ml-connector filters by the employee number before it writes and uses a stable BullMQ jobId to avoid duplicate enqueues. Because SuccessFactors deactivates employees rather than deleting them, termination logic keys on a status change to inactive rather than a delete event. SuccessFactors throttling returns HTTP 429 or 503 with no rate-limit headers, so the connector keeps concurrency low and backs off with jitter. 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 with around 400 staff across three offices runs Microsoft Dynamics 365 Business Central for finance, purchasing, and project costing, and uses SAP SuccessFactors Employee Central as the HR system of record. Before the integration, an administrator re-keyed every new hire, termination, and transfer into the Business Central employee list by hand, and the department and cost center values in the ERP drifted out of step whenever a team was renamed or someone moved offices. With Microsoft Dynamics 365 Business Central and SAP SuccessFactors connected, worker and job changes flow into the Business Central employee list automatically, cost centers and departments map onto the matching dimension values, and the org data in the ERP matches the HR records. The manual re-keying is gone and headcount stays reconciled.

What you can do

  • Keep the Microsoft Dynamics 365 Business Central employee list aligned with SAP SuccessFactors hires, terminations, rehires, and job changes.
  • Map SAP SuccessFactors cost centers and departments onto Microsoft Dynamics 365 Business Central dimensions and dimension values.
  • Read workers, jobs, and compensation from SAP SuccessFactors by OData V2 delta sync on lastModifiedDateTime.
  • Treat a SAP SuccessFactors status change to inactive as a termination, since SuccessFactors deactivates rather than deletes.
  • Bridge the SAP SuccessFactors SAML Bearer token and the Microsoft Entra ID client-credentials token, with retries, error replay, and a full audit trail.

Questions

Which direction does data move between Microsoft Dynamics 365 Business Central and SAP SuccessFactors?
The flow is SAP SuccessFactors into Microsoft Dynamics 365 Business Central. Worker, job, and cost center data moves from SuccessFactors into the Business Central employee list and dimension values, while cost centers and departments are aligned so each worker resolves to a valid dimension. SuccessFactors is the HR system of record and holds no GL accounts, so ml-connector does not write financial entries back into it.
Does SAP SuccessFactors hold invoices or GL accounts that post into Business Central?
No. SAP SuccessFactors is an HCM system with no invoice, purchase order, payment, or general ledger objects. What it provides is workers, jobs, compensation, and cost center codes in EmpJob and FOCostCenter, and ml-connector maps that into Business Central as employee records and dimension values. The chart of accounts and the ledger stay in Business Central, which is the source of truth for finance.
How does the integration handle authentication and the lack of a hard delete in SuccessFactors?
On the SuccessFactors side ml-connector signs a SAML assertion with the customer's RSA private key and exchanges it for a Bearer token that lasts up to 24 hours, and the API user must also hold Role-Based Permissions for each entity. On the Business Central side it uses OAuth 2.0 client credentials against Microsoft Entra ID and builds the base URL from the stored environment name. Because SuccessFactors deactivates employees rather than deleting them, ml-connector treats a status change to inactive as a termination instead of waiting for a delete event.

Related integrations

Connect Microsoft Dynamics 365 Business Central and SAP SuccessFactors

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

Get started