Refolk
PlaybookMarket and talent intelligence

The Rival Promotion-Velocity Playbook: Title Histories to Months per Level

Given three or four rivals and one job family, produce a dated table of median months per level step and senior internal-fill share, each tiered by sample size.

21 min readLast reviewed November 11, 2026Read as Markdown

Key takeaways

  • In Refolk's index of professional profiles there are 12.0 Senior Software Engineers per Staff Software Engineer in the UK against 5.5 in the US, so a UK rival's Senior to Staff cohort will often be too small for a defensible median.
  • Published Senior to Staff baselines run from 2 to 7 years, a spread wider than any gap a CHRO would act on, so only a matched outside-in cohort with confidence intervals can answer whether rivals promote faster.
  • Estimate months per level with Kaplan-Meier and censor everyone who left or is still waiting; dropping them makes every rival look faster, and if the survival curve never reaches 0.50 there is no median to report.
  • 19.7 percent of established US LinkedIn users retroactively edit the title or description of a job they have already left, and these edits become more frequent in the six months before a move, so leavers' histories are the least reliable.
  • In one simulation the interval around a median underestimated the standard error by 36% at n=20 and 15% at n=30 but only 3% at n=40, which makes 40 a sensible floor for a fully trusted cell.
  • APQC's median organization filled 45% of senior management and executive seats through internal promotion over three years, with 35% at the 25th percentile and 60% at the 75th, which gives a frame for a rival's outside-in internal fill share.

This playbook is for strategy, research and talent-intelligence teams who have been asked whether their people get promoted more slowly than they would at the three or four companies that keep hiring them away. It turns public title histories into same-employer cohorts, maps every rival onto one level ladder, corrects for the ways profiles undercount and misdate promotions, and ends in a dated table of median months per level step plus internal-versus-external fill share for senior seats. Every cell carries a sample size and a confidence tier, so the number holds up in front of a skeptical CHRO.

What a rival promotion-velocity benchmark measures

A rival promotion-velocity benchmark measures two things for one job family at each named rival: the median months a person spends at a level before stepping up at the same employer, and the share of senior seats the rival fills by promoting from inside. Together they show how fast a rival moves people up and whether it grows its senior people or hires them in.

Leadership cares because of retention. In LinkedIn data, employees "promoted within three years of being hired have a 70 percent chance of staying", against 45% for those with no internal move. Attrition counts tell you who left. Promotion velocity is the half of the story that explains why.

Terms used throughout:

  • Level step. One move up a common ladder at the same employer, for example Senior to Staff.
  • Cohort. Everyone who reached the starting level of a step at one rival inside the study window.
  • Censoring. Recording a person whose wait was cut short before any promotion showed up, because they left or because the study ended. They count as "waited at least this long", never as missing.
  • Crosswalk. A table that maps each rival's own titles onto the common ladder.
  • Internal fill share. The share of senior seat-holders whose previous position was at the same employer.
  • As-of date. The one date the whole table describes. Every number in the output carries it.

One distinction matters before you start. LinkedIn defines internal mobility as "any point in which an employee took a new position at the same company and includes both lateral moves and promotions". A headline competitor internal mobility rate built on that definition mixes sideways moves with step-ups. This method separates them, because only step-ups answer the question leadership asked.

Why published time-to-promotion benchmarks will not settle the question

Published time-to-promotion figures can't answer the question, because they disagree with each other by more than the gap a CHRO would act on. For Senior to Staff alone, public figures run from 2 to 7 years. No named HR benchmark survey publishes time to promotion by level step at all.

SourceSenior to Staff figureBasis
Huyen Chip analysis4 years19k self-reported records
developereq3.5 years median (2 to 5)Practitioner observation
careerclimb2 to 4 yearsPractitioner claim
Progression.fyi, second-hand3.1 years (4.2 at FAANG)Unverified
rockstardeveloperuniversity3 to 7 yearsUnsourced average

