# Competitor hiring board for sales and product teams

> See every competitor's open roles on one board, with the jobs that appeared or disappeared since your last check and expansion signals flagged for you.

- Workflow type: app
- Services: Apify, Google Sheets, Slack Bot
- Categories: Sales, Product
- Published: 2026-08-14

## What it does

- Keeps a watchlist of competitors, each with the careers page or job board search you want watched, and refreshes any of them on demand from the board
- Shows every competitor as a card with total open roles, a breakdown by department and location, and how many roles opened or closed since the last refresh
- Opens a full posting list per competitor with title, location, posted date and link, plus a side by side view of the new and closed roles
- Flags the moves that matter: a first hire in a new country, a brand new department, and senior or executive titles
- Saves every refresh to a Google Sheets tab so the hiring history is still there next week, and lets you push any posting or company card into Slack as a formatted note

## What you'll need

- An Apify account, with a job board scraper picked out for the competitors you want to watch
- The careers page or job board search link for each competitor you plan to track
- A Google account and a spreadsheet the board can use to store its refresh history
- A Slack workspace and a channel where the team should see shared signals

## Prompt

Build me a competitor hiring board that my sales and product teams open before planning sessions and before big calls. Job postings are the highest signal public information a competitor gives away, so I want a browsable board rather than another weekly email: I keep a watchlist of competitors, refresh them on demand, and see at a glance what each one is hiring for and what changed since the last time we looked.

The main screen is a board of competitor cards. Each card shows the competitor name, their tier badge, total open roles, a breakdown by department and by location, the count of roles that appeared and disappeared since the previous refresh, and when they were last refreshed. Cards carry signal badges when something notable is in the latest snapshot. I can filter the board by tier, sort by total roles or by most recently changed, and refresh a single competitor or all of them at once.

Managing the watchlist happens in the app. Adding a competitor asks for the company name, the careers page or job board search URL to scrape, the Apify Actor or saved task that should read it, and a tier. Tiers are simple labels I control (for example Tier 1 direct, Tier 2 adjacent, Tier 3 watch) and exist so the board can be filtered down to the handful I actually track. I can edit or remove a competitor and change a tier inline from the card.

Refreshing a competitor runs their scraper through Apify. The handler starts the run with Run Actor (Async), keeps the returned run ID, and polls Get Actor Run until the status is terminal. Only SUCCEEDED is trustworthy: on FAILED, ABORTED or TIMED-OUT, show the error on that competitor's card and keep the previous snapshot intact so a broken scrape never destroys the history or the diff. When the run succeeds, read the run's default dataset with Get Dataset Items and normalise every posting into title, department, location, country, posted date and link. For fast scrapers, also offer Run Actor Synchronously and Get Dataset Items as a one call path so a quick refresh does not need polling at all. When I am adding a competitor, let me pick from my saved Apify task configurations with List Actor Tasks instead of typing an Actor ID by hand. Remember that each Actor has its own input schema, so let me store the input JSON per competitor alongside the URL.

Clicking a competitor opens their detail page. The top half is the full posting list with title, department, location, posted date and a link out to the original posting, searchable and filterable by department and location. The bottom half is the diff view: the roles that are new since the previous refresh and the roles that have closed, side by side. Match postings across snapshots on title plus location, falling back to the posting link when it is stable, and show the date each role was first seen so I can tell a fresh opening from one that has been sitting there for months.

Every completed refresh is snapshotted to Google Sheets so the history survives across sessions and across users. Use Append Values to write one row per posting per refresh into a Postings tab (competitor, refresh timestamp, job title, department, location, country, posted date, link) and one summary row per refresh into a Refreshes tab (competitor, timestamp, total open roles, new count, closed count). Keep the watchlist itself in a Watchlist tab (competitor name, careers or job board URL, Actor or task ID, input JSON, tier, notes), also written with Append Values. When the app loads, rebuild the entire board by reading those tabs with Get Values, so the board is fully populated from history before anything is scraped again.

Bake in the interpretation that makes this worth opening. After each refresh, compare the new snapshot against everything in that competitor's history and flag expansion signals: the first posting ever in a country they have not hired in before, a department that has never appeared for them before, and senior or executive titles such as Head of, Director, VP, Chief or President. A sales hire in a new region often signals geographic expansion months in advance, so surface that prominently rather than burying it in a list. Show signals as badges on the competitor card and on the individual posting row, and give the detail page a short signals section at the top summarising what changed and why it might matter. If the scraper does not return a department field, derive one from the job title with simple keyword rules and label it as inferred.

From any competitor card or any individual posting, a Share signal button opens a short composer pre filled with a formatted note: the competitor, their tier, the headline numbers or the specific role, any signals attached, and links back to the postings. I can edit the text, pick a channel, and post it with Slack Bot Send a Message so the wider team sees the move without opening the board.

Nothing runs on a schedule. This is a surface people open, refresh, read and share from. Make the empty state useful by walking me through adding my first competitor, and show a clear in progress state on a card while its scrape is running so I know a refresh is under way rather than stalled.

## How to customize

- Rename the tiers to match how your team talks about competitors, for example direct rivals, adjacent players and long term watch
- Change what counts as a senior or executive title, or add your own signal rules such as a first posting in a specific region
- Point the history at a different spreadsheet, or add columns like salary range or employment type to the snapshot
- Pick which Slack channel the Share signal button posts into, and edit the wording of the note it drafts

## FAQ

### Do I need any technical setup to add a competitor?

No. You add a competitor by name, paste their careers page or job board search link, choose the scraper that should read it, and give them a tier. The board handles the rest.

### How often does the board refresh?

Whenever you ask it to. Nothing runs on a schedule, so you can refresh one competitor before a call or refresh the whole board before a planning session and see exactly what changed.

### Where does the history live?

In a Google Sheets file you own. Every refresh writes a snapshot of the postings plus a summary row, so the board can rebuild itself from that history and you can open the raw data any time.

### What counts as an expansion signal?

Three things by default: the first role a competitor has ever posted in a country, a department that has never appeared for them before, and senior or executive titles such as Head of, Director, VP or Chief. These show as badges on the card and on the posting.

### Can I narrow the board down to the competitors I actually care about?

Yes. Every competitor gets a tier, and the board filters to a single tier so you can keep a long watchlist without wading through it before every meeting.

### What happens if a scrape fails or a careers page changes?

The board shows the failure on that competitor's card and keeps the last good snapshot, so a broken scrape never wipes out your history or your diff.

Use this prompt in General Input: https://www.generalinput.com/prompts/competitor-hiring-board-for-sales-and-product-teams