# 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.

- Workflow type: app
- Services: Heyy, Greenhouse
- Categories: HR & People
- Published: 2026-08-24

## What it does

- 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 you'll need

- 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

## Prompt

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.

## How to customize

- 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

## FAQ

### Does the app send the WhatsApp message itself?

It queues the follow up in Heyy by adding the candidate with the right tag, which is what starts your pre approved WhatsApp message. Heyy still owns the sending, so nothing goes out that your team has not already approved.

### What happens to candidates who have no mobile number on file?

They stay in the table with a clear marker next to their name so you can still see them, but they cannot be selected for a WhatsApp nudge. Those people get chased by email instead.

### Can the same candidate get chased twice by accident?

No. Every nudge is recorded against the candidate, and anyone messaged inside your cooldown window is locked out until it passes, even if two recruiters open the board at the same time.

### Does anything get written back to Greenhouse?

Yes. Every nudge files a note on the candidate's profile recording the role, the stage and what you asked them for, so recruiters see the full chase history in the ATS rather than in a separate tool.

### Do I need a different message for every stage?

It helps, but it is not required. You can point every stage at one general follow up, or give each stage its own so the wording matches what the candidate is actually waiting on.

### Is this useful for high volume or hourly hiring specifically?

That is exactly the case it is built for. When you are filling dozens of shift roles at once, candidates ignore email, and a board that surfaces the oldest silences first lets a recruiter clear an afternoon of chasing in a single sitting.

Use this prompt in General Input: https://www.generalinput.com/prompts/candidate-chase-desk-that-restarts-quiet-applicants-on-whatsapp