RefolkCandidates
PlaybookReading the market

The Own-Role Pay Benchmark, Triangulated From Public Sources

You will produce a triangulated low, median, and stretch pay range for your role, level, and metro, each figure traced to a dated source and adjusted for lag and geography.

16 min readLast reviewed September 8, 2026Read as Markdown

Key takeaways

  • An un-aged government median can be up to four years stale, understating a job with 3% annual raises by roughly 9 to 12 percent, which is exactly the gap the aging step closes.
  • The SF versus Rest-of-U.S. cost-of-labor gap is 25 percent, a differential that rivals a full pay-grade jump, so location must be adjusted before you set the midpoint, not after.
  • In Refolk's index there are 15.7x more software engineers in the United States (348,384) than in Germany (22,178), and thin local supply lets the same title command a higher percentile.
  • The 85/115 rule is the whole trick: minimum sits near 85 percent and maximum near 115 percent of midpoint, so once you defend the midpoint you have defended the entire range.
  • Posting transparency reduces pay dispersion without moving average wages, so the defensible upside of your stretch figure comes from level and scope, not from a wide posted band.
  • Discard any posting whose min-to-max spread exceeds about 60 percent before averaging, because a very wide band satisfies the law but tells you nothing about market center.

Before you name a number in a negotiation, you need one pay range you can defend line by line. This guide is the ordered procedure for building it: a single low, median, and stretch figure for your exact role, level, and metro, reconciled from three public inputs that each define the job differently, publish on different lags, and mean different things by the word "range." It is for a job seeker who is done averaging whatever a salary tool shows and wants a number traced to dated sources.

The ranking pages hand you a list of tools and tell you to average them. None of them reconcile sources that disagree on what your job even is. That reconciliation is the work, and it is what follows.

What "triangulated" means and why one source is never enough

A triangulated pay range is a single low, median, and stretch figure built by reconciling three independent public inputs - government wage percentiles, live posted ranges, and crowd-sourced self-reports - after correcting each for the lag and geography that makes it lie. No single input is trustworthy alone.

Each source fails in its own direction. Government data is authoritative on structure but old. Posted ranges are current but often gamed wide. Self-reports are timely but unverified and self-selected. Triangulation works because the three errors do not point the same way, so reconciling them cancels bias that averaging blindly would preserve.

The whole method funnels toward one number. Once you have defended the midpoint, the range around it is mechanical: the practitioner convention puts the minimum near 85% of the midpoint and the maximum near 115%, so every step before the last one exists to nail the center.

The three inputs and what each proves

  1. Posted ranges
    Current market center, but bands can be gamed wide to satisfy transparency law
  2. Self-reported figures
    Timely and role-specific, but unverified and skewed by who volunteers
  3. Government percentiles (OEWS)
    Authoritative structure and metro coverage, but up to four years stale
Each public source is strong on one axis and weak on another, which is why you need all three.
9-12%
How much an un-aged government median can understate current pay
On a job with 3% annual raises, the OEWS collection and publication lag compounds into roughly a decade-tenth gap.

Where the numbers come from, source by source

The three inputs each have a named public home. Knowing what each one actually measures - and its refresh cadence - is what lets you correct it rather than take it at face value.

The government floor is the BLS Occupational Employment and Wage Statistics program (OEWS). It publishes annually with a May reference date and covers about 530 metropolitan and nonmetropolitan areas, reporting the 10th, 25th, 50th, 75th, and 90th wage percentiles per occupation and area. Its weakness is lag: the sample of roughly 1.1 million establishments is collected over three years, and publication adds about another year. The May 2025 reference estimates were released on May 15, 2026.

Posted ranges come from live job listings for your role, level, and metro. Their value is currency, and their trap is width. A band running $130k to $500k satisfies a transparency law and tells you nothing. Regulator guidance, such as Colorado's, requires the posted range to span the pay the employer actually believes it will offer, but enforcement is uneven, so you filter for width yourself.

Self-reported figures are crowd-sourced compensation points for the same title and level. They are timely but unverified and self-selected, so they matter most as a third bearing rather than a primary anchor.

Mapping your title to a SOC code without guessing

The Standard Occupational Classification code is the key that unlocks government wage data, and the single most common way this whole exercise goes wrong is picking the code from your job title alone. Verify against the documented duties instead.

The route is ONET OnLine. In the Occupation Keyword Search box, type your job title or an ONET-SOC code, then compare the Description and Tasks against your actual work history before you capture the code. The taxonomy is granular: in the SOC system all workers fall into one of 867 detailed occupations, rolled up into 459 broad occupations, 98 minor groups, and 23 major groups, and O*NET's version encompasses more than 55,000 job titles. One marketing title can legitimately map to several codes.

