Monthly salary benchmark refresh for your open roles

Every month, pull fresh advertised pay ranges for every open role in your hiring sheet and email the People team what changed.

Deterministic Code
JobsPipeGoogle SheetsGmailHR & PeopleOperationsData SyncEmail Automation
PromptCreate

On the first day of every month, refresh the advertised salary benchmarks for all of our open roles so that we never take a role to market with a stale band. Run this on a monthly cron trigger set to the 1st.

Start by reading our open roles from Google Sheets with Get Values over the tracked range. Each row holds a job title, a country, a seniority level, and optionally an ISCO occupation code. Keep track of which sheet row each record came from so that every result can be written back to the row it belongs to.

Before overwriting anything, capture the midpoint (p50) figure already sitting in each row from the previous run. That is what we compare against to work out movement.

For every row, call JobsPipe Get Salary Benchmark using the job title, country and seniority level from that row. Where a row also supplies an occupation code, additionally call JobsPipe Get Occupation Compensation Percentiles for that code. Note that JobsPipe matches 4-digit ISCO-08 codes exactly and treats 1-3 digit codes as hierarchy prefixes, so a shorter code returns a broader occupation family rather than an error.

Collect the p10, p50 and p90 advertised salary figures plus the date of this refresh, and write them back into the matching row using Google Sheets Batch Update Values. Batch every row update into a single write rather than issuing one write per row.

JobsPipe suppresses a result when a group has fewer than 30 postings, returning suppressed: true with null percentiles. When that happens, write "insufficient data" into the p10, p50 and p90 cells for that row instead of leaving them blank. A blank cell is too easily misread as a zero or as a row that failed to refresh, and either reading is misleading.

Make the sheet header row state clearly that JobsPipe compensation percentiles are always reported in USD regardless of the country filter applied, so that a country-filtered row is never mistaken for local currency.

Finish by sending the People team a short summary with Gmail Send a Message. List the roles whose midpoint moved most since the previous run, showing the old figure, the new figure and the direction of the change, and call out any roles that came back as insufficient data this month.

Two practical constraints to respect. Every JobsPipe request costs one credit against the monthly quota, including requests that return zero results, so keep the tracked sheet to a sensible number of roles and do not retry blindly. Pair any retry with an Idempotency-Key header so that it cannot duplicate billed work. Also expect genuine gaps in coverage, because only about a quarter of postings state pay at all.

Additional information

What does this prompt do?
  • Reads every open role from your hiring spreadsheet on the first of each month, including the job title, country and seniority level you track for each one.
  • Looks up fresh advertised pay data for each role and writes the low, midpoint and high figures back into the matching row, along with the date it was refreshed.
  • Marks a role as "insufficient data" when there are too few live postings to produce a reliable range, instead of leaving a blank cell that reads like a zero.
  • Emails your People team a short recap naming the roles whose pay moved most since the previous run.
What do I need to use this?
  • A Google account with edit access to the spreadsheet where you track open roles.
  • A JobsPipe account for the salary data. The free plan is enough to try this out, though a paid plan suits teams tracking a longer list of roles.
  • A spreadsheet laid out with one row per open role and columns for job title, country and seniority level.
  • Optionally, a standard occupation code per role if your team already classifies jobs that way. Rows without one still work.
  • A Gmail account to send the monthly recap from, plus the People team address that should receive it.
How can I customize it?
  • Change the timing. Monthly on the 1st is the default, but quarterly works well if your bands tend to move slowly.
  • Change who receives the recap, or point it at a shared People team inbox instead of named individuals.
  • Adjust which figures get written back, for example keeping only the midpoint if a full range is more detail than your hiring managers need.

FAQs

Why are the salary figures in US dollars when I track roles in other countries?
JobsPipe always reports its compensation percentiles in US dollars, even when the lookup is filtered to a specific country. The country filter changes which postings are counted, not the currency they are reported in. This workflow puts a note in your sheet header so nobody mistakes a UK or German row for local currency, and you can add your own conversion column alongside if your team prefers to review bands in local terms.
What does "insufficient data" mean when it shows up in my sheet?
It means there were fewer than 30 live postings behind that particular combination of title, country and seniority, so the source withholds a figure rather than publishing an unreliable one. The workflow writes those words into the row on purpose. A blank cell is easy to misread as a zero or as a row that simply failed to update, and either mistake could send a role to market with the wrong band.
How many open roles can I track in one sheet?
Every lookup counts against your monthly JobsPipe allowance, including lookups that come back empty, so it is worth keeping the sheet to the roles you are genuinely hiring for rather than every job description you have ever written. A few dozen roles is comfortable on a paid plan. If your list is long, consider running the refresh quarterly instead of monthly.
Will this overwrite notes or columns I have added myself?
No. It only writes to the specific benchmark columns and the refresh date column in each role's row. Any other columns you keep, such as hiring manager, req number or internal band, are left untouched, and rows stay in place so your own formulas and filters keep working.
What if a role has no pay data behind it at all?
Only around a quarter of job postings state pay publicly, so some niche or senior roles will always have thinner data than a common role in a large market. Those roles will show as insufficient data, which is itself useful signal that you are pricing into a thin market and may want a manual comparison rather than an automated band.

Related templates

Chase past-due JobNimbus invoices with escalating emails

Every weekday, find every unpaid JobNimbus invoice, email each customer one reminder that gets firmer as it ages, and post a receivables summary to Slack.

JobNimbus
Gmail
Slack Bot
Agentic Task
Flag at-risk students in Canvas before they fall behind

Every weekday at 7am, your active courses are checked for missing work, silent logins, and slipping grades, with a ranked list sent to your advising channel.

Canvas
Google Sheets
Slack Bot
Agentic Task
Weekly Canvas grading backlog report in Slack and Sheets

Every Monday at 8am, see exactly which assignments have work waiting, sorted worst first, posted to Slack and logged to a spreadsheet.

Canvas
Slack Bot
Google Sheets
Deterministic Code
Weekday early alert digest for at-risk students in Slack

Every weekday morning your advising team gets a ranked list of students slipping behind in each course, plus a tracking log that shows whether outreach worked.

Blackboard
Slack Bot
Google Sheets
Agentic Task
Turn every completed roofing job into a review request

Every evening we find the jobs you just finished, email each customer a personal review request, and log it on the job so nothing slips.

JobNimbus
Gmail
Agentic Task
Chase overdue ERPNext invoices with escalating reminders

Every weekday morning, review your unpaid ERPNext invoices, email each customer a reminder that gets firmer as the debt ages, and brief finance in Slack.

ERPNext
Gmail
Slack
Agentic Task

Stop taking roles to market with stale salary bands.

Set this up once and your compensation benchmarks refresh themselves on the first of every month, with the People team told what moved.