# Competitor hiring radar for talent acquisition teams

> Open one board before every planning meeting to see how many roles each competitor has open, what changed since the last check, and what it means.

- Workflow type: app
- Services: JSearch, Google Sheets, Slack Bot
- Categories: HR & People, Operations
- Published: 2026-08-31

## What it does

- Keeps the companies you watch in a Google Sheet your team edits directly, so anyone can add or drop a competitor without opening the app
- Shows every company on one board: roles open right now, how that moved since the last check, and the mix by function, seniority and location
- Opens any company to browse its live postings, filter them, and read the full description and apply link behind an individual role
- Gives each row an Explain this move button that hands the company to a background assistant, which compares today's roles against your saved history, writes a short read on what they are building, posts it to your recruiting channel and leaves it on the row
- Saves a dated snapshot every time someone refreshes, which is what the trend line and the change since last check are calculated from

## What you'll need

- A JSearch connection for live job posting data, which uses a free key from your RapidAPI account
- A Google account and a spreadsheet holding the companies you want to watch, one per row
- A Slack workspace and the channel your recruiting team actually reads
- Your competitor company names spelled the way they appear on job boards

## Prompt

I run talent acquisition and I want a competitor hiring radar I can open before every planning meeting, instead of paying for an enterprise labor market intelligence seat. Job postings are the most honest public signal a company gives about where it is investing, and my team needs a browsable board they can read in two minutes, not another weekly email. Build me an app for that.

The watchlist of companies lives in a Google Sheet, not in the app, so my team can edit it without asking anyone. On load, read the Watchlist tab with Google Sheets Get Values: one row per company with the company name as it appears on job boards, plus optional columns for a country or region to scope to, an owner, and a note. Whatever is in that sheet is the board, so a company added this morning shows up on the next load and a deleted row disappears. If the sheet is empty or missing the expected columns, say so plainly and show me the exact headers to add rather than failing silently.

The main surface is a watchlist board, one row per company. Each row shows the company name, how many roles they have open right now, the change since the last time anyone checked (with both dates named, not just a number), a small trend line built from stored snapshots, a breakdown by function, by seniority and by top locations, the latest written read if one exists, and a plainly stated last checked timestamp. I can sort by open roles, by biggest move, or by staleness, and filter to a function or a location across the whole board. Refresh runs per company, and there is a refresh all button that tells me up front how many companies it is about to check.

Refreshing a company pulls its live postings with JSearch Search Jobs, scoped to that employer. JSearch takes the location inline in the query rather than as a separate field, so build the query from the company name and the watchlist row's region, for example jobs at Acme in Germany. Aggregators and staffing agencies repost roles, so keep only the postings whose employer name matches the watched company and drop the rest. Pull enough pages to produce a real count rather than the first handful of results using the page and number of pages parameters, and reach for Search Jobs (Cursor Pagination) when a company has more roles than page based paging can reach. JSearch is billed per request, so refresh what I ask for rather than quietly refreshing everything, and show the last known snapshot for the rest.

Classify every posting into a function (engineering, sales, marketing, product, design, operations, finance, people, support and so on), a seniority level (junior, mid, senior, lead or staff, manager or director, VP and above) and a location bucket including remote, using keyword rules over the job title and location. Label these as inferred so nobody mistakes them for fields JSearch supplied, and let me correct the mapping from a settings screen when it gets a title wrong.

Every refresh writes a dated snapshot row per company back with Google Sheets Append Values into a Snapshots tab: timestamp, company, total open roles, counts per function, counts per seniority, top locations, remote count, and who ran the refresh. That tab is the only history this app has, so the trend line and the change since last check are both computed from it: compare the fresh numbers against the most recent earlier snapshot for that company and show the gap between the two dates. The first time a company is ever checked there is nothing to compare against, so say first check rather than reporting a change of plus everything.

Clicking a company opens its page. The top is the live posting list from that company's most recent Search Jobs pull: title, inferred function and seniority, location, posted date, publisher and a link out, searchable and filterable. Clicking an individual posting opens its full record with JSearch Get Job Details in a panel, showing the description, employment type, apply options and salary information when the posting carries it. Below the postings, chart total open roles over time from the stored snapshots and show how the function and seniority mix has shifted between the earliest and latest snapshot. Keep every past written read for that company on this page in date order.

Each company row has an Explain this move button that kicks off a background agent for that one company. The agent reads the company's current postings, reads every stored snapshot row for it with Get Values, and works out what actually changed: a function opening up that never appeared before, a push into a new metro, a seniority mix tilting toward leadership or toward volume junior hiring, or a sharp jump or drop in total roles. Let it call Get Job Details on a handful of the most telling new postings so the read is grounded in what the descriptions say and not the titles alone. The output is short: two or three sentences on what they appear to be building, then a few evidence bullets. It posts that brief to our recruiting channel with Slack Bot Send a Message, naming the company and the two dates it compared, and appends the brief to a Briefs tab with Append Values so the board can show the latest read on the row and the company page can keep the history. Show the row as working while the agent runs and update it in place when the brief lands.

This app has no schedule and I do not want the interface to imply otherwise. The history is only as good as the snapshots captured when people open the board, so state the last checked date and time on every row, make gaps visible on the trend line rather than smoothing over them, and show a company nobody has opened in weeks as stale rather than as no change. The empty state should explain the arrangement honestly: put your competitors in the sheet, refresh the board before your planning meeting, and the picture gets sharper every time somebody does. All shared state lives in the spreadsheet, so everyone on the team opens the same board and sees the same history.

## How to customize

- Edit the watchlist straight in the spreadsheet, since the board reads the company list fresh every time it loads
- Change how job titles map to functions and seniority levels so the breakdown matches how your team talks about roles
- Scope a company to a country or region when you only care about their hiring in your market
- Pick the Slack channel the briefs land in and tell the assistant what to focus on, for example new metros only

## FAQ

### Does this watch competitors in the background?

No. Nothing runs on a schedule. The board updates when someone opens it and refreshes, and every row shows the date and time that company was last checked so you always know how fresh the picture is.

### Where does the hiring history come from?

From your own snapshots. Each refresh writes a dated row per company into your spreadsheet, and both the trend line and the change since last check are calculated from those rows. The more often the team opens the board, the richer the history gets.

### How do I change which companies are tracked?

Edit the Google Sheet. The board reads the company list from the sheet on every load, so anyone on the team can add, remove or reorder companies without touching the app.

### What does the Explain this move button actually do?

It kicks off a background assistant for that one company. The assistant reads their current postings and your stored snapshots, writes a short plain English read on what they appear to be building, posts it to your recruiting channel and keeps it on the row for whoever opens the board next.

### Is this a replacement for a labor market intelligence subscription?

It covers the recurring job those tools get used for, which is watching a short list of competitors and explaining what their hiring says, built from live public job postings instead of a per seat contract.

Use this prompt in General Input: https://www.generalinput.com/prompts/competitor-hiring-radar-for-talent-acquisition-teams