SAP SuccessFactors ATS → Beamery Integration
Data Flow, Designs & Diagrams
Data flow single direction SAP SuccessFactors ATS → Beamery
Within Beamery's SAP BTP instance, we create a CPI (Cloud Platform Integration) for each customer. This means that you will have a CPI instance that sits within the Beamery SAP BTP instance.
Beamery Connector Integration Flow:
-
Queries the SuccessFactors APIs to “extract” three resources from your SAP SuccessFactors ATS account:
-
Vacancy (Job Requisition),
-
Candidate (Contacts) and,
-
Job Applications.
-
-
Integration Flow then maps fields to the Beamery schema using SAP “Message Mapping” in the Integration Suite.
-
The data is then pulled into the Horizon Pipeline.
-
The Frontier APIs will then process the data and load into Beamery
Prerequisites:
What is required from the customer?
1) SuccessFactors details
- The URL of the customer's SuccessFactors instance
- The customer's API URL, eg. https://apisalesdemo2.successfactors.eu
- The Company ID of the customer's SuccessFactors instance, eg. SFCPART000242
- The username of an admin or API user which is used to access the customer's SuccessFactors instance -
-
-
The customer needs to provide us with the below mentioned permissions
-
If the customer provided us with an Admin or API user to their SAP-SF account, use that username
-
User roles are managed in the Admin Center of SuccessFactors - search for 'Manage Permissions Roles'
2) SuccessFactors access
- We need read access to the following APIs:
-
-
Job Requisition
-
Job Application
-
Candidate
-
3) Permissions
- During your onboarding and implementation phase, our Integration Consultants will work with you to ensure the integration is set up and configured correctly.
- We do require the following permissions set by your SuccessFactors user:
Manage Integration Tools
Allow Admin to Access OData API through Basic Authentication
Access to OData API Metadata Refresh and Export
Recruiting Permissions
OData API Application Export
OData API Candidate Export
OData API Job Requisition Export
Metadata Framework
Admin access to MDF OData API
4) External job-posting URL
-
The base external job-posting URL, eg. https://careersd2.successfactors.eu/sfcareer/jobreqcareer?company=SFCPART000242
-
You can find this in your SuccessFactors instance, by navigating to any Job Requisition with a Job posting attached.
-
-
Initially, you will receive the URL in this format when copying: https://careersd2.successfactors.eu/sfcareer/jobreqcareer?jobId=13591&company=SFCPART000242
-
You should input the URL in the following format in the field above: https://careersd2.successfactors.eu/sfcareer/jobreqcareer?company=SFCPART000242 - by deleting the jobId and & symbol.
Language Settings
-
During the onboarding and implementation process, Beamery are able to configure your language settings within CPI.
-
You are able to choose between en_GB and en_US.
-
Once this has been configured, we are unable to change/amend.
-
This is a global configuration - in that across the whole of your CPI, only one language configuration can be set. However the only area in CPI where this is used is to filter the correct vacancy stage.
Vacancy & Candidate Mapping
As you read through the following documentation, we detail the fields which we map from SuccessFactors to Beamery. We have also included the field type to assist you with identifying where that field sits when configuring in SuccessFactors.
The fields listed in the documentation are defined and documented in SuccessFactor's Public API. The API request will unfortunately fail if one of those fields is disabled (instead of returning an empty value). As long as the field exists in your Data Dictionary and is sap:visible
, Beamery will be able to query successfully.
Data Sync Types
Please see the table below detailing the data synced between the SAP SuccessFactors ATS -> Beamery CRM via the single direction integration.
Data Type | SFSF → BM | BM → SFSF |
---|---|---|
Vacancies |
|
|
Candidates |
|
|
Applications |
|
|
Attachments |
|
|
We have two types of data sync:
TypeCadenceNotes
Historical
Once
Kicked off when the integration is initiated, dating back to an agreed start date stipulated by you.
Delta
Every 15 minutes
When any of the three entities we pull (Vacancies, Candidates & Applications, Resumes & Cover Letters) are created or any field that we sync (please see below for details on which fields we sync) is updated in SuccessFactors we will sync to Beamery.
For Example: if we update a tag on a candidate, the candidate profile will be included in the next sync to Beamery.
We do not currently sync any 'delete' actions from SuccessFactors to Beamery.
Vacancies & Candidates - The flow of Data:
Feature | SFSF → BM | Notes |
---|---|---|
Create Vacancy |
|
|
Update Vacancy |
|
|
Confidential Vacancy |
|
There is no standard field for confidential vacancies, however it is possible for this to be supported via a custom mapping. |
Create Candidate without Vacancy |
|
|
Create Candidate with Vacancy |
|
|
Update Candidate |
|
|
Confidential Candidate |
N/A |
|
Candidate Attachments (i.e Resumes) |
|
|
Merge Candidate |
N/A |
We are not syncing any SFSF merge logic currently. |
Deduplication Logic:
When a candidate is synced from SuccessFactors → Beamery, the candidate will be either created, updated or merged based on the following logic:
-
IF the profile syncing across has a matching ATS ID to that of a profile already in Beamery, THEN the existing profile in Beamery will be UPDATED.
-
IF the profile syncing across does not have a matching ATS ID to that of a profile already in Beamery, AND has an email address that does not match that of a profile already in Beamery, THEN the new profile will be CREATED.
-
IF the profile syncing across does not have a matching ATS ID to that of a profile already in Beamery, AND has an email address that does match that of more than one profile already in Beamery, THEN the new profile will be CREATED.
-
IF the profile syncing across does not have a matching ATS ID to that of a profile already in Beamery, AND has an email address that does match that of one profile already in Beamery, AND has an ATS ID, THEN the new profile will be CREATED.
-
IF the profile syncing across does not have a matching ATS ID to that of a profile already in Beamery, AND has an email address that does match that of one profile already in Beamery, AND does not have an ATS ID, THEN the new profile will be MERGED.
In Beamery we keep two IDs per candidate - we have the Beamery specific ID and also the SuccessFactors ATS ID. So, if you have candidates in Beamery and then sync across an application from SuccessFactors, the candidates will only be merged if they share the same email address of one existing profile in Beamery, with the original candidate being enriched with the ATS ID.
If they share the email address of multiple existing profiles in Beamery, then Beamery will follow suit and create an additional profile. This is to ensure that we are not merging some and not others.
Deduplication Scenario Examples:
Scenario Examples
Scenario 1:
-
Candidate Jane Doe is in Beamery with email address jane.doe@email.com and no ATS ID.
-
Candidate Jane Jones applies to vacancy in SuccessFactors with email address jane.doe@email.com
-
Upon sync, these two candidates will be merged.
-
Within Beamery, the name of the SuccessFactors candidate will be presented 'Jane Jones' alongside the SuccessFactors ATS ID.
-
All other contact fields are merged (i.e. phone number, education).
-
If for example the Beamery candidate Jane Doe has phone number
111111111
but the SuccessFactors candidate Jane Jones has phone number00000000
, then the merged contact 'Jane Jones' in Beamery will have both phone numbers111111111
&00000000
. -
Any fields which are only present on the Beamery contact Jane Doe and are not pulled from SuccessFactors will be kept in Beamery (i.e. Skills, Language).
Scenario 2:
-
Candidate Jane Doe is in Beamery with email address jane.doe@email.com
-
Candidate Jane Jones applies to vacancy in SuccessFactors with email address jane.jones@email.com
-
Upon sync, these two candidates will NOT be merged and thus Jane Jones will be created in Beamery.
Scenario 3:
-
Candidate Jane Doe is in Beamery with email address jane.doe@email.com with ATS ID
1234
-
Candidate Jane Jones applies to vacancy in SuccessFactors with email address jane.doe@email.com with ATS ID
6789
-
Upon sync, these two candidates will NOT be merged and thus Jane Jones will be created in Beamery.
Scenario 4:
-
Candidate Jane Doe is in Beamery with email address jane.doe@email.com with no ATS ID, has an application created in Beamery only.
-
Another candidate Jane Jones with email address jane.doe@email.com and ATS ID
1234
applies to a vacancy in SuccessFactors -
Upon sync, these two candidates will be merged (as they have the same email address and the first candidate in Beamery does not have an ATS ID)
-
Merged candidate Jane Jones will have two applications in Beamery, however there will only be one application in SuccessFactors - as only one application was created in SuccessFactors.
Scenario 5:
-
Candidate Jane Doe is in Beamery with email address jane.doe@email.com
-
Candidate Jane Jones applies to vacancy in SuccessFactors with email address jane.doe@email.com and ATS ID
1234
-
Upon sync, these two candidates will be merged.
-
A new candidate Jane Jones is created in SuccessFactors with email address jane.doe@email.com with ATS ID
0987
. -
The first two will remain merged in Beamery, however the third candidate will be created in Beamery, as it will have a separate ATS ID to that of the two previously merged.
The merge action is not displayed in the timeline from Beamery candidate profile. We show the contact has been created by “Integration User”, like normal contacts, however the first ever creation shows the previous name i.e. Beamery only contact's name (please see screenshot below).
Contact Deletion, Archival or Anonymisation:
Please see the table below for expected behaviour when contacts are either deleted, anonymised or archived.
Type | Scenario |
---|---|
Candidate has been deleted in Beamery |
If we receive another application from SuccessFactors for a candidate who has been deleted in Beamery, since the contact no longer exists in Beamery, the application won't be synced. However, if the contact is UPDATED in SuccessFactors for any reason, then that would trigger a re-sync of the contact and it will be recreated and subsequent applications will be synced. |
Candidate has been anonymised in Beamery |
If we receive another application from SuccessFactors for a candidate who has been anonymised in Beamery, since the contact no longer exists in Beamery, the application won't be synced. The contact is marked as 'unavailable' in Beamery with a 451 status (which means 'Unavailable for legal reasons'). |
Candidate has been archived in Beamery |
If we receive another application from SuccessFactors for a candidate who has been archived in Beamery, we will still sync and receive any further contact updates and application updates into Beamery. |
Data Mapping Details
Please see the table below detailing the key data points pulled in for each entity:
Vacancy | Candidate | Application |
---|---|---|
Requisition ID |
Candidate ID |
Job Application Candidate ID |
Job Title |
First & Last name |
Job Vacancy ID |
Job Description |
|
First & Last Name |
Location |
Phone Number |
|
Job Status |
Address (1st line, City, Country, Postal Code) |
Phone Number |
Type |
Experience (Current Company, Current title, Start / End Date) |
Address (1st line, City, Country, Postal Code) |
Salary |
Education (Start / end dates, College / School) |
Experience (Current Company, Current title, Start / End Date) |
Department |
Application Status / Stage |
|
Hiring Manager |
||
Owner / Primary Recruiter |
||
Job Posting URL |
Vacancy Pull Mapping:
API documentation: SAP Business Accelerator Hub
Beamery Field Reference | Beamery Field Name | SuccessFactors Field Reference | SuccessFactors Field Name | SuccessFactors Field type |
---|---|---|---|---|
Vacancy.description | Description |
Uses JobRequisition.jobReqLocale.JobRequisitionLocale.jobDescription if not null, otherwise use JobRequisition.jobReqLocale.JobRequisitionLocale.externalJobDescription |
Job Description (via Internal Posting Preview) | Standard |
Vacancy.department | Department | JobRequisition.department_obj.name | Department | Child field of: Division & Legal Entity |
Vacancy.integrations.successfactors.id | Job Requisition ID | JobRequisition.jobReqId | Req ID | Standard |
Vacancy.location | Location | JobRequisition.location_obj.name | Location | Child field of: Division & Legal Entity |
Vacancy.manager | Manager | "JobRequisition.hiringManager.emailaddress" | Hiring Manager | Standard |
Vacancy.owner | Owner | "JobRequisition.recruiter.emailaddress | Recruiter | Standard |
Vacancy.salary | Salary | If min and max salaries are defined, both values are concatenated using a hyphen: "JobRequisition.salaryMin - JobRequisition.salaryMax", otherwise use JobRequisition.salaryBase. Appends JobRequisition.currency at the end in both cases. | Annual Salary | Standard with JobRequisition.salaryMin - JobRequisition.salaryMax also being standard |
Vacancy.status | Status | JobRequisition.status.PicklistOption.externalCode (See status) | Status | Standard field, however the pick list required is a custom field |
Vacancy.title | Vacancy Title | JobRequisition.JobRequisitionLocale[0].data.jobTitle | Internal Job Title | Standard |
Vacancy.job_url | Job URL | https://careersd2.**[ssff-host]**/sfcareer/jobreqcareer?company=**[ssff-company-name]**&jobId=**[jobReqId]**, where ssff-host and ssff-company-name are externalised parameters in cpi and jobReqId is JobRequisition.jobReqId. | (Link icon next to Posting Type) | Custom field configured by Beamery |
Notes:
-
The
department_obj
mapping can have different department values. Recruiters can create job requisitions in the SFSF UI using different departments, which are eventually stored within this object, linked to the job requisition and then only the name is pulled into Beamery. -
When syncing Job Requisitions from SuccessFactors to Beamery, we default the
visibility
field toPublic
. -
We currently do not natively support “Private” or “Confidential” vacancy types for the SuccessFactors integration with Beamery, and so we default all to “Public”. However if “Confidentiality” is required, we can look to configure a custom field on the vacancy to accommodate this.
-
If a job requisition is set to “Private” in SuccessFactors, then that same Job Requisition will be set as “Public” in Beamery.
Vacancy Stages:
When we pull Vacancies in from SuccessFactors → Beamery, that Vacancy will inherit whichever Vacancy stages are set in Beamery in settings. Vacancy stages must be set in Beamery to mirror Requisition stages in SuccessFactors. We must have a 1 to 1 mapping for stages - so if there are 9 stages in SuccessFactors, then we must have 9 stages in Beamery.
This is important for correct synchronisation of which stage a candidate is in (an application). For implementation of the integration, we need a list of your Vacancy stages set in SuccessFactors, so that we can replicate them into Beamery.
Vacancy Status:
Please see the table below detailing the mapping of Vacancy Status between SAP SuccessFactors ATS & Beamery:
SuccessFactors
Beamery
reqStatus_Hold
Hold
reqStatus_Open
Open
reqStatus_Filled
Closed
reqStatus_Vacancy_Cancelled
Cancelled
We are not mapping (and therefore not able to configure) any other vacancy status from SuccessFactors → Beamery as we do not have an equivalent status in Beamery.
In case that a status doesn't exist in Beamery (e.g: Assessments
), the vacancy will sync but the status won't be updated and the last known status is preserved.
For example, if the vacancy is transitioned from Open
→ Assessments
in SuccessFactors, in Beamery it will still be shown as Open
until it is transitioned to a valid status.
Note: that within SuccessFactors there are 'Vacancy Status' and 'Application Status', however Beamery has 'Vacancy Status' and 'Vacancy Stages'. We are not able to configure Vacancy Status within Beamery, but we can configure Vacancy Stages (which are known as 'Application Status' in SuccessFactors.
Vacancy Type:
Please see the table below detailing the mapping of Vacancy Type between SAP SuccessFactors ATS & Beamery:
SuccessFactors
Beamery
employType_Full_time
Full Time
employType_Part_time
Part Time
employType_Fixed_contract
Contract
Candidate Pull Mapping:
API documents: SAP Business Accelerator Hub
Note: Education & Work Experience are top level “data field” background elements. Within these data fields, we have configured School, Degree, Major and start/end dates.
Beamery Field Reference | Beamery Field Name | SuccessFactors Field Reference | SuccessFactors Field Name | SuccessFactors Field Name |
---|---|---|---|---|
contacts.education.current | Current | If Candidate.education.CandidateBackground_Education.endDate is empty; then true else false | Formal Education | Pick list custom field |
contacts.education.degree | Degree | Candidate.education.CandidateBackground_Education.degreeNav.PicklistOption.localeLabel | Degree | Pick list custom field |
contacts.education.endDate | End date | Candidate.education.CandidateBackground_Education.endDate | End Date | Pick list custom field |
contacts.education.major | Field of Study | Candidate.education.CandidateBackground_Education.majorNav.PicklistOption.localeLabel | Major | Pick list custom field |
contacts.education.organisationName | School | Candidate.education.CandidateBackground_Education.school | School | Pick list custom field |
contacts.education.program | Field unavailable in SuccessFactors Schema | Pick list custom field | ||
contacts.education.startDate | Start Date | Candidate.education.CandidateBackground_Education.startDate | Start Date | Pick list custom field |
contacts.emails | Candidate.contactEmail | Standard | ||
contacts.experience.current | Current | If Candidate.outsideWorkExperience.CandidateBackground_OutsideWorkExperience.endDate is empty; then true else false | Previous Employment | Pick list custom field |
contacts.experience.endDate | End Date | Candidate.outsideWorkExperience.CandidateBackground_OutsideWorkExperience.endDate | End Date | Pick list custom field |
contacts.experience.organisationName | Company | Candidate.outsideWorkExperience.CandidateBackground_OutsideWorkExperience.presentEmployer | Company Name | Pick list custom field |
contacts.experience.role | Role | Candidate.outsideWorkExperience.CandidateBackground_OutsideWorkExperience.startTitle | Title | Pick list custom field |
contacts.experience.startDate | Start Date | Candidate.outsideWorkExperience.CandidateBackground_OutsideWorkExperience.startDate | Start Date | Pick list custom field |
contact.firstName | First Name | Candidate.firstName | First Name | Standard |
contact.integrations.successfactors.id | ATS ID | Candidate.candidateID | Candidate ID | Standard |
contact.lastName | Last Name | Candidate.lastName | Last Name | Standard |
contact.location.address | Address | Candidate.address Candidate.city Candidate.state Candidate.zip Candidate.country | Address | City | State | Zip code | Country | Standard |
contact.location.city | City | Candidate.city | City | Standard |
contact.location.country | Country | Candidate.country | Country of Residence | Standard |
contact.location.postalCode | Post Code | Candidate.zip | Zip Code | Standard |
contact.phoneNumbers | Phone | Candidate.cellPhone | Phone | Standard |
Global.Tag | Global Tag | tag | Tag | Standard |
-
When pulling the phone number, we are also pulling the country code. Whatever value is present under
cellPhone
for a candidate in SuccessFactors, it will be pulled into Beamery. As per SAP API documentation, there are only 2 fields in SuccessFactors related to phone number -cellPhone
andhomePhone
. When a candidate is created in SuccessFactors using cellPhone, it is displayed as Phone for a candidate profile, and pulled into Beamery under Primary Phone. We are mapping this to Primary phone within Beamery. -
We are not currently syncing the source field(Source, Sourced By & Creation Source) during the one way integration. These Source fields are an attribute of the contact within Beamery - so when a candidate has been sourced via Beamery, the source will be attributed to the contact and not its application. When that candidate is eventually invited to apply, the application will sync and will not override the source field on the contact - it will maintain the original entry in Beamery of the field. If there is no Source field entry in Beamery, upon application sync from SuccessFactors → Beamery, the Sourced By field will be populated with “Integration user” as we are not currently mapping Sourced By as a field.
-
Please note that within SuccessFactors, phone numbers can be added with or without a phone country code. So when an existing (in both SuccessFactors and Beamery) contact's phone number in SuccessFactors is updated with a country code, we will not merge on sync to Beamery - within Beamery we will have the original phone number AND an additional phone number, now with the addition of the updated phone country code.
-
For example: A contact exists in Beamery with phone number: 012345678 and later it is updated to have +44 added to 012345678, then within Beamery, we will present two telephone numbers for that contact - 012345678 AND +44012345678
-
-
Within Beamery, we only detail or present one education record per
organisationName
.-
So if a contact has multiple education records from the
organisationName
(i.e. two different degrees from the same School/University), then within Beamery we will only present one record.
-
Application Pull Mapping:
API Documentation: SAP Business Accelerator Hub
Beamery Field Reference | Beamery Field Name | SuccessFactors Field Reference | SuccessFactors Field Name |
---|---|---|---|
application.integrations.successfactors.id | Contact ATS ID | JobApplication.candidateId | Candidate ID |
application.stageId | Application Stage | JobApplication.jobAppStatus/appStatusName is mapped to stageId in frontier-connector | App Status |
application.vacancyId | Application Vacancy ID | JobApplication.jobReqId | Job Req ID |
Error Management and Monitoring
We have two types of errors:
-
Transient
-
These are errors which can be automatically recovered from on retry, for example: timeouts, rate limiting, out of order arrival of records.
-
-
Non-Transient
-
These are errors that cannot be automatically recovered from, for example: data validation errors.
-
How does error management work?
For “Extraction” of data from SuccessFactors in CPI, we have a retry behaviour which:
-
Query - for HTTP response codes 502, 503, 504, and 429.
-
The system retries connection every 3 minutes for a maximum of 5 times.
For “Load” or ingestion of the data into Frontier from Horizon, we have:
-
For Transient errors, a retry mechanism in place.
-
For Non-Transient errors, a new sync will be scheduled for the failed entities.
Logging & Monitoring Management
We maintain different sub-accounts within the SAP BTP cockpit, which are linked to different and unique integration suite applications and are configured to a unique company in Beamery.
A company in Beamery is a unique instance and identified by using a company ID. All the data is stored and managed using the company ID.
To monitor the receiving and transformation of data from SuccessFactors, Beamery uses the SAP BTP Integration Suite and its built-in monitoring tooling. This generates a log every time the integration is triggered - executions which error out will have an error message attached to them to investigate further; whilst successful executions will display as “Completed”.
To monitor the loading and sending of data from our integration pipeline to Beamery, we will be using both Kibana and GCP (Google Cloud Platform) Dashboards. These will capture key health metrics including timeouts, out of memory errors, crashes, and latency rates per customer. We also have Slack alerting configured for any integration errors across shared Beamery components.
Additional notes to be mindful of:
-
The single direction integration will not include any customizations or custom configuration.
-
This includes custom mapping,
-
Therefore we are not applying any filters or field mapping settings based on customer requirements.
-
-
For single direction, Beamery will host the CPI connector for each customer within the Beamery BTP tenant.
-
As this sits within Beamery's BTP instance, Beamery will manage and support the on-going monitoring and logging of the customer's integration.
-
-
When syncing data from SuccessFactors→ Beamery we only sync data that is either updated or created - not deleted.
-
So if you delete a candidate in SuccessFactors, we will not pull that action to Beamery, and therefore that candidate will remain in Beamery.
-
Attachments
For attachments to successfully sync from SF → BM, the contact (that the attachment belongs to) must have already successfully synced prior to the attachment sync attempt.
If the contact has not yet arrived into Beamery, the attachment sync will error and will re-try on the next sync strategy.
The attachment pull iFlow is set to sync every 15 minutes SF -> BM. (Please refer to the "Data Sync Strategies" section above for more info).
Info on the parameters of syncing attachments:
-
Our integration will pull SuccessFactors -> Beamery candidate attachments (We have two separate flows from SF -> BM, one pulling resume, and one pulling cover letters. The field mappings remain the same as each other. Please see below).
-
The maximum file size that SuccessFactors allows is 10MB (this may need to be configured within SuccessFactors). The largest file Beamery will be able to pull from SF and successfully store within BM will be 10MB.
-
SuccessFactors can only support the following file types: .doc, .docx, .gif, .jpeg, .jpg, .pdf, .png, and .txt. Files not supported by SuccessFactors are: .html, .mp3, .mp4, .msg, .ppt, .pptx, .xls, and .xlxs.
-
Any file that is supported by SuccessFactors is supported by Beamery.
-
We can pull multiple CV/Resume and Cover Letters per contact, however only one of each type is displayed in SuccessFactors.
-
We will list multiple attachments in Beamery - but if the file type and file name are the same as a previous attachment, Beamery will overwrite with the new attachment - even if the data within the document differs.
-
If a document is updated in SuccessFactors, both versions will be kept in Beamery
Field Mapping:
Beamery Reference | SuccessFactors Field Reference |
---|---|
Attachment ID (unique identifier) | resume.attachmentId |
Purpose | resume.documentCategory |
(Data that is fetched - encodes from SF and decoded into BM) | resume.fileContent |
File Name | resume.fileName |
Type | resume.mimeType |
Contact ID (ID of the contact the resume belongs to) |
candidateId |
Beamery Reference | SuccessFactors Field Reference |
---|---|
Attachment ID (unique identifier) | coverLetter.attachmentId |
Purpose | coverLetter.documentCategory |
(Data that is fetched - encodes from SF and decoded into BM) | coverLetter.fileContent |
File Name | coverLetter.fileName |
Type | coverLetter.mimeType |
Contact ID (ID of the contact the cover letter belongs to) | candidateId |