n8n Recruiter Digest: 40 CVs, 19 Cents, 3x a Day

A services company posts one role. Seventy-two hours later, careers@ has 40 unread PDFs and the founder is doing sales, invoicing, delivery, and now inbox triage. The ATS vendors quote $24–$60 per seat per month to fix this. For most small teams that's a platform tax on a problem a Gmail trigger and a decent prompt already solves.
Here's the exact stack I ship for clients in this spot, node by node, prompt included, with real cost numbers at the bottom.
The actual job to be done (and what an ATS doesn't do)
Three things need to happen when a role is open: every new application gets read and scored the moment it lands, the founder gets a ranked digest a few times a day so they can decide who to call, and rejections and interview invites get drafted for one-click approval. That's the whole loop. Notice what isn't in it: a dashboard to log into, a new seat to buy, a Kanban board to maintain.
Most ATS products organize applicants. They don't score them. You still open every PDF. The pitch of "we automate hiring" quietly means "we give you a nicer inbox." For a company hiring 20+ people a year, that structure earns its price. For a 3-person team hiring one role every quarter, you're paying to move email into a database.
The system I'll walk through does the part that actually saves time: read, score, rank, draft. It replaces triage. It doesn't replace interviewing, references, or the offer stage — more on that at the end.
The n8n canvas, node by node
n8n is a visual automation tool: boxes connected by lines, each box does one job. If you've never touched it, the free self-hosted version runs on a $5 VPS or a home server. The canvas for this workflow has six nodes.
- Node 1 — Gmail trigger. Watches careers@ and fires every time a new email lands with an attachment. Filter to
has:attachmentand labelApplicationsso you don't fire on cold sales. - Node 2 — Extract PDF text. n8n has a built-in Extract From File node. No external OCR service, no per-page fee. Handles most text-based PDFs cleanly.
- Node 3 — HTTP call to Claude. The scoring step. Prompt below.
- Node 4 — Append to Google Sheet. One row per applicant: timestamp, name, four scores, rationale, recommended action, link back to the original email.
- Node 5 — Scheduled digest. Cron three times a day (08:00, 13:00, 18:00). Pulls fresh rows, formats a ranked Telegram message.
- Node 6 — Draft reply generator. For rows marked
rejectorshortlist, drafts a Gmail reply as a draft (not sent). Founder taps approve.
The whole build for a client took about four hours from empty canvas to production. Roughly three of those hours were spent iterating on the prompt until the JSON came back clean 100% of the time. The nodes themselves are trivial; the prompt is where the engineering lives.
The Claude prompt (and the guardrail most people skip)
The prompt gets two things injected at runtime: the job brief (stored once in a Google Doc, pulled in by node 3a) and the extracted CV text from node 2. Claude is told to score on exactly four criteria and return strict JSON — no prose, no hedging, no "let me know if you'd like me to expand."
You are screening a candidate for the role below.
JOB BRIEF:
{{ $json.job_brief }}
CANDIDATE CV TEXT:
{{ $json.cv_text }}
GUARDRAIL: If the CV text is under 200 words, do NOT score.
Return exactly:
{"flag": "insufficient_text", "action": "human_review"}
Otherwise score on these four criteria, each 0-10:
- relevant_experience: match to the role requirements
- evidence_of_shipping: concrete outcomes, not adjectives
- communication_quality: clarity of the cover email
- location_fit: timezone / work-authorization alignment
Return ONLY this JSON, no other text:
{
"relevant_experience": <int>,
"evidence_of_shipping": <int>,
"communication_quality": <int>,
"location_fit": <int>,
"rationale": "<one sentence, max 25 words>",
"action": "shortlist" | "maybe" | "reject"
}
The under-200-words guardrail is the one people forget and it matters more than the scoring rubric. A 40-word "CV" is either a scanned image the PDF parser failed on, or it's spam. Either way, don't let the model guess. Route it to a human-review lane and move on. Anthropic's own guidance on structured outputs is worth reading if you want the JSON reliability to hold past a few hundred runs — the short version is: be explicit, show the exact shape, and refuse partial answers.
One more thing on the JSON: parse it in a Function node right after the HTTP call and wrap it in a try/catch. When Claude occasionally returns markdown fences around the JSON (it happens maybe 1 in 300 calls), strip them before parsing. If parsing fails twice on the same input, flag for human review. Don't retry forever.
The Telegram digest, three times a day
The scheduler node fires at 08:00, 13:00, and 18:00 local time. It queries the Google Sheet for rows added since the last run, sorts by total score descending, and formats a Markdown message like this:
📬 Applicant digest — 13:00
New since 08:00: 14
🟢 Shortlist (3)
1. Priya Ramanathan — 34/40
6yr backend, shipped 2 SaaS exits, EST
2. Marcus Bell — 31/40
Full-stack, strong GitHub, PST
3. Ana Kovač — 29/40
3yr React, remote-first, CET
🟡 Maybe: 6
🔴 Auto-reject: 4
⚠️ Human review: 1
Tap a name to open the original email.
The links resolve to the original Gmail message via the message ID stored in the sheet. Founder reads this while walking the dog, taps who they want to call, either books a slot or fires the draft reply. No dashboard. No new tab. The founder never logs into anything they weren't going to open anyway.
The Google Sheet doubles as candidate memory. If someone applies to two different roles you'll see it. If a role reopens in six months you can re-rank the old batch instead of re-screening from scratch. That's the part every ATS charges $40/month for and it's a spreadsheet.
The cost math (and why the vendor pitch falls apart)
Here's the arithmetic that got quoted in the title. A typical batch is 40 CVs. Each CV plus the injected job brief runs about 2,000 input tokens and 300 output tokens. Three batches a day.
| Item | Number |
|---|---|
| CVs per batch | 40 |
| Batches per day | 3 |
| Input tokens per CV | 2,000 |
| Output tokens per CV | 300 |
| Total input tokens/day | 240,000 |
| Total output tokens/day | 36,000 |
| Approx daily cost (Claude Sonnet class) | ~$0.19 |
| Approx monthly cost | ~$6 |
Compare that to a mid-tier ATS seat at $40/month per user. The ATS also doesn't score — it just organizes. You'd still open every PDF. So the honest comparison is: $6/month with scoring, ranking, digest, and drafted replies, versus $40/month with a nicer inbox.
Two caveats on the cost. First, pricing shifts — check Anthropic's current pricing page before you quote a number to a client. Second, this assumes text-based PDFs. If half your applicants send scanned images you'll want an OCR step (Tesseract is free, cloud OCR runs ~$1.50 per 1,000 pages) and the math changes a little, not a lot.
Build time for a client from zero: about four hours in n8n. Ongoing maintenance: I look at the sheet once a week for 10 minutes to check the score distribution hasn't drifted. That's it.
What this system will not do
I'll give you the honest limitation because I promised I would. This replaces triage. It does not replace interviewing, reference checks, or the offer stage. The offer stage is where hiring actually drags — start date negotiation, comp, equity, notice periods, counter-offers. No vendor automates that well, including the $60/seat ones, because it's a negotiation, not a workflow.
What this system buys you is the two-and-a-half hours a day of inbox time back so you can put them into better first calls. Not skip them. If you skip the human layer you'll hire badly, and no automation fixes a bad hire — it just makes bad hires faster.
Two other things to watch:
- Bias in the rubric. "Evidence of shipping" favors candidates with public GitHub or a portfolio. Great for engineers, unfair for people from companies where the work isn't public. Adjust the rubric per role.
- Cover-email quality scoring. Non-native English speakers can score lower on "communication quality" for reasons unrelated to the job. If the role isn't customer-facing, drop that criterion or weight it low.
Log every score to the sheet and audit monthly. If your shortlist is 90% one demographic, the rubric is wrong, not the applicants.
Where bizflowai.io fits in
Most of what I build for clients in the small-team hiring space looks exactly like this canvas — a Gmail trigger, an LLM scoring step with a strict JSON contract, a spreadsheet as memory, a Telegram or Slack digest, and a draft-reply step the founder approves. bizflowai.io is where I package these workflows for teams that want the outcome without spending the four hours in n8n themselves. Same stack, same cost profile, wired to your inbox and your job briefs.
Want more like this?
I publish practical AI automation, GenAI engineering, and faceless content workflows on YouTube every week.
Subscribe to bizflowai.io on YouTube — never miss a new tutorial.
Planning an AI automation project or need a second opinion on your architecture?
Connect with me on LinkedIn — Lazar Milicevic, GenAI Engineer & bizflowai.io Founder.
Visit bizflowai.io for our services, case studies, and AI consulting.
Frequently asked questions
What is an n8n CV screening workflow?
It's a visual automation that watches a careers@ inbox, extracts text from attached PDF CVs, sends them to Claude with a job brief for scoring, logs results to a Google Sheet, and pushes a ranked digest to Telegram three times a day. It replaces the manual inbox triage a founder does when 40 applications land in 72 hours, without requiring an ATS subscription.
How do I automatically score job applications with Claude?
Send Claude the extracted CV text plus a stored job brief, and instruct it to return strict JSON with four scores (0-10) covering relevant experience, evidence of shipping, communication quality, and location fit, plus a one-sentence rationale and a recommended action of shortlist, maybe, or reject. Add a guardrail that refuses to score any CV under 200 words and routes it to human review instead.
When should I use an ATS versus a custom n8n hiring automation?
A mid-tier ATS at $24-60 per seat per month makes sense if you're hiring 20+ people a year. For smaller companies hiring occasionally, a custom n8n workflow costs about $6 per month in Claude API fees and actually scores candidates, whereas an ATS mostly organizes applications and still requires you to read every CV yourself.
Why does forcing strict JSON output matter for AI candidate scoring?
Strict JSON output makes the model's response machine-readable so downstream nodes can append scores to a Google Sheet, format Telegram digests, and route candidates automatically. Without it, Claude may add prose, hedging, or offers to expand, which breaks parsing. Constraining output to four numeric scores, a rationale, and one of three action values (shortlist, maybe, reject) keeps the pipeline reliable.
How much does an AI-powered CV screening system cost to run?
For a typical batch of 40 CVs at roughly 2,000 input tokens and 300 output tokens each, run three times daily, the cost lands around 19 cents per day at current Claude pricing, or about $6 per month. That compares to roughly $40 per month for a single mid-tier ATS seat, which doesn't actually score candidates.