The spread has three causes: different samples, different definitions of "Staff", and no handling of the people still waiting when the sample was taken. I found nothing public at all for Manager to Director. The HR-benchmark pages that do give promotion-rate formulas assume you're reading your own HRIS, and you don't have a competitor's.

Use this table for one thing only: as a sanity bound. If your matched cohort gives a Senior to Staff median well outside 2 to 7 years, suspect the crosswalk or the corrections before you suspect the rival. On the public web, time to promotion by company is a range of opinions. A defensible answer needs a matched cohort with intervals.

How large each rival cohort will be, and where it runs out

Cohort size depends on how thin the target level is. In Refolk's index of professional profiles the Staff layer is thin, and much thinner in the UK than in the US. Before you pull anything, expect US rivals to support a Senior to Staff estimate more often than UK rivals, and set the window and tiers with that in mind.

CountrySenior SWEStaff SWESenior per StaffStaff share
United States183,00633,2275.515.4%
United Kingdom26,3962,20312.07.7%
US/UK multiple6.9x15.1x--

Counts are current-title matches in Refolk's index at the pull date. Ratios and multiples are derived. Staff share is Staff divided by Senior plus Staff.

12.0
Senior Software Engineers per Staff Software Engineer in the UK, in Refolk's index
Against 5.5 in the US, so a UK rival has far fewer Senior to Staff promotions to count, and its cohort will often fall under a defensible floor.

What follows from this:

  1. UK cohorts often fall under n=40. In one simulation, the log-transform interval around a median underestimated the standard error by 36% at n=20, 15% at n=30, and only 3% at n=40 (exponential event times, uniform censoring). A thin Staff layer means few events, and few events means an interval that looks tighter than it really is.
  2. More data helps less than you'd expect. Without censoring, interval width scales roughly with 1/√n, so going from n=30 to n=100 only cuts the width to about 55%. With censoring near 50% the gain is smaller still, because only completed promotions tell you anything about the median.
  3. The Staff title isn't spread evenly. In a 25-profile sample of US Staff holders in Refolk's index, the top employers were growth-stage companies such as Databricks, Vanta, Airbyte, Starburst and GitHub. Treat that as indicative only. It does mean that some rivals in your set may not use the Staff title at all, and that's a crosswalk problem, not a velocity signal.

These are counts of people who hold a title now, not promotion events. A rival's Senior to Staff cohort is the small slice of its people whose histories show the step inside your window, plus the Seniors still waiting. Count it before you commit to the step.

The procedure: rival set to a dated, tiered table

The method has eight stages, in this order. The research desk estimates six to nine working days end to end for one job family and four rivals. The durations below are those estimates, not published figures.

Rival promotion-velocity benchmark, end to end

  1. Scope the rival set, job family, and window
    Name 3 to 4 rivals, one job family, a 5-year window and an as-of date, and add your own company as a row. Done when written down and dated.
  2. Snapshot same-employer title histories
    Store every position with person, employer, title, start, end and pull date. Done when every row has all six fields.
  3. Build the level crosswalk
    Map each rival's titles onto one common ladder and check against posted rubrics. Done when 95% or more of cohort titles are mapped.
  4. Classify every title change
    Label each change as promotion, lateral, retitle, acting/interim, or rehire. Done when every change carries one label.
  5. Apply the corrections
    Censor at the last confirmed date, drop step-ups inside retitle windows, and start a new spell after any rehire gap. Done when the correction log is complete.
  6. Estimate months per step with Kaplan-Meier
    Run it per rival per step with Brookmeyer-Crowley intervals. Done when each cell has a median or 'not reached', an interval, n, and censored share.
  7. Compute senior internal fill share
    Classify each senior seat started in the window as internal or external by prior employer. Done when each rival has a share and a seat count.
  8. Tier and date the table
    Apply sample floors and confidence tiers, suppress cells below the floor, and stamp the as-of date.

Scope (about half a day)

Write down 3 to 4 rivals, one job family, a 5-year window, and one as-of date. Then add a row people skip: your own company, run through the identical outside-in pipeline. Your HRIS number and a rival's public-profile number carry different biases, so comparing them measures the method rather than the companies. When both sides are built from public profiles, the biases mostly cancel.

