Candidate chase desk that restarts quiet applicants on WhatsApp
See every candidate who has gone silent on your open roles, how long they have been quiet, and restart them on WhatsApp in one click.
Build me a candidate chase desk: an internal app my recruiters open every afternoon to restart the applications that have gone quiet. We do high volume hourly hiring, email gets ignored, so the outreach goes out on WhatsApp through Heyy while Greenhouse stays the system of record. Greenhouse supplies everything browsable in the app; Heyy is where outreach gets queued.
Home is a role board. Use Greenhouse "List Jobs" filtered to open jobs, and Greenhouse "List Job Stages" for each one so I can see the pipeline shape. Every role is a card showing the title, department and office, the stage list, and the headline number: how many stalled candidates it has right now. Compute that count from Greenhouse "List Applications" scoped to the job and status active, counting anyone whose last activity is older than the stall threshold. Sort the board by stalled count descending so managers can see which pipelines are rotting. Clicking a role opens its chase table.
The role view is a dense table of every active application on that role whose last activity predates the threshold, sorted oldest silence first. Pull the applications with Greenhouse "List Applications" and enrich each row with Greenhouse "Get Candidate" to fetch the person's mobile number. Columns: candidate name, the stage they are stuck in, days silent, last activity date, mobile number, which WhatsApp message will render for them, which number it sends from, and their nudge state (never chased, chased N days ago, or in cooldown). Rows for candidates with no mobile number on file stay visible with a clear "no mobile" marker, but their checkbox and Nudge button are disabled, so someone chases those by email instead. Show the stage breakdown above the table so a recruiter can see the stall is concentrated in, say, scheduling.
Each row carries a "Nudge on WhatsApp" button. Pressing it queues the outreach in Heyy with "Create Contact": pass the candidate's name and mobile number, attach the label mapped to the stage they are stuck in (that label is what fires the matching pre approved template automation on Heyy's side), and write the role title, the stage and the next step we want from them into custom contact attributes. The same action immediately files the nudge on the candidate's Greenhouse profile with "Add Candidate Note", recording the role, stage, the message that was queued and the date, so the ATS keeps the full chase history. Support multi select with a checkbox column and a "Nudge selected" action that runs the same pair of calls per candidate and reports per row success or failure rather than failing the whole batch.
Show which message and which number each row will use. Load Heyy "List Message Templates" and Heyy "List Channels" once per session and render the resolved template name and the sending WhatsApp number on the row, so a recruiter can see what is about to go out before they press anything. If a stage has no mapped template, mark the row as not ready and disable its Nudge button rather than queueing something unmapped.
There is a one time setup screen, run by an admin, that defines the plumbing. It creates the custom fields in Heyy with "Create Contact Attribute" (role title, stage, next step, days silent, source board) and creates the stage labels with Heyy "Create Label", then stores the returned attribute external ids and label ids in app persistence so later nudges reuse them instead of recreating them. The same screen holds the mappings and the rules: stage to label, stage to message template, the default sending channel, the stall threshold in days, and the cooldown window in days. Make setup idempotent and show what is already provisioned so nobody duplicates attributes or labels by opening the screen twice.
Enforce the cooldown in the app. Persist every nudge (candidate id, application id, role, stage, template, timestamp, who pressed it), and before queueing anything check that candidate against the cooldown window. Anyone inside it renders with a disabled button and a "chased 2 days ago" note, and a concurrent press from a second recruiter is rejected rather than sent twice. Heyy has no send message operation and no way to read contacts back, so the app's own nudge log is the only cooldown source of truth, and everything is queued by creating the contact with the right label and attributes.
The role header carries a "Build the chase pack" button that kicks off a background agent for that role. The agent reads every stalled application on the role with Greenhouse "List Applications", pulls each person with Greenhouse "Get Candidate", and reads the pipeline with Greenhouse "List Job Stages". It groups the candidates by why they stalled: never screened, waiting on scheduling, and waiting on us. For each person it drafts the message variables (first name, role title, stage, the specific next step being asked for) and picks the stage template. It writes a short recruiter summary of the whole role, which the app renders as a reviewable pack grouped by stall reason, and files a per candidate note back with Greenhouse "Add Candidate Note" so the reasoning lives in the ATS too. The recruiter then approves the pack as a batch, and approving queues the nudges through the same Heyy "Create Contact" path and cooldown rules as the per row button, skipping anyone with no mobile or inside cooldown and saying so.
Show the chase pack run state in the app (running, done, failed) with the last generated pack kept and re-openable, so a recruiter who closes the tab does not lose the work. Persist packs, drafts and approvals alongside the nudge log.
Design notes: this is a working desk, not a report, so favour a dense readable table with the days silent column visually weighted, and make the oldest silences impossible to miss. Empty state when a role has no stalled candidates should read as a win. Nothing in the interface should expose Heyy's internal machinery to recruiters; a recruiter sees "message candidates on WhatsApp", the stage message name and the sending number, not labels, attributes or template ids.
What does this prompt do?
- Lists your open roles with a live count of how many candidates have gone quiet in each, so managers can see at a glance which pipelines are rotting
- Pick a role and get a table of every active candidate past your silence threshold, oldest first, showing the stage they are stuck in, their mobile number and how many days they have been silent
- One button queues a WhatsApp follow up for that candidate and files a note on their profile in Greenhouse, so your ATS stays the record of truth
- A Build the chase pack button sends a background agent through the whole role, grouping candidates by why they stalled and drafting each message, so a recruiter approves a batch instead of clicking one by one
What do I need to use this?
- A Greenhouse account and an API key that can read jobs, applications and candidates, and add notes to candidate profiles
- A Heyy workspace with WhatsApp connected and your follow up messages already approved
- Candidate mobile numbers stored in Greenhouse, since people without a number stay visible but cannot be messaged
- A decision on how many days of silence counts as stalled, and how long to wait before chasing the same person again
How can I customize it?
- Change the silence threshold so a candidate counts as stalled after three days on a same week hourly role, or after two weeks on a slower one
- Set the cooldown window so nobody gets chased twice inside a period you choose
- Give each pipeline stage its own follow up message, so someone waiting on a first screen hears something different from someone waiting on an interview slot
FAQs
Does the app send the WhatsApp message itself?
What happens to candidates who have no mobile number on file?
Can the same candidate get chased twice by accident?
Does anything get written back to Greenhouse?
Do I need a different message for every stage?
Is this useful for high volume or hourly hiring specifically?
Related templates
See every open role's posted pay band next to what the market is actually advertising, with the roles priced furthest below market floating to the top.
See who has really said yes to WhatsApp, build a segment from only those people, and push it to your broadcast tool with a record of who got what.
A morning queue that ranks pending and unpaid orders by value, shows each buyer's return history, and queues WhatsApp confirmations before anything ships.
See every interviewer's scores next to what the candidate actually said, spot where the panel disagrees, and catch ratings nothing backs up.
See every take-home waiting on a verdict, read the code in the app, and have it built and tested in a throwaway machine instead of on your laptop.
See every incoming hire, which onboarding documents they have actually signed, and who starts in days with paperwork still outstanding.
Stop letting good applicants go quiet.
Open one board, see who has stalled on every open role, and restart them on WhatsApp before they take another job.