Rejection rate
Also called:candidate rejection rate, application rejection rate
The formula looks simple: rejections divided by candidates considered. The part that's contested is what counts as a rejection, and what a team does with the candidates who never get one.
The shortcut most dashboards take
The formula is not the hard part: rejection rate is the number of candidates explicitly declined at a stage or across a search, divided by the number who entered it, times 100. For a role with 120 candidates where 18 are explicitly told no before interview, the screening rejection rate is 15%.
Most reporting never runs that calculation. It computes rejection rate as 100% minus the stage’s yield ratio: whatever didn’t advance gets counted as rejected, because “didn’t advance” and “rejected” look like the same bucket from a query that only tracks stage moves.
Where that shortcut breaks down
They aren’t the same bucket, and the gap runs in two directions at once.
- Some of “didn’t advance” was never a rejection. A candidate who accepts a competing offer, or who stops replying mid-process, withdrew. Nobody on the hiring team decided anything. Counting them as rejected credits (or blames) a decision that was never made.
- Some real rejections never get logged. SHRM, reporting on Talent Board’s 2023 Candidate Experience Benchmark Research, found that 36% of candidates said they had not heard back from an employer one to two months after applying, unchanged from 2022 (source). Those candidates are functionally rejected; the company just never closed the record. They sit outside both the numerator and the denominator of a “clean” rejection rate, undercounted exactly where the dashboard looks tidiest.
The two errors partly cancel out, which is the worst outcome available: the number stays stable and looks defensible while telling almost nobody anything they could act on.
What we track instead
Join sells the ATS that would enforce this, so weigh the recommendation with that in mind. Keep “Rejected” and “Withdrawn” as two separate, explicit statuses that a person sets, never one inferred from the absence of a stage move. Then pair rejection rate with a close-out rule: a candidate with no status change past a set number of days gets flagged for a decision rather than left open indefinitely, which is what quietly inflates the “didn’t advance” bucket in the first place.
Paired with offer acceptance rate, an explicit-rejection rate also tells the team something an inferred one can’t: how much of the funnel needed a real decision at all, as distinct from how much of it simply left. Automated rejection handles the mechanical half of closing that gap once a candidate is confirmed inactive; it doesn’t replace the discipline of marking rejections as rejections.
Where Join fits
Join's pipeline reports break rejection rate out by stage and separately from withdrawals, and flag any candidate sitting without a status change past a set number of days, so the close-out problem below shows up as a queue to clear, not a mystery in the aggregate number.