Snapshot the cohorts (1 to 2 days)

Pull same-employer title histories and store every position with its pull date, because "a profile pulled in 2026 can differ from the same profile pulled in 2022". Finding the people is usually the slowest part of this step. With Refolk you can ask for the cohort in plain English, across LinkedIn, GitHub and the open web, instead of maintaining a Boolean string per rival. Stamp the pull date yourself as rows come in.

Snapshot row and correction log schema
person_id | employer | position_seq | raw_title | start_month | end_month | pull_date | ladder_level | crosswalk_era | change_label | last_confirmed_date | spell_id | censored (Y/N) | censor_reason

CORRECTION LOG
person_id | position_seq | correction | rule applied | before | after | analyst | date
example rule values: lag-censor | retitle-window-drop | nested-split | acting-revert | rehire-new-spell | edit-flag

One row per position held; keep the log in a separate sheet keyed on person_id and position_seq.

Build the crosswalk (1 to 2 days)

Start from Levels.fyi's standard levels. Its own documentation says "levels are mapped based on scope & responsibility as well as employee transfers - not compensation", and that mappings "won't always perfectly map 1:1 for all cases". It also maps its standard levels onto the major compensation-survey leveling schemes, which helps if your own organization levels against one of those. Check every non-obvious mapping against the rival's posted rubrics or job descriptions. You're done when 95% or more of the titles in your cohorts are mapped. That threshold is the desk's suggestion, not a published standard.

Keep one crosswalk per era of a rival's ladder. "Many companies either update scope or even restructure leveling altogether". When Daily moved from three levels to seven, it "releveled current staff according to our new tiers". A single crosswalk spanning both eras turns that releveling into a burst of fake promotions.

Classify each title change (1 to 2 days)

Give every same-employer title change exactly one label. The labels and what they do to the estimate:

LabelCounts asTell
PromotionEvent that ends the waitHigher level on the crosswalk, same spell
LateralNot an event; wait continuesSame level, new title or team
RetitleNot an eventStep-up inside a known renumbering window
Acting/interimNot an event"Acting" or "interim", or under 6 months then reverts
RehireNew spell, external fillAny gap between spells at the employer

Collapsed and nested entries need one published rule. When "the container has lower seniority than the contained position, we shorten the container's end date to the contained position's start date, treating the latter as a promotion". Apply it as written and log each case.

Is this title change a promotion?

  1. Same spell?
    Any gap between spells at the employer means a new spell and an external fill, not a promotion.
  2. Acting or interim?
    The title says so, or the role lasts under 6 months and reverts; label it and keep the wait running.
  3. Inside a retitle window?
    Step-ups during a known renumbering are retitles and are dropped.
  4. Higher level on the crosswalk?
    Yes is a promotion; the same level is a lateral.
A same-employer title change counts as a promotion only if it survives the spell, acting, retitle, and crosswalk tests in that order.

Apply the corrections (about 1 day)

  1. Update lag. Censor each person at their last confirmed date, not the pull date, so a promotion that hasn't reached the profile yet doesn't count as months of waiting. LinkedIn deals with lag differently: its hiring rate counts only members who added a new employer "in the same month the new job began", to "account for any potential lags in members updating their profiles". That's a filter applied before estimation. Censoring deals with lag during estimation and keeps more of a small cohort, which is why I prefer it here.
  2. Retitle windows. Drop step-ups that fall inside a known retitle window for that rival.
  3. Rehires. Treat a return after any gap as a new spell.

Every change goes in the correction log. If you can't explain a cell's n from the log, the cell isn't finished.

Estimating median months per step without dropping the people still waiting

Estimate months per level with Kaplan-Meier, which keeps everyone who hasn't been promoted yet in the calculation as a censored observation rather than throwing them away. Dropping them makes every rival look faster than it is. If the curve never falls to half, there is no median to report.