Mismatches break most often on alternate titles and on occupations that split or roll up. "Product Manager" and "Marketing Manager" land on different codes with different medians. If you pick on the label, you inflate or deflate your floor before you have read a single wage figure. The test is simple: does the Tasks list describe what you actually do most days? If not, you have the wrong code.

Record one captured code plus a note of the close alternates you rejected and why. That note is part of your audit trail, and you will want it when someone asks how you arrived at your floor.

The triangulation procedure, step by step

Here is the full method in order. It runs about three hours end to end and produces a low, median, and stretch figure with every line traced to a dated source. The sequence is midpoint-first: you defend the center, then derive the edges.

From title to a defended range

  1. Fix the target
    Write your exact role, level, and metro as a one-line spec and hold it constant through every source. Done is a single line you quote back before each pull. (~15 min)
  2. Assign the SOC code
    Use O*NET keyword search, then verify against Description and Tasks, not the title. Done is one captured O*NET-SOC code plus a note of rejected alternates. (20-30 min)
  3. Pull the government floor
    Retrieve OEWS 10th/25th/median/75th/90th for that SOC in your metro and record the May reference date. Done is five dated percentile figures with their vintage noted. (20 min)
  4. Gather posted ranges
    Collect 8-15 current live postings for the same role, level, and metro; record each min, max, and midpoint with a date. Done is a table of posted midpoints, wide bands flagged. (45-60 min)
  5. Gather self-reported figures
    Pull crowd-sourced self-reported comp for the same title, level, and metro, noting each date. Done is a third column of dated self-reported points. (30 min)
  6. Age everything to today
    Escalate each figure to a common month using ~3-4% annual wage growth from the ECI. Done is every input restated as of the same month. (15 min)
  7. Apply the location adjustment
    If any input is national, shift it onto your metro with a documented cost-of-labor factor, applied multiplicatively. Done is all inputs on the same geographic basis. (15 min)
  8. Reconcile into one range
    Set the median from the reconciled center, then min = 85% and max = 115% of that midpoint (or a wider level-appropriate spread). Done is low/median/stretch, each line traced to a dated source. (20 min)

Two of these steps do the heavy correction: aging and location. Skip either one and your reconciled center inherits a bias you cannot see. The next two sections treat them on their own.

How three input sets narrow to one range

  1. Raw inputs collected
    15-25

    postings, self-reports, and five OEWS percentiles

  2. After width and vintage filters
    12-18

    gamed and stale points discarded

  3. After aging and location adjustment
    12-18

    all points on one date and one geography

  4. Reconciled figures
    3

    low, median, stretch

You start with many raw data points and finish with three defended figures.

Aging every figure to a common date

Averaging figures from different years drags your median in the direction of the oldest data, so before you reconcile anything, escalate every input to the same month. This is the correction that undoes government staleness.

BLS documents the method itself: age wage-survey data forward using the Employment Cost Index. The current escalation rate is modest and defensible. For the 12 months ending June 2026, compensation costs for private industry workers rose 3.3%, with wages and salaries up 3.1%; for civilian workers, wages and salaries rose 3.2% over the year. A practitioner figure of roughly 3 to 4 percent annually holds up.

The arithmetic is a compound-growth adjustment. A median with a May 2025 reference date, brought forward roughly a year at 3.1%, gains about 3%. An OEWS figure that is effectively four years old once you count the collection window gains closer to 12%. That is not a rounding error; it is the difference between a floor that looks fresh and one that predates the last two rounds of raises.

Aging is also where posted ranges earn their keep. They are the freshest input, so they need the least adjustment and serve as the reality check on everything else. If your aged OEWS median lands far below the freshest live postings, trust the postings and investigate the gap - your SOC code or your metro may be off.

Adjusting for location without confusing labor and living costs

Location can move pay more than a promotion does, so if any input is national you must shift it onto your metro before you set the midpoint. The right tool is a cost-of-labor differential, not a cost-of-living index.

The clearest public cost-of-labor index is the federal GS locality pay schedule. It is built from BLS data comparing federal and non-federal pay in each labor market, which makes it a measure of what employers pay, not what rent costs. It applies multiplicatively: locality-adjusted salary equals base pay times (1 plus the locality rate).

MetroLocality rateMultiplierPremium vs Rest of U.S.
San Jose-SF-Oakland46.34%1.4634+25.0%
New York-Newark37.95%1.3795+17.8%
Los Angeles36.47%1.3647+16.6%
Houston35.00%1.3500+15.3%
Washington DC-Baltimore33.94%1.3394+14.4%
Rest of U.S.17.06%1.1706baseline

The 2026 rates run from 17.06% in Rest of U.S. to 46.34% in San Jose-San Francisco-Oakland, averaging 23.89% across 58 areas. The SF-versus-Rest-of-U.S. gap is 25%, which rivals a full pay-grade jump. That is why location is adjusted before the midpoint, not after: get the geography wrong and you are anchoring to the wrong market entirely.

