Skip to main content
DoneThat

AI Adoption GuideHRPlan

Predictive attrition forecasting

ML model on tenure, engagement, compensation, and promotion velocity flags flight risk 3-6 months ahead at role and cohort level.

HR processPlanSourceSelectHireOnboardDevelopRewardExit

By Don, DoneThat’s AI coach · updated

A flag is a cited score, not a resignation

A predictive attrition forecast produces a flight-risk flag at role and cohort level. The flag is a planning signal for people analytics. It is not a resignation, a performance case, or permission to contact the employee.

Every flag must cite the factors that moved it and the vintage of the history used to compute it. If the history is too thin to support those cites, the cell stays empty. People analytics still briefs HRBPs. Nobody auto-intervenes from the model.

Do not invent an attrition percent. A flag does not become a company rate, a team rate, or a line that says how many people you expect to lose. Separating regrettable from other exits is a different artifact, the regrettable-attrition classifier. Do not merge the two into one cell.

HR platforms and listening tools (Workday, Lattice, Culture Amp, Visier) are a class of extracts you may already receive. Use them as dated files. Do not rank them. Do not treat a vendor export as a finished flag. Quality lives in the join, the cites, the vintage, and the brief.

Load tenure and engagement files before you score

Do not score until tenure and engagement files are loaded, dated, and joinable on the same employee key.

Tenure needs employee key, start date, current role, the as-of date of that role, and the org or location grain you will flag. Transfers, leaves, and relevels belong in the file if they change tenure in role. A start date with no role as-of date cannot support a role-level flag.

Engagement needs a survey or pulse identifier and a close date on every row. A row without a close date cannot appear in a vintage. Someone with no row in the declared window is unscored for engagement, not a candidate for fill-in.

Load compensation and promotion velocity with an effective date on every row. Compensation is one pay element you will cite (base, total cash, or band position), applied consistently. Promotion velocity is a dated sequence of level or role changes. Current level alone cannot support a velocity cite.

Write every extract date into the vintage. If tenure is a month-end snapshot, engagement is a quarterly pulse, and pay is a cycle file, keep all three dates. Do not collapse them into "current." Do not join a new pulse to last year's pay file and call it one score.

Join on a stable employee identifier. Quarantine unmatched keys. Do not impute tenure, engagement, pay, or promotions. If you already maintain a compensation flight-risk model, reuse that compensation extract so the pay vintage is shared.

Confirm grain before the first run. Role-level flags need complete files for that person in that role. Cohort-level flags need a defined cohort and a rule for how many members must be scorable before a cohort flag may exist. Write the rule down before you score.

Write the flag with factors and history vintage

When the join is complete enough, write a flag a staffing meeting can audit.

Store a binary flag or a small set of bands you defined in advance, at role and cohort grain. Next to it, required, put cited factors and history vintage. A score without those fields is not shippable.

Cited factors are columns you loaded, in file language: tenure in role from the snapshot date, engagement from the named pulse, compensation from the named extract, promotion velocity from the dated level-change file. Do not cite manager quality, culture, or market heat unless those arrived as dated fields. Do not cite a vendor risk label as a factor.

History vintage is the as-of date of each contributing file. One as-of date is enough only when every file shares one extract window. A flag with no vintage is a failure mode. You cannot compare it to the last run, tell an HRBP how stale the pulse is, or defend which pay file you used. Suppress vintage-less flags or return them to scoring.

Do not turn the flag into an attrition percent, per person, per role, or company-wide. The model may say this person or cohort looks elevated relative to the history you loaded. It may not invent a rate.

Illustrative example: people analytics loads one extract window for product managers in a single country. Tenure and current role are complete. Engagement is a quarterly pulse with a documented close date. Compensation is the current-cycle band file with an effective date. Promotion history exists for people hired into the company. Two people joined through acquisition in the current quarter and have no mapped internal level-change records. The model may write flags only for people whose four files join cleanly, citing stalled promotion velocity against that role's dated history and a pay position from the band file. The two acquisition hires stay blank because promotion velocity cannot be cited. The HRBP brief lists every extract date. It does not claim the country will lose a share of product managers, and it does not treat a flagged manager as already resigned.

Leave the cell empty when history is thin

Empty is a correct output.

Treat history as thin when tenure is too short for the role grain you chose, engagement is missing or outside the scoring window, the compensation file has no effective date, promotion history is absent or limited to a single undated event, an acquisition or relevel was never mapped, or a cohort is so small that a cohort flag would identify people you meant to keep aggregate.

When a required cite cannot be formed, do not score that row. Do not borrow a company-wide prior. Do not copy a vendor value that has no vintage of yours. Do not average scored neighbors onto blank rows. Do not omit vintage to hide a gap.

A person with complete files can receive a role-level flag even if others in the cohort are blank. A cohort-level flag cannot be published from a minority of complete rows. If you need to show the run existed, report scored count and unscored count with reasons. Do not issue a cohort badge that implies coverage you do not have.

This emptiness rule keeps the forecast from painting over gaps in a continuous workforce model. Planning needs visible holes. Invented coverage is worse than a blank.

People analytics briefs HRBPs; nobody auto-intervenes

The step after a scored run is a brief, not an automated action in the HCM system.

People analytics owns the packet: grain; who was scored; who was left blank and why; cited factors; history vintage; and the statement that the flag is not a resignation and not an attrition percent. HRBPs decide whether a stay conversation, a compensation review, a role change, or no action is warranted. The model does not open tickets, email employees, change eligibility, or start a backfill.

Do not treat the flag as a resignation. Do not block a promotion, start a backfill, or speak about the person in the past tense because a row exists. Calendar a review of the brief. Do not calendar their last day.

Do not invent an attrition percent because a leader asked for one. This forecast does not produce a percent. If leaders want to know why people already left, run attrition root-cause attribution on exits, with its own files and vintage. Do not reverse-engineer causes from flags on people who still work there.

Keep source files in the brief appendix: which extract, which system class, which date. Workday, Lattice, Culture Amp, and Visier may all appear in one quarter. None of them is the decision. The decision is whether the flag is cited, dated, empty where it should be empty, and still only a flag when it reaches the HRBP.

Is this worth automating for you?

Whether this pays back depends on how much time it takes your team today. Most teams estimate that from memory, and the estimate is usually wrong in one direction or the other. This one is rated high effort to implement, so the baseline matters more than usual.

DoneThat reconstructs where the time actually went, with no timers to forget, so you can measure the baseline before committing to a project and check the gain afterward.

Measure the baseline first