Turnover & Retention
Two rates, four definitions, endless arguments. This page fixes the denominator once, separates turnover from retention properly, and shows the one query that computes both facts' worth of truth.
◆ The definitions— turnover, voluntary turnover, retention, and annualization, each stated once.
| Metric | Definition | The catch |
|---|---|---|
| Turnover rate | Exits in the period, divided by average headcount for the period. | The denominator is where dashboards diverge. Fix it: the average of month-start and month-end headcount, from the snapshot. One choice, everywhere. |
| Voluntary turnover | Voluntary exits only, same denominator. | Needs the exit classification from the Movement report. Regretted turnover, where the flag is maintained, is the sharper signal. |
| Retention rate | Of the workers present at period start, the share still present at period end. | A cohort measure. It ignores people hired during the period, which turnover does not, so the two are not complements. Report both; never derive one from the other. |
| Annualized rate | The monthly rate multiplied by twelve, labeled as annualized. | A projection, not a result. Small teams explode it: one exit from a team of six annualizes to 200%. Always show the counts next to the rate. |
◆ The traps— mismatched populations, tenure resets, and rates without counts.
| Trap | What goes wrong |
|---|---|
| Population mismatch | Exits counted for employees while the denominator includes contingent workers, or the reverse. Numerator and denominator must use the same population definition, the one fixed on the headcount report. |
| Transfers counted as exits | Company transfers processed as termination-plus-hire inflate turnover unless paired back into transfers. Classified once in the Movement model, inherited here. |
| Turnover by tenure | First-year attrition depends on which hire date defines tenure, and rehires reset the continuous service date by default. Pick the date deliberately; the Movement report covers the choice. |
| Rates without counts | A 33% quarterly rate can be two people. Publish exits and average headcount beside every rate, and readers stop arguing with percentages. |
◆ The owned model, and the SQL— the numerator from the event fact, the denominator from the snapshot, one query.
Turnover is the first report that needs both facts: exits from fct_worker_event, average headcount from fct_worker_snapshot. Same dimensions, same population filter on both sides:
-- monthly turnover by level-2 org; numerator and denominator share the population filter
WITH exits AS (
SELECT d.month_end_date, o.level_2 AS organization,
COUNT(*) AS exits
FROM fct_worker_event f
JOIN dim_date d ON f.date_key = d.date_key
JOIN dim_org o ON f.org_key = o.org_key
WHERE f.event_class = 'Termination'
GROUP BY 1, 2
),
avg_hc AS (
SELECT d.month_end_date, o.level_2 AS organization,
AVG(month_headcount) AS avg_headcount
FROM (SELECT date_key, org_key, COUNT(DISTINCT worker_key) AS month_headcount
FROM fct_worker_snapshot
WHERE worker_type = 'Employee' AND is_primary
GROUP BY 1, 2) s
JOIN dim_date d ON s.date_key = d.date_key AND d.is_month_boundary
JOIN dim_org o ON s.org_key = o.org_key
GROUP BY 1, 2
)
SELECT e.month_end_date, e.organization, e.exits, h.avg_headcount,
ROUND(100.0 * e.exits / h.avg_headcount, 2) AS monthly_turnover_pct,
ROUND(1200.0 * e.exits / h.avg_headcount, 1) AS annualized_pct
FROM exits e
JOIN avg_hc h ON e.month_end_date = h.month_end_date
AND e.organization = h.organization
ORDER BY 1, 2
Sample output, continuing the series from the headcount and Movement reports, 142 workers at March-end, 145 at April-end, 147 at May-end, with 2 exits in April and 1 in May:
| month_end_date | organization | exits | avg_headcount | monthly_turnover_pct | annualized_pct |
|---|---|---|---|---|---|
| 2026-04-30 | Revenue Org | 2 | 143.5 | 1.39 | 16.7 |
| 2026-05-31 | Revenue Org | 1 | 146.0 | 0.68 | 8.2 |
April: 2 exits over (142 + 145) / 2 = 143.5, which is 1.39% monthly, 16.7% annualized. Every number traces to the two pages before it, which is the point: one model, three reports, no arguments. Sample values are illustrative, never client data.
- turnover rate
- Exits divided by average headcount for the period.
- average headcount
- The mean of period-start and period-end headcount, from the snapshot. The fixed denominator.
- voluntary turnover
- Voluntary exits only, same denominator.
- regretted exit
- A voluntary exit the company wanted to keep. The sharper attrition signal, where flagged.
- retention rate
- Of workers present at period start, the share still present at period end. A cohort measure.
- cohort
- A fixed group followed over time. Retention tracks one; turnover does not.
- annualized
- A monthly rate multiplied by twelve. A projection, labeled as one.
- first-year attrition
- Exits within twelve months of the chosen hire date. Sensitive to the date choice.