The trap here is using a cost-of-living index instead. Rent-based COL overstates pay in expensive-but-low-wage metros, because a place can be costly to live in without employers paying a premium. Move wages with the labor differential.

Metro choice can outweigh a promotion, so fix the geography before you fix the midpoint.

Turning the reconciled midpoint into low, median, and stretch

Once you have a single reconciled midpoint - all inputs aged to one month and sitting on one metro's labor basis - the range is mechanical. Set the minimum near 85% of the midpoint and the maximum near 115%, and widen only if your level warrants it.

The convention is well documented. Minimum sits at roughly 85% of the midpoint and maximum at 115%, giving about a 30% spread. Most sources aim for a 30 to 50 percent spread from minimum to maximum for typical roles; under 20% is too restrictive to justify pay differences, and over 60% makes those differences hard to defend. Mercer reports spreads typically 40 to 60 percent wide.

Spread widens by level. Use the band that matches your role.

LevelTypical spreadMin-max at $100k midpoint
Hourly/contract30-40%~$83k-$117k
Entry-mid professional/managerial40-60%~$77k-$123k
Executive60-70%~$71k-$129k

There is a structural reason the stretch end is harder to defend than it used to be. A 2026 NBER working paper finds that posting transparency reduces pay dispersion but has no effect on average wages: transparency raised posted and realized salaries without cutting vacancies or raising requirements. In plain terms, the number you were hoping to widen is being compressed. Your defensible upside now comes from level and scope, not from betting on a wide posted band.

A quick check before you commit: your compa-ratio is your target salary divided by the range midpoint, where 1.0 means paid exactly at the midpoint. If you are reading a below-1.0 ratio as evidence you are underpaid, contextualize it by tenure and time in role first - a new hire below the midpoint is normal, not a grievance.

Triangulated range worksheet
Role / level / metro spec: ____________________
SOC code (verified against Tasks): ____________________
OEWS median (dated ____, aged to ____): $______
Posted midpoints, filtered <60% spread (n=__): $______
Self-reported center (aged to ____): $______
Location basis applied: ______ (multiplier ______)
--- reconciled center ---
Median (midpoint): $______
Low  (0.85 x midpoint): $______
Stretch (1.15 x midpoint, or level spread): $______

Fill each cell from your own pulls; the last three rows are your deliverable.

How this goes wrong, and the check for each

Most bad benchmarks fail in one of seven predictable ways. Each has a signal that looks like signal but lies, and a specific check that catches it.

  • OEWS staleness read as current. A "fresh May 2025" median can be up to four years old once you count the three-year collection window plus the one-year publication lag. It looks current because of the recent release date. Check: age it forward with the ECI before comparing to anything.
  • SOC mismatch on title alone. Picking the code from the label maps "Product Manager" and "Marketing Manager" to different medians and inflates or deflates your floor. Check: confirm the Tasks list matches your actual duties, not just the title.
  • Posted-range gaming. A very wide band, such as $130k to $500k, satisfies the law but has no informative center. It looks like a data point. Check: discard postings whose min-to-max spread exceeds about 60% before averaging.
  • Locality versus cost-of-living confusion. A rent-based COL adjustment overstates pay in expensive-but-low-wage metros because it measures living cost, not labor price. Check: move wages with the cost-of-labor differential.
  • Blending vintages. Averaging a 2022 self-report with a 2026 posting drags the median down invisibly. Check: age every input to the same month first.
  • Midpoint drift. If your blended midpoint lands 15% below what competitors currently post, the range is broken before you build the edges. Check: sanity-check the midpoint against the freshest live postings.
  • Compa-ratio misuse. Reading a below-1.0 ratio as underpayment ignores tenure and performance. Check: contextualize the ratio by experience and time in role.

Reading supply so you know when to push past the median

Anchoring to the government median leaves money on the table where local talent supply is thin, because in scarce markets the same title commands a higher percentile. Supply is a negotiating lever, and you can read it before you name a number.

The signal is how many people hold your title in your market. In Refolk's index there are 348,384 profiles with the title Software Engineer in the United States against 22,178 in Germany - a 15.7x difference for the same title. Where supply is that much thinner, the market clears higher up the percentile band, so aiming at the median undersells you.

TitleCountryProfiles in Refolk's indexTop region
Software EngineerUnited States348,384San Francisco
Software EngineerGermany22,178Berlin Metropolitan Area
Ratio (US / Germany)-15.7x-

The top US employers for that title in Refolk's index include Google, Figma, Microsoft, and Glean, concentrated in San Francisco; in Germany the top employers include Zalando, TeamViewer, and Helsing, concentrated in the Berlin Metropolitan Area. That employer concentration tells you which live postings are worth weighting most in your posted-range pull.

