Offer calibration desk for recruiting and finance teams

By General Input

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.

Integrations

  • Ashby
  • Job Salary Data
  • Slack Bot

Type

App

Categories

  • HR & People
  • Finance

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.

Related prompts

Explore more prompts
A brand asset library your marketing team actually searchesTurn Mailjet email clicks into ranked HubSpot follow-upsClean out the Looker dashboards and Looks nobody opensLiveKit live operations console for room moderationWake up dormant Keap leads with a researched reasonLiveChat coverage board for planning next week's shiftsPhone routing control panel for LiveKit voice agentsLinkedIn Ads budget pacing dashboard for every client accountGive your team Looker numbers without buying more seatsPause marketing emails to escalated customers, then restore them