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.
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.
What does this prompt do?
- 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 do I need to use this?
- 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
How can I customize it?
- 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
FAQs
Do I need any technical setup to add a competitor?
How often does the board refresh?
Where does the history live?
What counts as an expansion signal?
Can I narrow the board down to the competitors I actually care about?
What happens if a scrape fails or a careers page changes?
Related templates
Stop buying stale lists. Reps run a saved search, work the results like an inbox, and only the accounts they approve ever reach your CRM.
See how your brand's news coverage and sentiment stack up against four competitors, then let an assistant write the weekly report for you.
One screen showing every social post waiting on approval, sorted by deadline, so reviewers can approve or reject without leaving the page.
Every Monday, find the past champions and closed-won contacts who changed jobs, update Attio, and get the moves worth chasing in Slack.
Staff submit what happened, your social manager edits the copy, picks the accounts and puts it on the calendar without a single spreadsheet.
Drag creators through Sourced to Wrapped on a board grouped by campaign, with audience stats on every card and a one-click brief for each creator.
Stop rebuilding the competitor picture before every call.
Open one board that already knows who is hiring, where they are hiring, and what changed since the last time you looked.