---
name: "compensation_benchmarking"
description: "Benchmark pay against market data with discipline: score survey sources before trusting them, match jobs on duties at an 80 percent threshold instead of titles, age data to a common date, build bands from a stated target percentile and spread, and flag out-of-range and compression outliers before they become retention or equity problems. Use when pricing a job, building or refreshing salary bands, checking whether pay is competitive, preparing for a pay review cycle, or investigating why offers are being rejected or staff are leaving over pay."
---

# Compensation Benchmarking

## Purpose

Price jobs from market data you can defend. The failure mode in this work is not bad arithmetic. It is a confident band built on a weak survey, a title match that ignores scope, or stale data treated as current. This skill runs the full workflow in order: check the source, match the job, age and combine the data, build the band, then flag the people the new band puts in a strange place.

## Workflow

1. **Define the job before touching market data.** Write the internal job in terms of duties, scope, autonomy, impact, and required qualifications. Note the talent market you actually compete in for this job: geography, industry, and company size. A pricing exercise with no written job definition cannot be matched or audited later.

2. **Score every survey source before using it.** Run the source check in `references/worksheets.md`. Hard gates: published method, stated pay definition, cuts that match the decision, visible sample counts per job, and a known collection date. Government data such as the US Bureau of Labor Statistics Occupational Employment and Wage Statistics program is free and method transparent, classifies jobs by duties under the Standard Occupational Classification system, and reports percentiles by occupation, industry, and area. It is also a snapshot built from panels collected over three years, so treat it as a floor and a cross check, not as current private sector total pay. Commercial surveys give fresher, richer cuts at a cost. Use three or more sources for a benchmark job where you can, so one survey swing does not move a whole band.

3. **Match on duties, not titles.** Score each internal job against each survey job summary using the matching worksheet in `references/worksheets.md`, and score it before looking at the pay values. Accept a match at 80 percent duty overlap or better with the level check passing. Below that, blend two partial matches with stated weights, price the job from its parts, or leave it unmatched. Never force a hybrid job into the nearest title. Record any scope adjustment, for a job clearly bigger or smaller than its survey match, with the reason in writing.

4. **Put all data on the same footing.** Convert every value to the same pay definition before comparing: base only, or base plus target incentive, never a mix in one column. Convert hourly to annual with the employer's own scheduled hours, and note that BLS annual figures use 2,080 hours. Age every value to one common date using a published movement index, such as the BLS Employment Cost Index for the closest occupation or industry cut. The bundled tool does the math: `python3 scripts/benchmark.py age 100000 6 3.4` ages 100,000 forward six months at 3.4 percent a year and prints 101685.79. State the rate and its source next to every aged number.

5. **Combine sources with a rule stated in advance.** Pick the rule before seeing the results, for example the median across sources or a mean weighted by incumbent counts. Apply it the same way to every job in the run. If one source sits far from the others, check its sample counts, its cut, and its pay definition before dropping it. Dropping the inconvenient source after seeing pay is how bands get steered.

6. **Set the policy position, then build the band.** State the target percentile for the job family and the reason, tied to attrition risk, scarcity, and what the organization can pay. Lead, match, or lag is a policy choice, not a finding. Build the range with the bundled tool:

   ```bash
   python3 scripts/benchmark.py bands market.csv
   ```

   Input columns: `job,p25,p50,p75,target_percentile,spread_pct`. Midpoints between published percentiles are linearly interpolated, and the tool refuses to extrapolate past P25 or P75. Range math: minimum equals midpoint divided by (1 plus spread/2), maximum equals minimum times (1 plus spread). A midpoint of 100,000 at a 40 percent spread gives 83,333 to 116,667. Spreads usually widen at higher levels, where the real spread in performance and experience is wider. Check overlap with neighbouring grades and price the cost of lifting everyone below the new minimum.

7. **Flag outliers before anyone acts on the band.** Run:

   ```bash
   python3 scripts/benchmark.py outliers employees.csv bands.csv --summary
   ```

   Input: employees as `employee_id,job,pay`, bands as `job,range_min,midpoint,range_max`. Output adds compa-ratio (pay divided by midpoint), range penetration ((pay minus minimum) divided by (maximum minus minimum), as a percent), and flags: BELOW_RANGE, ABOVE_RANGE, LOW_COMPA_REVIEW under 0.85, and HIGH_COMPA_REVIEW over 1.15. Add a compression check the tool does not do: any manager paid within 5 percent of, or below, a direct report in the same family. Every flag gets a disposition with an owner and a date: adjust, hold with a written reason, or recheck the match and band first.

8. **Report the movement, not just the new numbers.** When a band moves, show where each incumbent sat under the old band and where they sit under the new one. A person can drop from a compa-ratio of 0.964 to 0.871 with no pay change and no performance change, only because the midpoint moved. If the report hides that, managers will misread a structure change as a people problem, and staff will hear that they fell behind when nothing about them changed.

9. **Set the next review date when you publish the band.** Annual review is the common cadence, with an off cycle check when a family shows a run of rejected offers, rising pay related exits, or a market move large enough to matter. Record which sources and vintages built the current bands, so the next review can tell a real market move from a change in the sample.

## Output Contract

A benchmarking deliverable contains:

- The job definitions and the talent market scope used
- A scored source sheet for every survey used, with collection dates and pay definitions
- A matching worksheet with duty overlap scores, level checks, scope adjustments, and accept, blend, or reject decisions, scored before pay was viewed
- The combining rule, the aging rate and its source, and the common date all values were aged to
- A band table per grade: target percentile with its written reason, midpoint, spread percent, minimum, maximum, and overlap with neighbouring grades
- An outlier report with compa-ratio and range penetration per incumbent, below range, above range, low and high compa flags, compression pairs, and a disposition, owner, and date for every flag
- A movement report showing incumbent position under the old band and the new band side by side
- The cost of bringing everyone below a new minimum up to it, stated separately from all other adjustments
- The next review date and the trigger conditions for an off cycle review

## Operating Rules

- Never invent a market value. A percentile, a spread norm, or a movement rate in the deliverable traces to a named source with a date, or it is cut. If a job has no defensible data, say so and price it by internal value with that limitation stated.
- Titles are not matches. A match claim without a duty overlap score is an opinion, and it gets labelled as one.
- Compa-ratio and range penetration describe position, not worth. They are not performance scores, they do not prove underpayment or overpayment on their own, and they do not prove or disprove pay equity. A pattern across a protected group is a prompt to commission a proper pay equity study run by qualified people, not a conclusion to announce.
- Do not cherry pick. Cutting the highest source to save money or the lowest source to win an argument both corrupt the band. Handle a suspect source through the source check, in writing, before combining.
- Handle pay data as sensitive. Work with the smallest extract that does the job, keep individual pay in access controlled files, and share bands and aggregates in reports, not named individual salaries, unless the audience has a stated need.
- Respect antitrust limits. Never agree with another employer on pay levels, ranges, or hiring restraint, and never exchange company specific current or future pay plans with a competitor. Buying a published, aggregated survey from an independent provider is a different act from sharing your own plans. The old US safety zone for survey sharing, third party managed, data over three months old, at least five participants, no participant over 25 percent of a statistic, was guidance that has since been withdrawn, so treat those checks as risk reducers only and get legal counsel before running or joining any employer to employer pay data exchange.
- Distinguish base, target total cash, and total rewards in every table. Equity, benefits, and allowances change the competitive picture, and a base only band presented as a total pay finding misleads everyone who reads it.
- A band is a decision aid with a shelf life. If the data behind it is older than the review date you set, the band gets labelled stale wherever it is quoted, including in offer discussions.