In plain terms, Kaplan-Meier works like this. Each month in which someone is promoted, the estimated share of the cohort still waiting drops by the fraction promoted among those still at risk. People who left, or who are still at the level on the as-of date, stay in the at-risk count until their last confirmed date and then drop out without counting as promotions. The median is the first month at which the share still waiting falls to 0.50.

Attach a Brookmeyer-Crowley interval to every median. Standard Kaplan-Meier software computes "the median survival time and its 95% CI" this way. The method "inverts the confidence band for the survival curve rather than relying on the asymptotic normality of the median estimate", and that suits skewed waiting times like these.

Two limits to state in the output, not hide:

  • "If the survival curve does not fall to 0.50 - which can happen when follow-up is short or the event rate is low - the median is undefined and should not be reported."
  • Even when the median exists, "a finite interval may still be unavailable in a particular small sample".

Sample floors and confidence tiers

No one has published a sample floor for promotion data. The floors below are my proposal, built from the simulation results above and the finding that "at 50% censoring, sample size became important".

  • Tier A. n of 40 or more, censored share under 50%, median reached with a finite interval.
  • Tier B. n of 30 to 39, or censored share of 50% or more, with the median reached and a finite interval.
  • Tier C, directional only. n of 20 to 29 and the median reached.
  • Not reported. n under 20, or the curve never reaches 0.50, or no finite interval. Report the censored share and "median not reached" instead.

Which cells can carry a median

50% or more censoredUnder 50% censored
Small and heavily censored
Expect no median; report n and censored share only
Large but heavily censored
Tier B; report the interval and consider a longer window
Small, lightly censored
Tier B at 30 to 39, Tier C at 20 to 29, suppress under 20
Large, lightly censored
Tier A; report median, interval and n
Under 40 in cohort40 or more in cohort
Cohort size and censored share together decide whether a cell reports a median, a caveated median, or only its censored share.

Internal versus external fill share for senior seats

Internal fill share is the fraction of a rival's current senior seat-holders who got the seat by promotion from inside rather than by joining from outside. It is the second half of the benchmark. A rival can promote slowly overall and still win your people if it fills senior seats from inside, or it can promote fast at junior levels and buy its senior people.

No published method computes this for a competitor from outside. The rule below comes from the research desk and is adapted from APQC's definition. It is not an established outside-in method, so label it that way in the output.

  1. List every current senior seat-holder in the job family at the rival.
  2. Keep those whose start date in the seat falls inside the window.
  3. Count the seat as internal if the person's previous position was at the same employer, in the same spell. Otherwise count it as external.
  4. Count rehires after a gap as external fills, consistent with the spell rule.
  5. Report the share, the number of seats, and the window.

Finding the external half is the fiddly part, because it means separating seat-holders who joined from elsewhere from those who rose inside. Refolk handles that as a plain request, for example Directors of Engineering at a named rival who joined from another company inside your window. You then confirm each prior employer against the snapshot.

Compare the result against these benchmarks, keeping their scopes in mind:

BenchmarkFigureScope
APQC median45%Senior management and exec, 3 years
APQC 25th to 75th percentile35% to 60%Leadership openings
ISO/TS 3043370% to 80% (example only)Critical positions
Spencer Stuart, technology56%S&P 500 C-suite
DDI49%Key roles fillable internally

Only the APQC rows measure roughly what this rule measures. The ISO figure is offered "only as an example of good succession effectiveness". The Spencer Stuart figure is C-suite only. The DDI figure measures readiness ("just 49% of key roles could be filled internally today"), not fills that actually happened. The cleanest comparison is still your own company's outside-in share against each rival's, built with the same rule.

How the benchmark goes wrong: failure modes and false positives

