SAP SuccessFactors Employee Central is a flexible, global core HR solution that supports core HR processes and employee self-services for your total workforce. This integration allows you to use Employee Central as a central source of learner profile information and customize your sync and field mapping to allow you to create, edit, and deactivate user profiles in Litmos.
This integration requires the use of SAP Identity Provisioning Services. SAP IPS will take advantage of our SCIM 2.0 endpoints which covers user and Team (Group) management in Litmos. This integration requires that your license of SAP IPS has access to the generic SCIM connector option which generally excludes bundled IPS licenses. If you do not have that option please contact your SAP representative for more information on obtaining the appropriate license.
The instructions below highlight how to configure Employee Central as the Source System and Litmos as our Target System for User management.
SAP IPS passes data between systems using JSON transformations. Theses transformations take individual systems field values and maps them to a generic format which can then be used by potentially any SCIM compatible system through a target system transformation. These transformations also support expressions, functions and variables that can help you to build more complex logic into your sync.
Once your IPS tenant has been obtained, you will need access to an Account Owner profile in Litmos as well as an SAP SuccessFactors API user with the following permissions granted:
- Manage User > Employee Export
- Manage User > User Account OData API Entity
- Manage Integration Tools > Allow Admin to Access OData API
For more information on setting up this integration user, please refer to “Setting Up an API User for Sync Jobs in SAP SuccessFactors”.
Setup Employee Central as a Source System
You will need to start by configuring your Employee Central source system. To do so, click into the Source Systems option from the IPS menu. You will then use the Add button at the bottom to create your source. The details tab will open, where you can select “SAP SuccessFactors” as your type and set a system name for your reference.
Upon saving, you will find that the transformation and properties page are both prefilled with some basic configuration selections. To ensure Employee Central is properly connected, you will need to also add the following minimum values to the “Properties” tab:
Property Name | Property Type | Value |
Type | Standard | HTTP |
URL | Standard | Specify the URL to your SAP SuccessFactors API.
For example: https://apitest.successfactors.com/odata/v2 |
ProxyType | Standard | Internet |
Authentication | Standard | BasicAuthentication |
User | Standard | Enter the userID of your SAP SuccessFactors technical user in the following format: <user_ID>@<company_ID> |
Password | Credential | Technical User Password |
ips.delta.read | Standard | enabled |
There are a number of additional supported properties that can also be optionally configured as part of this integration. Please review the SAP IPS help documentation to learn more about these properties.
From there, you can move to the “Transformations” tab to review the default Source System transformation for SAP SuccessFactors. There, you will find a default transformation provided for SAP SuccessFactors Employee Central, which includes some basic profile fields and can be further modified. Please refer to the SuccessFactors OData API documentation and endpoints for more information on this.
Setup Litmos as a Target System
*Please note that the steps requiring you pick a generic SCIM system. A branded connector will be available at a future date. At this time, all functions are supported except PATCH which means that you cannot update usernames.
In SAP Identity provisioning Services, we can now move to the “Target Systems” tab to setup Litmos as a target. Using the same button as the source, we can add a new application selecting “SCIM System” as the Type. Set a name for your reference and select Employee Central as your source system. If you do not select a source, IPS will read from every available source system.
From here we will need to complete the same steps, to include adding all appropriate attributes and updating the transformation to include all available Litmos fields.
On the properties tab, we will add the following required properties:
Property Name | Property Type | Value |
URL | Standard | https://api.litmos.com/v2/SCIM – replace this with the correct region if you are on our AU or EU datacenters. |
Type | Standard | HTTP |
scim.content.type | Standard | application/scim+json |
User | Standard | Account Owner Username |
ips.http.header.domain | Standard | Your Litmos subdomain or whole custom domain (Ex: customer.litmos.com would use just customer as the value) |
Password | Credential | Account Owner Password |
ProxyType | Standard | Internet |
Authentication | Standard | BasicAuthentication |
Additionally, we recommend these properties for the purposes of error handling and logging:
Property Name | Property Type | Value |
ips.trace.failed.entity.content | Standard | True |
ips.failed.request.retry.attempts.interval | Standard | True |
Transformations
Next, we can proceed with our transformations. Below we will provide a transformation that maps to all available fields with a generic mapping. Please note the following important point:
UserName can only be inserted upon user creation, so please use the “scope”: “createEntity” value to ensure that your user updates do not fail
Please remove the entire transformation from the tab and replace it with the json below. This is a starting place and can be modified to fit your needs based on source values.
{ "user": { "mappings": [ { "constant": "urn:ietf:params:scim:schemas:core:2.0:User", "targetPath": "$.schemas[0]" }, { "sourceVariable": "entityIdTargetSystem", "targetPath": "$.id" }, { "sourceVariable": "entityIdTargetSystem", "targetPath": "$.id", "scope": "deleteEntity" }, { "sourcePath": "$.userName", "targetPath": "$.userName", "scope": "createEntity" }, { "sourcePath": "$.active", "targetPath": "$.active", "defaultValue": true }, { "sourcePath": "$.name.givenName", "targetPath": "$.name.givenName" }, { "sourcePath": "$.name.familyName", "targetPath": "$.name.familyName" }, { "sourcePath": "$.emails", "preserveArrayWithSingleElement": true, "optional": true, "targetPath": "$.emails" }, { "condition": "$.emails.length() > 0", "constant": "work", "optional": true, "targetPath": "$.emails[0].type" }, { "sourcePath": "$.title", "optional": true, "targetPath": "$.title" }, { "sourcePath": "$.addresses", "preserveArrayWithSingleElement": true, "optional": true, "targetPath": "$.addresses", "functions": [ { "function": "putIfAbsent", "key": "type", "defaultValue": "work" }, { "condition": "(@.type NIN ['work', 'home'])", "function": "putIfPresent", "key": "type", "defaultValue": "work" } ], "defaultValue": [] }, { "sourcePath": "$.phoneNumbers", "preserveArrayWithSingleElement": true, "optional": true, "targetPath": "$.phoneNumbers" }, { "condition": "$.phoneNumbers.length() > 0", "constant": "work", "optional": true, "targetPath": "$.phoneNumbers[0].type" }, { "condition": "$.phoneNumbers.length() > 0", "constant": "mobile", "optional": true, "targetPath": "$.phoneNumbers[1].type" }, { "ignore": true, "sourcePath": "$.timeZone", "optional": true, "targetPath": "$.timezone" }, { "ignore": true, "targetPath": "$.timeZone", "type": "valueMapping", "sourcePaths": [ "timeZone" ], "defaultValue": "(UTC) Coordinated Universal Time", "valueMappings": [ { "key": [ "America/Los_Angeles" ], "mappedValue": "(UTC-08:00) Pacific Time (US & Canada)" } ] }, { "ignore": true, "targetPath": "$.preferredLanguage", "type": "valueMapping", "sourcePaths": [ "$.locale" ], "defaultValue": "en-US", "valueMappings": [ { "key": [ "EN" ], "mappedValue": "en-US" } ] }, { "constant": "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User", "targetPath": "$.schemas[1]" }, { "sourcePath": "$['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['employeeNumber']", "optional": true, "targetPath": "$['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['employeeNumber']" }, { "sourcePath": "$['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['organization']", "optional": true, "targetPath": "$['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['organization']" }, { "ignore": false, "sourcePath": "$['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['manager']['value']", "optional": true, "targetPath": "$['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['manager']['value']", "functions": [ { "type": "resolveEntityIds" } ] }, { "constant": "urn:ietf:params:scim:schemas:extension:CustomExtensionName:2.0:User", "targetPath": "$.schemas[2]" }, { "sourcePath": "$['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['CustomAttribute1']", "optional": true, "targetPath": "$['urn:ietf:params:scim:schemas:extension:CustomExtensionName:2.0:CustomField:User']['CustomField1']" }, { "sourcePath": "$['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['CustomAttribute2']", "optional": true, "targetPath": "$['urn:ietf:params:scim:schemas:extension:CustomExtensionName:2.0:CustomField:User']['CustomField2']" }, { "sourcePath": "$['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']'CustomAttribute3']", "optional": true, "targetPath": "$['urn:ietf:params:scim:schemas:extension:CustomExtensionName:2.0:CustomField:User']['CustomField3']" }, { "sourcePath": "$['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['CustomAttribute4']", "optional": true, "targetPath": "$['urn:ietf:params:scim:schemas:extension:CustomExtensionName:2.0:CustomField:User']['CustomField4']" }, { "sourcePath": "$['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['CustomAttribute5']", "optional": true, "targetPath": "$['urn:ietf:params:scim:schemas:extension:CustomExtensionName:2.0:CustomField:User']['CustomField5']" }, { "sourcePath": "$['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['CustomAttribute6']", "optional": true, "targetPath": "$['urn:ietf:params:scim:schemas:extension:CustomExtensionName:2.0:CustomField:User']['CustomField6']" }, { "sourcePath": "$['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['CustomAttribute7']", "optional": true, "targetPath": "$['urn:ietf:params:scim:schemas:extension:CustomExtensionName:2.0:CustomField:User']['CustomField7']" }, { "sourcePath": "$['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['CustomAttribute8']", "optional": true, "targetPath": "$['urn:ietf:params:scim:schemas:extension:CustomExtensionName:2.0:CustomField:User']['CustomField8']" }, { "sourcePath": "$['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['CustomAttribute9']", "optional": true, "targetPath": "$['urn:ietf:params:scim:schemas:extension:CustomExtensionName:2.0:CustomField:User']['CustomField9']" }, { "sourcePath": "$['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['CustomAttribute10']", "optional": true, "targetPath": "$['urn:ietf:params:scim:schemas:extension:CustomExtensionName:2.0:CustomField:User']['CustomField10']" } ] }, "group": { "ignore": false, "mappings": [ { "constant": "urn:ietf:params:scim:schemas:core:2.0:Group", "targetPath": "$.schemas[0]" }, { "sourceVariable": "entityIdTargetSystem", "targetPath": "$.id" }, { "sourceVariable": "entityIdTargetSystem", "targetPath": "$.id", "scope": "deleteEntity" }, { "sourcePath": "$.displayName", "optional": false, "targetPath": "$.displayName" }, { "sourcePath": "$.members", "preserveArrayWithSingleElement": true, "optional": true, "targetPath": "$.members", "functions": [ { "type": "resolveEntityIds" } ] } ] } }
Schedule a Provisioning Job in Identity Provisioning
Important Note: This step should only be initiated once a test provisioning job has been successfully run with no errors. Please be sure to test the provisioning job to a Litmos sandbox tenant before proceeding to configure and schedule a provisioning job to your Litmos production tenant.
Once the source and target system have been selected, configured and customized the tenant administrator will proceed to schedule the provisioning job cycle. The tenant administrator will click on “Source Systems” –> select the source system (in this case Employee Central) –> click “Jobs” –> click “Schedule” –> enter a time value for minutes. This will determine how often the provisioning job is initiated.
Once the job has been initiated, the tenant administrator can click on “Job Logs” to review the job execution logs for any provisioning configurations in the IPS tenant.
To view any errors associated with an execution job click on the row in the table to open the job logs. The error message(s), statistics and failed entries can be reviewed.
Resources
IAS | IPS | |
Documentation | Identity Authentication Service | SAP SuccessFactors Employee Central |
Care taker | IT Admin | IT Admin |