Offer calibration desk for recruiting and finance teams
See every open offer next to its internal pay band and a live market estimate, then log the decision and update the band in one place.
Build me an offer calibration desk that our recruiting lead and our finance partner work out of together. Ashby's own reporting cannot join offer data against outside market pay data, so the whole point of this app is to put our open offers, our saved internal pay bands, and a live external market estimate on one screen, and then let us act on what we see without leaving it.
The main view is a single table of every open offer, loaded with Ashby List Offers. Each row shows the candidate, the job, and the proposed compensation on the offer. Next to that, show the internal compensation range saved on that job, loaded with Ashby List Jobs and matched to the offer by job id. Next to that again, show a live market estimate for that job's title and location from Job Salary Data Get Job Salary Estimate. If an offer record only carries a candidate id rather than a name, resolve the details with Ashby Get Candidate Info so the table is readable at a glance.
Every row carries two independent verdicts, not one blended score: whether the proposed compensation sits below, inside, or above the internal band, and separately whether it sits below, inside, or above the market range. Show them as two clearly labeled indicators side by side. The case we care most about is an offer that is comfortably inside our internal band but below market, because that is the signal our band has gone stale, and a single combined score would hide it. Add a filter that narrows the table to only out of band offers, meaning anything outside either the internal band or the market range.
Cache market estimates per job title and location rather than per offer, and never refetch on every page load. Several open offers on the same role should share one cached estimate. Store the time each estimate was fetched, show a last refreshed timestamp on every row that uses it, and give the user a way to refresh a single estimate on demand so nobody calibrates against a stale number. This caching is load bearing rather than a nicety: the market data is a metered external API where the entry plan allows only about 50 lookups a month, so an uncached table would burn the quota on a single page load. Each lookup returns up to three publisher estimates, so keep the low, median, and high figures along with the confidence value the API reports, and surface confidence in the row so a thin sample is visible rather than treated as fact.
From any row I can log the calibration decision as a note on the candidate in Ashby using Create Candidate Note. The note should capture the decision we reached, both verdicts, the three numbers we compared (proposed, internal band, market range), the market estimate's refresh date, and who made the call, so the reasoning is legible later to someone who was not in the room.
From the same row I can update the job's compensation range with Ashby Update Job Compensation when we agree the internal band has gone stale. This edits a live band that other people rely on, so put a confirmation step in front of it: show the current range next to the proposed new range, state which job it affects and how many open offers reference that job, and require an explicit confirm before the write. Never write the range as a side effect of any other action.
Finally, I can post the approved summary into our compensation review channel with Slack Bot Send a Message. The summary should read as a decision record: role, candidate, proposed pay, how it compared to the internal band and to market, and what we agreed. Make the destination channel configurable rather than hardcoded.
Persist the calibration decisions the team logs so reopening the app shows what has already been decided and by whom, and so a row that was reviewed last week is visibly settled instead of resurfacing as new. This is a shared desk rather than a per person view: the recruiting lead and the finance partner should see the same offers, the same flags, and the same decision history.
Do not rebuild the reporting Ashby already ships out of the box, such as time to fill, time in stage, source quality, or offer acceptance dashboards. This app earns its place through the external join and the write back, so keep it focused on that.
What does this prompt do?
- Lists every open offer with the candidate, the role, and the proposed pay, side by side with the range saved for that job and a current market estimate for the same title and location.
- Flags each offer twice, once against your internal band and once against the market, so you can catch offers that look fine internally but sit below what the market actually pays.
- Filters down to only the offers that fall outside a band, so a calibration meeting covers just the rows that need a decision.
- Lets you record the outcome on the candidate's file, refresh an internal range that has gone stale behind a confirmation step, and post the agreed summary to your compensation review channel.
What do I need to use this?
- An Ashby account with permission to read offers and jobs, add candidate notes, and edit job pay ranges
- A Job Salary Data subscription for market pay estimates (the free tier works, with a small monthly lookup allowance)
- A Slack workspace with a channel your team uses for compensation reviews
How can I customize it?
- Change how far outside a band an offer has to sit before it gets flagged
- Choose which Slack channel approved calibration summaries are posted to
- Set how long a market estimate stays fresh before the app suggests refreshing it
FAQs
Does this change anything in Ashby on its own?
Why not just use Ashby's built-in reporting?
How current is the market pay estimate?
Can our recruiting lead and finance partner both work in it at the same time?
What if we have not filled in pay ranges on our jobs in Ashby?
Related templates
Stage a batch of filings overnight, then approve each completed form from a screenshot before anything is ever submitted.
Pick a client and a date range to see sent, replies, meetings booked and the real deal value your cold email produced, campaign by campaign.
Review every conversation Fin closed as resolved, judge which ones actually stuck, and see what the gap is worth against your bill.
Merge your IT, HR and Facilities queues into one list ranked by SLA time left, then reply, change status and escalate without ever opening Jira.
See every page's translation status at a glance, edit translations side by side with the English, and publish only what your team has actually approved.
One place for sales and ops to request an NDA or vendor agreement, watch its status, and let legal launch the contract in a single click.
Stop calibrating offers against a stale spreadsheet.
Put every open offer, your internal band, and live market pay on one screen your recruiting and finance leads share.