Public title histories undercount some promotions, misdate others, and invent a few. Each failure below makes a rival look faster or slower than it is, in a predictable direction, and each has a check you can run locally. Nobody has published how often each pattern occurs, so run every check on every rival rather than assuming any of them is rare.

  1. Update lag. Recent promotions haven't reached profiles yet, so recent cohorts look slow. What it fakes: a slowdown in the latest year. Check: compute medians with the last 6 to 12 months included and excluded. If the median shifts, censor that period.
  2. Retroactive edits. "19.7 percent of established U.S. LinkedIn users retroactively edit the title or description of a job they have already left", according to an analysis of "monthly snapshots of 29.4 million U.S. LinkedIn profiles". An inflated earlier title shortens the apparent wait or invents a step. Check: compare snapshots of the same profile from different pull dates, and flag edits made close to a departure.
  3. Company-wide retitles. In the Wayfair case, titles moved up one level number with "New titles but paybands remain the same". What it fakes: a wave of same-month promotions. Check: look for a month whose share of step-ups is far above that rival's normal monthly rate, and confirm against the crosswalk era.
  4. Titles that track pay. At some employers "titles corresponded to pay ranges, so a raise came with a new title". What it fakes: frequent small steps with no change in scope. Check: test whether the new title maps to a higher level on a scope-based crosswalk, not just a higher number.
  5. Collapsed nested entries. Someone keeps one employer entry showing only their latest title, which hides the promotion and inflates months per level. Check: compare tenure on the entry with the typical time at the starting level, and apply the container rule where nesting exists.
  6. Acting or interim titles. These look like a step up. Check: the title contains "acting" or "interim", or the role lasts under 6 months and then reverts.
  7. Rehires after a gap. Someone who returns at a higher level gets read as an internal promotion. Check: any gap between spells at the same employer starts a new spell, counted as an external fill.
  8. Crosswalk drift outside the best-known companies. One practitioner says standard mappings are "accurate for the small handful of well known companies. It falls apart when comparing the companies outside of the top 10 or so". Check: confirm every such rival's mapping against posted rubrics before using it.
  9. Dropping the people still waiting. Leaving out anyone not yet promoted makes everyone look faster, and a curve that never reaches 0.5 has no median. Check: report the censored share for every cell.

Two of these failures push in the same direction, which is why they deserve the most scrutiny. Retitles and pay-tracking titles both make a rival look fast. A Wayfair-style renumbering raises the apparent step rate of every affected employee in a single month while the pay band stays put.

The rival that looks fastest may simply be the one that renumbered its ladder.

If one rival's median comes out sharply faster than the others, open its monthly step-up counts before you open a slide.

Publishing the table and keeping it current

The deliverable is one dated table per job family: a row per rival plus your own company, a median and interval per level step, the internal fill share for senior seats, and n, censored share and tier on every cell. A number without a date, an n, and a tier doesn't belong in front of leadership.

Promotion-velocity benchmark output
PROMOTION-VELOCITY BENCHMARK - <job family>
As of: <as-of date> | Window: <start> to <as-of date> | Snapshots pulled: <first pull date> to <last pull date>
Method: same-employer cohorts, common-ladder crosswalk, Kaplan-Meier medians with Brookmeyer-Crowley 95% intervals, censoring at exit, last confirmed date, or as-of date.

Company | Step | Median months (95% CI) | n | Censored % | Tier
<own company> | Senior to Staff | <median> (<low> to <high>) | <n> | <pct> | <A/B/C>
<rival 1> | Senior to Staff | <median> (<low> to <high>) | <n> | <pct> | <A/B/C>
<rival 2> | Senior to Staff | median not reached | <n> | <pct> | not reported

Company | Senior seats started in window | Internal | External | Internal share | Tier
<own company> | <seats> | <internal> | <external> | <pct> | <A/B/C>
<rival 1> | <seats> | <internal> | <external> | <pct> | <A/B/C>

Notes: fill-share rule is adapted from APQC's definition and is not a published outside-in method. Tiers: A n>=40 and <50% censored; B n 30-39 or >=50% censored; C n 20-29, directional only; suppressed under 20 or median not reached. Correction log and crosswalk versions attached.

One table per job family; repeat the step columns for each level step you measured, and never fill a suppressed cell with a guess.

Run through this before you send anything:

