Project 06

Candidate Screening
& Interview Scheduler

Resumes come in continuously, but screening gets batched into once-a-week bursts — which means strong candidates sit unacknowledged for days. This reads, scores, and responds to every application within a day.

Platform Trigger.dev
Built with Claude Sonnet + Google Sheets
Response time < 24 hours
<24h Time to first response, vs. weekly batch
0 Manual triage effort
0 Drafting time for invites & rejections

The Problem

Strong candidates sit for days

Small businesses hiring for open roles get resumes in continuously, but a busy owner or hiring manager rarely has time to review every application the day it arrives. Screening gets batched up and done in bursts once a week — and once noticed, someone still has to read the resume, judge it against the role, write an invite or a rejection, and chase the pipeline forward. That follow-through is where candidates quietly go cold.

How It Works

A daily admission gate, then per-candidate follow-through

Built and running in Trigger.dev. I've also mapped this architecture onto n8n — the node-by-node equivalent, and the spots where n8n needs explicit wiring that Trigger.dev handles for free — as a design exercise, not a second build.

Part 1 — Candidate Screening Scan (daily, 8am)

01

Scan for ready candidates

Pulls every row from the Candidates tab: candidate ID, name, role applied, resume text, recruiter notes.

02

Filter to what's actually ready

Keeps only rows that are both unscreened and have resume text, skipping placeholder rows added before the resume gets pasted in.

03

Lock and hand off

Marks each match "Queued" — so tomorrow's scan doesn't re-queue a candidate still being screened today — and kicks off an independent screening run per candidate.

Part 2 — Candidate Screening Flow (per candidate)

04

Score the fit

Claude reads the resume against the role and returns a 1–10 fit score, a verdict (StrongMatch / PossibleMatch / NotAMatch), and a short rationale, in an enforced structured shape.

05

Draft the response

NotAMatch gets a short, respectful rejection. StrongMatch and PossibleMatch get a warm interview invite referencing 2–3 slots from a fixed weekly availability list.

06

Wait 2 days, then check

If the owner never marked the row sent or rejected, the flow escalates with a specific reason instead of leaving it hanging.

07

Wait 5 more days for a slot pick

"InterviewScheduled" ends the flow successfully. Anything else escalates as "candidate never confirmed a slot."

The result: every new application gets looked at within 24 hours instead of waiting for a weekly batch review, with zero manual triage effort and no duplicate processing even if the scan overlaps a slow-finishing previous run. Every screened candidate gets a consistent, role-specific evaluation, no one silently falls through the cracks, and drafting time for invites and rejections drops to zero.

Tech Stack

Tools powering the workflow

Trigger.dev
Claude Sonnet
📊Google Sheets
← All projects