Competitor hiring radar for talent acquisition teams

By General Input

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.

Integrations

  • JSearch
  • Google Sheets
  • Slack Bot

Type

App

Categories

  • HR & People
  • Operations

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.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet support send one-off Loops emails without an engineerA brand asset library your marketing team actually searchesTurn Mailjet email clicks into ranked HubSpot follow-upsClean out the Looker dashboards and Looks nobody opensStop cold emails to anyone with a live deal in PipedriveLiveKit live operations console for room moderationWake up dormant Keap leads with a researched reasoniMessage campaign console with pre-flight checks and delivery board