Before the table leaves your desk

  • Every row carries the as-of date and every snapshot row carries its own pull date.
  • Your own company was run through the same outside-in pipeline as the rivals.
  • The crosswalk maps 95% or more of cohort titles, with a separate version for each releveled era.
  • Every rival outside the best-known companies had its mapping checked against a posted rubric.
  • Every same-employer title change carries exactly one of the five labels.
  • The correction log accounts for every retitle window, acting role, nested split, and rehire.
  • Medians were compared with the last 6 to 12 months included and excluded, and any shifting period was censored.
  • Every cell shows n, censored share, and tier, and no median is shown where the curve never reached 0.50.
  • The fill-share rule is stated in the notes and labeled as adapted, not published.

To keep the benchmark current, re-pull the same cohorts on a fixed cadence rather than starting fresh. Each new pull does two jobs. It moves the as-of date and turns censored waits into observed promotions, and it creates a second snapshot of every profile, which is the only way to catch retroactive title edits from outside. Diff each profile against its earlier snapshot, flag any changed past title, and give extra scrutiny to edits by people who have since moved. When a rival relevels, start a new crosswalk era rather than editing the old one, so earlier tables can still be reproduced. Then re-date the table, even if no number changed.

Questions practitioners ask

How do you benchmark promotion velocity against competitors without their HR data?

You rebuild it from public title histories. Pull same-employer histories for one job family at each rival, map titles to a common ladder, label each title change, and correct for update lag, retitles and rehires. Then run Kaplan-Meier per rival per level step to get median months with an interval. Run your own company through the same pipeline so both sides carry the same biases.

How long does it take to go from Senior to Staff engineer?

Published figures run from 2 to 7 years, which is too wide to benchmark against. One analysis of 19k self-reported records found about 4 years, and one practitioner reports a 3.5-year median with a 2 to 5 year range. These use different samples and definitions and ignore people still waiting, so treat them as a sanity bound and measure your rival set directly.

Why not just average the time between title changes?

An average of completed promotions drops everyone still waiting, and that makes every company look faster than it is. People who left before a promotion, or who are still at the level on the as-of date, carry real information: they waited at least that long. Kaplan-Meier keeps them in as censored observations, and it tells you honestly when there is no median to report.

What sample size do I need per rival and level step?

No published floor exists for promotion data. The closest guide is a simulation where the interval around a median understated the standard error by 36% at n=20, 15% at n=30 and only 3% at n=40. I treat 40 as the floor for a fully trusted cell, 30 to 39 as caveated, 20 to 29 as directional, and suppress anything under 20.

What is a good internal fill rate for senior roles?

APQC's median organization filled 45% of senior management and executive positions through internal promotion over three years, with 35% at the 25th percentile and 60% at the 75th. ISO/TS 30433 gives 70% to 80% only as an example of good succession effectiveness. Compare a rival's outside-in share against your own outside-in share first, then against these benchmarks.

Can a company-wide retitle make a rival look like it promotes faster?

Yes, and it is the most common false winner. When Wayfair renumbered its levels, titles moved up one level while pay bands stayed the same, so every affected employee looks promoted in the same month. Check for a month where step-ups run far above that rival's normal monthly rate, and drop the step-ups inside that window.

Try it on the search you came here for

Stop building boolean strings. Just describe the person.

Type one sentence. I plan the search, read GitHub, public LinkedIn and Crunchbase records, and the open web as it is right now, and hand back a ranked list with the reason next to every name.

  1. 01Describe them

    One plain sentence. Role, city, stack, stage, whatever matters to you.

  2. 02I read the web live

    GitHub, public LinkedIn and Crunchbase records, the open web. Not a database that went stale last quarter.

  3. 03You read the shortlist

    Ranked, with the reasoning under every name. Open a profile, ask a follow-up, narrow it down.

  • No boolean, no filters, no seat to buy. One box.
  • Read at search time, so a profile updated yesterday counts today.
  • Every step visible as it runs, every name with its reason.

500 free credits on sign-up. No card, no demo call. See real searches.

Read next