Weekly shortlist of past Lever candidates for every open role
Every Monday, each live role gets a Slack shortlist of five strong candidates already sitting in your archive, with the reason and how far they got.
Every Monday at 8am, go through every live job posting in Lever and rebuild a shortlist of strong past candidates who are already sitting in our database but were archived without being hired, so we stop paying to source people we have already talked to. This runs unattended on a cron schedule and pushes its results out to us; nobody opens a screen. It uses Lever, Slack, and Google Sheets.
Load the guardrails first, before touching any candidate. Call Lever List Archive Reasons and build the set of reasons that disqualify someone from being resurfaced. Note that in Lever, Hired is itself an archive reason, so people we hired sit inside the archived list and have to be excluded explicitly. Alongside Hired, rule out anything meaning do not hire, withdrew, offer declined, failed reference, or asked not to be contacted. Keep that excluded list configurable rather than hardcoded, seeded from the reasons the account actually has. Then read the rediscovery log in Google Sheets with Get Values. It holds one row per past suggestion with the candidate, the posting, and the date. Anyone suggested in the last 90 days is off limits for this run.
Get the roles with Lever List Postings, filtered to published, live postings. For each posting keep the title, team, location, commitment, and the requirements written in the posting content, since that text is what you judge fit against.
Build the candidate pool with Lever List Opportunities, with the archived filter set to true and a time window covering the last 24 months. Page with the cursor: pass the next value as the offset parameter on the following request and keep going until hasNext is false. Push filters down to the API wherever it supports them instead of pulling everything and filtering in memory. Expand contact, applications, and stageChanges so each record arrives with the person's name, email, the postings they applied to, and their stage history.
For each plausible candidate, pull the evidence before judging anyone. Use Lever List Applications for an Opportunity for what they originally applied to, Lever List Feedback on an Opportunity for what the interview panel actually wrote and scored, and Lever List Notes on an Opportunity for recruiter context. Judge genuine fit against the posting requirements from that evidence. This is the entire point of the workflow, so do not keyword match on job titles or resume text. Weight people who reached onsite or offer above people who dropped at phone screen, and read the furthest stage they ever reached from their stage history rather than their current stage, since an archived candidate simply sits in whatever stage they were in at the moment they were archived. Lever List Stages gives you the account's pipeline order to rank stages against.
Post one Slack message per posting to the recruiting channel with Send a Message. Each message names the role and lists at most five rediscovered candidates, each with a one line reason grounded in something specific, such as a requirement they clearly meet or something the panel said about them, plus the furthest stage they previously reached. Keep the shortlist short and high confidence: a recruiter should be able to action all five before lunch. If a posting has no genuinely good match, say so plainly in the message instead of padding the list out to five. Fewer names, or none at all, is the correct output when that is the truth.
For every candidate you suggest, write the reasoning back where recruiters will find it. Use Lever Create Note on an Opportunity to put the same reason on their profile, naming the new posting and the date, so whoever opens that profile understands why they resurfaced. Use Lever Update Opportunity Tags to add a rediscovery tag so recruiters can filter on it inside Lever. Then append one row per suggestion to the tracker with Google Sheets Append Values, recording the candidate, the posting, the furthest stage they reached, the reason, and the date. That tracker is the same sheet you read at the start of the run, so writing these rows is what mutes these people for the next 90 days. Write the rows even when a recruiter never acts on the suggestion.
A few Lever specifics to get right. Every response wraps its payload in a data field, so read from there rather than assuming the resource sits at the top level. Timestamps are Unix milliseconds rather than ISO strings, and they drive both the 24 month lookback and the 90 day mute, so convert carefully in both directions. The current model is the Opportunity, one per candidate per posting, not the legacy Candidate. Confidential postings and opportunities are excluded unless the credential holds confidential access and the request opts in, which is the right default here. Lever rate limits to roughly 10 requests per second and this sweep touches a lot of records, so page in order, batch the detail fetches, stay under that ceiling, and back off on a 429.
What does this prompt do?
- Every Monday morning it goes through each of your live job postings and searches your own archive of past candidates from the last two years, so you stop paying to source people you already talked to.
- Reads each person's applications, interview feedback, and recruiter notes to judge real fit against the new role, giving extra weight to anyone who reached onsite or offer stage before.
- Posts one Slack message per role with at most five candidates, each with a one line reason and the furthest stage they previously reached.
- Writes the same reasoning onto each candidate's profile in Lever, tags them so recruiters can filter on it, and logs every suggestion in your tracker so nobody gets resurfaced twice.
What do I need to use this?
- A Lever account with access to your job postings, candidates, interview feedback, notes, and tags
- A Slack workspace with a recruiting channel where the shortlists should land
- A Google Sheet to act as the rediscovery log and tracker
- A view on which archive reasons in your account mean do not contact, such as someone who withdrew or declined an offer
How can I customize it?
- Change the day and time it runs, and which Slack channel each shortlist gets posted to
- Adjust how far back it looks, the default is the last two years, and the quiet period before someone can be suggested again
- Edit which archive reasons rule a person out, and how many candidates a single shortlist can hold
FAQs
Will it suggest people we already turned down for good reason?
How does it avoid pestering the same people every week?
What if none of our past candidates fit a role?
Is this just keyword matching on old resumes?
Do recruiters have to leave Slack to act on it?
Related templates
Every weekday at 10am, an AI voice agent phones your most overdue Xero accounts, logs what each customer promised, and reports back to finance in Slack.
See every Google Maps listing you manage on one screen, ranked worst first, with an audit button that writes the fix list for you.
Your team picks a template, finds the customer, checks they are safe to email, then sends it, with every send logged where the whole team can see it.
Every logo, photo, video cut and ad export in one searchable grid, with previews, campaign tags and rights expiry dates at a glance.
Twice a day we spot the people clicking your pricing and demo pages, create a follow-up task for their owner, and post a ranked recap to Slack.
One board showing every dashboard and Look with its folder, owner and favorite count, so you can find dead content and retire it safely.
Stop paying to source people you already interviewed.
Every Monday, every open role gets a short list of strong past candidates from your own database, with the reasoning already written down for the recruiter.