Skip to main content
DoneThat

AI Adoption GuideHRReward

Live market benchmarking

Real-time job-posting and salary feeds set ranges per role and geography continuously rather than annually.

HR processPlanSourceSelectHireOnboardDevelopRewardExit

By Don, DoneThat’s AI coach · updated

A range is only a range when vintage and match are cited

A live market range is fit to use when it names the licensed survey or posting feed, the vintage of that file, and the job match the numbers rest on. Missing any of those, compensation should treat the output as incomplete. It is not a percentile anyone can quote in an offer, a budget, or a board pack.

Continuous refresh does not lower that bar. Licensed job-posting and salary files can update a role-and-geography band as the market file updates, instead of waiting for the annual survey close. The quality outcome is the same either way: a cited range, or a blank. Empty stays empty when the match is thin. Compensation still publishes ranges. The feed does not auto-publish. Nobody invents a market percentile to fill a hole.

Live benchmarking is a drafting system. Publication remains a compensation decision. If a number cannot point to feed vintage and job match, it is not market data your team should stand behind.

Load the licensed feed, then match the job

Start with a licensed source. Do not scrape public postings into a homemade file, and do not reuse a remembered midpoint from last year's book. Survey cuts and posting feeds from vendors in the same class as Radford, CompAnalyst, Levels.fyi, and Workday are the inputs this page assumes. Treat them as a class of licensed market files. Do not rank them. Do not assume a feature one of them may or may not offer. Load the file your company actually licenses, write the vintage onto the load, and stop if vintage is unknown.

Vintage is the date or survey cycle of the file you loaded, not the date someone last opened a dashboard. If a survey cut and a posting feed are both in play, keep both vintages. Do not blend them into one unlabeled midpoint.

Job match comes after the load, and it is not a fuzzy title compare. Map the internal job to the taxonomy the license uses: family, level, and geography at the grain the file supports. The match is thin when the taxonomy row is missing, when the geography grain is coarser than the range you want to publish (city asked, nation returned), or when the level sits between two survey grades with no written crosswalk. Thin is not a prompt to interpolate a percentile. Thin is a blank.

Keep the match artifact with the draft: source job code, geo, level, and which rule or person accepted the match. Auditors, recruiters, and pay-equity reviews will ask why the band sits where it sits.

Draft the band and leave thin matches blank

Once the feed is loaded and the job is matched, draft the band the file supports for that match: typically a minimum, midpoint, and maximum, or the structure your compensation philosophy already uses. Store vintage and match in the same record as those numbers. Do not store a naked three-number tuple.

Do not invent a percentile. If the licensed file gives a range, or a set of published cuts your methodology already maps to min, mid, and max, use those. If the file does not support a percentile stakeholders like to quote, you do not mint one. Asking for a sixty-fifth percentile is not a reason to fabricate one from a posting cloud.

A compensation analyst refreshes the band for a mid-level product designer in two geos, Berlin and a US remote cut. The licensed posting feed has a current vintage and a clean taxonomy match for Berlin. The draft writes min, mid, and max, names the feed, names the vintage, and names the matched job code. The US remote cut returns mixed titles and no stable geo grain the team has agreed to use. The US row stays blank. The analyst does not average Berlin with a national US survey from a different vintage so recruiting has something to show. Recruiting can still open requisitions. Compensation publishes the Berlin range when they accept the draft, and they leave the US remote range unpublished until a licensed match exists.

That blank is the quality outcome. A published US number without vintage or match would look more complete and would be worse.

When a draft looks plausible but the vintage field is empty, stop. A range with no vintage is a failure mode that passes visual review. Someone will paste it into an offer calculator or a budget slide because the numbers resemble last cycle's. Without vintage you cannot tell whether the file is current, stale, or from a different product family than the one you think you loaded.

Compensation publishes; drafts stay drafts

The draft is a recommendation to compensation, not a live band. Auto-publish is out of scope. A feed can move from one load to the next. That helps a compensation lead judge whether a published band is still defensible. It is not a reason to let a nightly load rewrite what employees and candidates see.

Treat published as an explicit state: a person in compensation accepted the draft, confirmed vintage and match, and released the range into the system of record that recruiting, managers, and employees actually use. Until that happens, the live feed can keep producing new drafts. Those drafts must not silently replace the published band.

Treating the draft as published is the second failure mode. It shows up when a recruiter's tool reads the staging table, when a manager dashboard points at the feed instead of the published library, or when someone exports the latest draft to justify an offer exception. The fix is access and labeling, not a smarter load. Drafts are labeled draft. Published ranges are labeled published, with the vintage and match that were true at publish time.

Compensation can reject a draft even when the match is thick. Philosophy, internal equity, and budget still sit with the function. Live benchmarking informs the band. It does not replace the decision to put that band in market.

After a range is published, use it as an input, not as a second competing source of truth. Offer work should read the published band, then apply the company's offer rules. That is the handoff into comp recommendation per offer, which assumes a range compensation already stands behind.

Point offers, equity reviews, and merit at the published library

Live benchmarking is useful when the published library is the same library the rest of reward uses.

Pay-equity monitoring needs to know which band was in force, and from which vintage, when it flags a gap. A draft that never reached published status should not move an equity finding. Wire those checks to published ranges and their citations, as in continuous pay-equity monitoring.

Flight-risk scoring that treats below market as a feature needs the same gate. Below a draft is not below market. Below a published, cited range is a claim you can defend. Keep compensation flight-risk model pointed at published bands, or the model will chase feed noise.

Merit and focal cycles still need a freeze or a named vintage, even if you refresh bands between cycles. A merit worksheet that silently picks up a mid-cycle draft creates two populations: people calibrated to the published library, and people whose managers saw a newer unlabeled file. Point the merit cycle agent at the published library and record which vintage the cycle used.

The loop is short on purpose. Load the licensed feed with vintage. Match the job. Draft the range with both citations. Leave blanks where the match is thin. Let compensation publish. Skip a step and you get a number that looks like market data. Keep the citations and the publish gate, and you get a range a compensation lead can actually use.

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.

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