# Weekly headcount and attrition brief from SuccessFactors

> Every Monday at 8am, get a written read on who joined, who left, and which open roles are going stale, posted to Slack and logged to a spreadsheet.

- Workflow type: agent
- Services: SAP SuccessFactors, Google Sheets, Slack
- Categories: HR & People, Operations
- Published: 2026-08-09

## What it does

- Every Monday morning, pulls your current headcount, last week's joiners and leavers, and your still open roles from SAP SuccessFactors.
- Adds one row per department to a tracking spreadsheet each week, so you build a real trend history instead of a one off snapshot.
- Posts a short written brief to Slack covering headcount by department, what changed since last week, who joined, who left, and your rolling attrition rate.
- Calls out the two or three movements that actually matter and flags open roles that have been sitting unfilled for more than 60 days.

## What you'll need

- An SAP SuccessFactors account with permission to read employee, job and recruiting data
- A Google account and a spreadsheet you want to use as the weekly headcount tracker
- A Slack workspace and the channel where the brief should land

## Prompt

Every Monday at 8am, build a headcount and attrition brief for our people team from SAP SuccessFactors, append a snapshot to a Google Sheets tracking spreadsheet, and post the written brief to Slack.

Start by pulling the current picture out of SuccessFactors. Use List Job Information (EmpJob) for current org and headcount data so every active employee is mapped to a department, manager and location. Use List Employment Records (EmpEmployment) to identify the people who joined, List Employment Terminations (EmpEmploymentTermination) for the people who left in the last seven days including the termination reason, and List Job Requisitions (JobRequisition) for the roles that are still unfilled along with the date each one was opened.

Keep the queries bounded. SuccessFactors uses server-side snapshot pagination where the default and maximum page size is 1000 records, so a full-population EmpJob query will page: follow the __next skiptoken until the result set is complete. Narrow every call with $select, $filter and effective-date ranges instead of taking full extracts, and prefer delta queries such as $filter=lastModifiedDateTime gt datetime'...' where the entity supports it. Datetime values come back as /Date(epochMillis)/ and have to be converted into readable dates before they reach the spreadsheet or the Slack message. Picklist-driven fields such as termination reason resolve to labels through List Picklist Options (PicklistOption), so never show a raw picklist code to a human reader.

Before writing anything, read the existing rows of the tracking spreadsheet with Get Values, so the week over week change is computed against last week's recorded snapshot rather than recalculated from history on every run. Then append one row per department using Append Values, carrying the run date, department, active headcount, joiners this week, leavers this week, open requisitions and the rolling attrition rate. Appending rather than overwriting is what lets the trend accumulate week after week. Calculate the rolling attrition rate over a trailing twelve week window, using leavers against average active headcount, so a single week of departures does not swing the number.

Then write a short narrative brief and post it to Slack with Send a Message. Cover headcount by department, the week over week change, who joined and who left, the rolling attrition rate, and which open requisitions are ageing past 60 days.

The value here is the written interpretation rather than the raw table, so do not list every department. Call out the two or three movements that actually matter this week and say why they matter: a department where attrition is accelerating, a team that has lost more people than it has hired several weeks running, or a requisition that has been open long enough to suggest the role will not be filled as currently scoped. Name people on the joiners and leavers lines, keep the message short enough to read in the channel without expanding it, and when nothing meaningful moved, say so plainly instead of padding the brief.

## How to customize

- Change the timing. Monday at 8am is just a default, so any day and hour works.
- Send it somewhere else, whether that is a different Slack channel or a direct message to your People lead.
- Adjust what counts as an ageing role. Sixty days is the default before an unfilled role gets flagged.

## FAQ

### How is this different from a headcount dashboard?

A dashboard waits for someone to log in and look at it. This arrives in Slack already read and interpreted, so your managers see what changed without opening anything. The spreadsheet still gives you the underlying numbers if you want to dig in.

### Will it overwrite my spreadsheet every week?

No. Each run adds new rows underneath the existing ones, one per department, so your history builds up week after week. Nothing already in the sheet gets replaced.

### What happens in a quiet week when nobody joined or left?

It says so plainly rather than padding the brief. The point is to surface real movement, so a quiet week should read as a quiet week.

### Do we need to use SuccessFactors for recruiting as well?

Only for the open roles section. Headcount, joiners and leavers come from your employee records. If you do not track requisitions in SuccessFactors, that part of the brief can simply be left out.

### Can it cover just one department or region?

Yes. You can narrow it to specific departments, business units or locations, which is common when each leader wants a brief covering only their own org.

Use this prompt in General Input: https://www.generalinput.com/prompts/weekly-headcount-and-attrition-brief-from-successfactors