To read your own supply, build a peer set narrow enough to match one SOC code and level cleanly. That is where a people search removes the friction of hand-counting profiles across sites.

Refolk builds that peer set in one query, and because it also writes and tailors your resume to each posting and scores how well you fit, the pay range you build here plugs straight into the applications where you will use it. Start from Refolk when you want the supply read and the application work in one place.

Keeping the benchmark current

A pay range decays the moment you file it, so treat it as a document with a shelf life rather than a one-time answer. Two things go stale: the vintage of your inputs and the market itself.

Re-pull when either moves. OEWS refreshes once a year on a May reference cycle, so a new release is a natural prompt to redo steps 3 and 6. Between releases, the live postings drift faster, and 77% of companies with formal salary structures review them annually while 94% use market data - so the bands you are benchmarking against move on roughly that cadence too. If more than a quarter has passed, re-run the posted-range pull and re-age everything.

Before you rely on the range in any negotiation, run the final check that it is still internally consistent.

Before you name your number

  • One SOC code, verified against the Tasks list, not just the title
  • Five OEWS percentiles recorded with their May reference date
  • 8-15 posted midpoints, every band wider than 60% discarded
  • A self-reported column with a date on every point
  • Every input escalated to the same month with the ECI
  • All inputs on one metro's cost-of-labor basis, not cost of living
  • Midpoint within ~15% of the freshest live postings
  • Low at 85% and stretch at 115% of midpoint, or a documented level spread
  • Each of low, median, and stretch traced to a dated source

The point of the audit trail is not neatness. It is that when someone across the table asks how you got to your number, you can walk them from the SOC code to the aged median to the location factor to the 85/115 edges, and every step has a date on it. That is what makes the range defensible, and defensible is the only kind of range worth building.

Questions job seekers ask

How do I find the salary percentiles for my job title and location?

Start with the BLS Occupational Employment and Wage Statistics program, which publishes the 10th, 25th, 50th, 75th, and 90th wage percentiles by occupation and area for roughly 530 metropolitan and nonmetropolitan areas. First map your title to a Standard Occupational Classification code using O*NET, because the tables are organized by code, not by job title. Then read the percentiles for your metro and record the May reference date so you can age the figure forward.

How stale is government salary data?

Substantially. OEWS estimates are built from a sample of about 1.1 million establishments collected over a three-year window, and publication adds roughly another year on top. The May 2025 reference-period estimates were released in May 2026, so a median can be up to four years old. On a job with 3 percent annual raises, an un-aged figure understates true pay by roughly 9 to 12 percent, which is why you escalate it forward with the Employment Cost Index.

Should I use cost of living to adjust salaries between cities?

No. Use a cost-of-labor differential instead. The federal GS locality schedule is based on BLS comparisons of federal and non-federal pay in each labor market, so it measures what employers actually pay, not what rent costs. Applying a rent-based cost-of-living index overstates pay in expensive-but-low-wage metros. The 2026 rates run from 17.06 percent in Rest of U.S. to 46.34 percent in the San Jose-San Francisco-Oakland area.

Why are posted salary ranges so wide and can I trust the midpoint?

A very wide posted band, such as a listing running $130k to $500k, can satisfy pay-transparency law while telling you almost nothing about market center. Regulator guidance in Colorado requires the range to span what the employer actually believes it will offer, but enforcement varies. Discard any posting whose minimum-to-maximum spread exceeds about 60 percent before you average the midpoints, so gamed bands do not distort your center.

How do I turn a midpoint into a full salary range?

Use the 85/115 convention: set the minimum near 85 percent of the midpoint and the maximum near 115 percent. That gives roughly a 30 percent spread. Widen it by level if warranted, with 40 to 60 percent typical for professional and managerial roles and 60 to 70 percent for executives. Once you can defend the midpoint from dated sources, the 85/115 rule defends the entire range.

Put this to work

Paste your career in once. Every application after that is written for you.

Drop a resume or a LinkedIn URL. I rank the live openings against it, rewrite the resume and write a cover letter for the best of them, and fill in the employer's form when you press the button. You read, you decide what goes out.

  1. 01Drop your resume

    A PDF or a LinkedIn URL. About a minute, once.

  2. 02I rank the openings

    Every weekday morning, the live catalog scored against your history. Up to 20 worth your time, not two hundred links.

  3. 03Each one is written up

    Resume rewritten for the posting, a cover letter, a fit score. Press send, or let me fill in the form.

  • New matches ranked and written before you are up.
  • Every bullet stays inside what your history supports. Nothing invented.
  • Queued, submitted, interviewing, offer: one screen, not a spreadsheet.

500 free credits on sign-up. No card. Nothing is sent until you say so.

Read next