Sync new Greenhouse hires into SAP SuccessFactors daily

Once a day, new hires from Greenhouse are set up in SuccessFactors automatically, with anyone missing key details flagged for your recruiters instead.

Agentic Task
SAP SuccessFactorsGreenhouseSlack BotHR & PeopleOperationsData SyncOnboarding Automation
PromptCreate

Once a day, sync newly hired candidates from Greenhouse into SAP SuccessFactors so recruiters stop rekeying the same person into two systems. Run this on a daily schedule rather than off a Greenhouse webhook: a bounded daily query is simpler and keeps the workflow idempotent.

Start in Greenhouse with List Applications, filtered to applications whose status is hired and whose activity falls within the last 24 hours. For each hired application, call Get Candidate to pull the full candidate record, including start date, offer details and custom fields. Read custom fields from keyed_custom_fields rather than custom_fields, so the keys stay stable if someone renames a field in Greenhouse.

Before writing anything, check that each candidate has everything required: legal first and last name, a confirmed start date, a department and a manager. This needs judgement rather than a fixed field mapping, because different Greenhouse setups store these in different places, including custom fields and offer details. If a candidate is missing any required value, do not write a partial record. Skip that candidate entirely and collect them into a list of people needing recruiter attention, noting exactly which fields were missing.

For each complete candidate, map the Greenhouse record onto SuccessFactors and write a pre-hire record using Upsert Records. Writes go through the single upsert endpoint rather than per-entity creates, and each object in the payload carries a __metadata.uri naming its entity set, so send one object for the person entity set and one for the employment entity set. Specify purgeType incremental explicitly, so the write only touches the fields sent and updates or inserts rather than replacing a whole associated collection.

Upsert by a stable business key so that a rerun updates the existing record instead of duplicating it. Use personIdExternal for the person record and userId for the employment record, and derive both deterministically from the Greenhouse candidate so the same person always maps to the same key. The start date is load bearing rather than cosmetic: effective dated entities include startDate in their key, so a wrong or missing start date writes the wrong record. That is exactly why a missing start date is a skip rather than a best guess.

When the writes are done, post one confirmation to Slack with Send a Message into the recruiting operations channel. Summarize who was created in SuccessFactors and with what start date, then list separately every candidate that was skipped along with what each one was missing, so a recruiter can fix the record in Greenhouse and let the next run pick them up. If nobody was hired in the last 24 hours, skip the Slack message rather than posting an empty summary.

This workflow writes into the HR system of record, so stay conservative throughout. Never invent a value to satisfy a required field, never guess at a manager or department, and always prefer skipping and flagging over a best effort write.

What does this prompt do?

  • Checks Greenhouse once a day for candidates marked as hired in the last 24 hours.
  • Pulls each new hire's full record, including their start date, offer details and any custom fields your team tracks.
  • Creates a pre-hire record for them in SAP SuccessFactors, updating rather than duplicating if the same person comes through again.
  • Posts a summary in Slack naming who was set up and with what start date, plus anyone skipped because details were missing.

What do I need to use this?

  • A Greenhouse account with access to candidates and applications
  • A SAP SuccessFactors login that is allowed to create employee records
  • A Slack workspace and a channel for the daily confirmation
  • Agreement with your HR team on which details are mandatory before someone is created

How can I customize it?

  • Change when it runs, for example early morning so records are ready before the HR team starts their day.
  • Adjust which details count as mandatory. As written, a hire is skipped if legal name, start date, department or manager is missing.
  • Point the summary at a different Slack channel, such as HR operations rather than recruiting.

FAQs

Will this create duplicate employee records if it runs twice?
No. Each person is matched on a stable identifier, so a second run updates the existing record rather than creating a new one. That also means you can safely re-run it after fixing something.
What happens if a candidate is missing their start date or manager?
They are skipped rather than half created, and they show up in the Slack summary as needing recruiter attention with the exact missing details listed. Once someone fills those in on the Greenhouse record, the next run picks them up.
Does this replace SuccessFactors Recruiting or Onboarding?
No. It is built for teams who run Greenhouse as their applicant tracking system in front of SuccessFactors, and it simply stops the same person being typed into both systems by hand.
Why only pre-hire records instead of full employee records?
A pre-hire record is the safe handoff point. It gets the person into your HR system with their start date so onboarding can begin, while leaving payroll and benefits details to your HR team.
How far back does it look each time?
The last 24 hours, matching its daily schedule, so every hire gets picked up once and nobody is processed twice.

Related templates

Build a credential rotation checklist when someone leaves

When someone leaves, we check which shared passwords they used in their final months and post a ranked rotation list to your security channel.

1Password
Rippling
Slack Bot
+1
Agentic Task
Weekly Amazon S3 bucket security audit posted to Slack

Every Monday, check every S3 bucket for public exposure, missing encryption and weak backup settings, then get the risks ranked in Slack.

Amazon S3
Slack Bot
Google Sheets
Agentic Task
Log Agorapulse social conversations to HubSpot contacts

Twice every weekday, the conversations from your social inbox land on the right HubSpot contact timelines, with a Slack recap for sales.

Agorapulse
HubSpot
Slack Bot
Agentic Task
Clean up HubSpot contacts from your Amazon SES suppression list

Every morning, find the addresses that hard bounced or filed a spam complaint, update the matching HubSpot contacts, and post a short Slack recap.

Amazon SES
HubSpot
Slack Bot
Agentic Task
Draft polite follow-ups for emails that never got a reply

Every weekday at 4pm, spot the threads that went quiet, stage a ready-to-send nudge in your mailbox, and get a ranked Slack recap.

Aurinko
Google Sheets
Slack Bot
Agentic Task
Replay failed SQS messages when a bug fix is merged

When you merge a fix in GitHub, this agent checks the matching dead-letter queue, replays the failed messages, and reports back on the pull request and in Slack.

Amazon SQS
GitHub
Slack Bot
Agentic Task

Stop typing every new hire into two systems.

Let Greenhouse hires flow into SuccessFactors on their own, with anything incomplete flagged for a recruiter instead of half created.