184 Applicants for $1.47: The 4-Workflow Hiring Stack

A client of mine was 20 minutes from signing a $312/month annual contract for an AI hiring platform. I told him to wait a weekend. What we shipped instead was four n8n workflows and a Claude API key that ran his last hiring sprint end-to-end for $1.47.
If you're a small agency owner staring at another seat-based SaaS quote just to hire two people, this is the node graph the vendor demos never show you.
The $3,744 quote vs. the $1.47 sprint
The client runs a six-person agency and needed two hires: one senior developer, one junior ops. The hiring platform pitched four seats at $78 each — $312/month, annual commitment, plus onboarding. That's $3,744 for the year to solve three real problems: sourcing eats a day, screening eats another, scheduling eats a third in 15-minute chunks over two weeks.
The pain is real. The "three agents" framing is marketing. Here's what the actual sprint cost once we rebuilt it:
| Line item | SaaS quote | n8n stack |
|---|---|---|
| Software | $312/mo ($3,744/yr) | $0 (self-hosted) |
| Infrastructure | included | $5/mo VPS (already owned) |
| AI/API | included | $1.47 for the entire sprint |
| Onboarding | ~$500 one-time | 1 weekend |
| Data ownership | vendor | client's Airtable + VPS |
| Applicants processed | — | 184 |
| A-tier surfaced | — | 22 |
| Recruiter hours reclaimed | — | 9h 12m over 3 weeks |
Four workflows. n8n on a $5 VPS the client already had. Airtable and Cal.com free tiers. Claude API for the two spots where reasoning actually matters. That's the entire stack.
Workflow 1 — Sourcing (no AI, just plumbing)
Sourcing is not an intelligence problem. It's a schema problem. The goal is one thing: every candidate, from every channel, in one Airtable table with the same seven fields. No AI, no LLM tokens, no cleverness.
Three triggers feed one normalizer:
- IMAP node watches the shared hiring inbox where LinkedIn and Indeed forward applications
- Webhook the client's careers page hits when someone submits the form directly
- Cron scrape of two niche job boards on a 4-hour interval with rotating User-Agent headers
All three routes hit a Function node that outputs the same shape:
// Normalizer function — every source lands in the same schema
return items.map(item => ({
json: {
name: item.json.name || parseName(item.json.raw),
email: item.json.email || parseEmail(item.json.raw),
role: item.json.role || detectRole(item.json.subject),
resume_url: item.json.resume_url || item.json.attachment_url,
cover: item.json.cover_letter|| '',
source: item.json._source, // 'linkedin' | 'indeed' | 'careers' | 'board_x'
ts: new Date().toISOString(),
status: 'new'
}
}));
That record goes into an Airtable candidates table with status defaulted to new. That's the whole workflow. Six nodes. The vendor calls this an "AI sourcing agent" because "IMAP + webhook + cron" doesn't sell licenses.
What this replaces
- Manually forwarding LinkedIn emails into a spreadsheet
- Copy/pasting careers-page submissions
- Losing candidates who applied through a niche board nobody checked
Workflow 2 — Screening (where Claude earns its keep)
Screening is where an LLM actually pulls its weight. The trigger is an Airtable webhook that fires whenever a row lands with status = new. The workflow fetches the resume PDF, extracts text, and sends one structured prompt to Claude.
The prompt is the whole game. Loose prompts hallucinate enthusiasm. Constrained prompts produce auditable output a hiring manager will actually trust:
You are screening a candidate for {{role_title}}.
JOB DESCRIPTION:
{{job_description}}
RUBRIC (weighted):
1. Relevant experience depth (30%)
2. Technical skill match (25%)
3. Communication quality in cover letter (15%)
4. Trajectory / growth signal (15%)
5. Culture / working-style fit (15%)
RESUME TEXT:
{{resume_text}}
Return ONLY valid JSON:
{
"score": <0-100>,
"tier": "A" | "B" | "C",
"reasoning": "<exactly 3 sentences, each citing
specific evidence from the resume>"
}
Rules:
- Do not invent experience not present in the resume.
- If evidence is missing for a rubric item, penalize.
- Reasoning must reference concrete resume lines, not vibes.
The "three sentences, each citing specific evidence" line is what makes this defensible. Without it, Claude writes enthusiastic paragraphs about candidates who barely qualify. With it, every A-tier gets three concrete sentences tied to lines the manager can verify in ten seconds.
Model choice: Claude Haiku for the first pass. At sprint volume — 184 resumes averaging ~800 tokens in, ~180 tokens out — the entire screening run cost well under a dollar. The remaining spend came from re-runs when we tightened the rubric mid-sprint.
The JSON returns, an Airtable Update node writes score, tier, reasoning. A Slack node posts every A-tier to a private #hiring-a-tier channel within minutes of the application landing. The manager opens Slack, reads three sentences, clicks through to the resume if the reasoning holds up.
Result on this sprint: 184 → 22. The manager reviewed 22 resumes instead of 184. That's the screening bottleneck, gone.
Workflow 3 — Scheduling (one click, no back-and-forth)
Scheduling feels like it should be hard. It isn't. When the manager clicks an "Approve for interview" button in the Airtable view, a webhook fires and the workflow does four things in sequence:
- Generates a Cal.com booking link scoped to the manager's real availability for the next 10 business days
- Drafts a warm personal email via Claude — candidate's name, the role, one specific detail from their resume, the booking link
- Sends the email through Gmail using the manager's own thread
- Updates the Airtable row to
status = invited
The personalization prompt is short:
Draft a 4-sentence interview invite from {{manager_name}} to {{candidate_name}}
for the {{role}} role.
Reference this specific detail from their resume (naturally, not
awkwardly): {{resume_highlight}}
Include this booking link: {{cal_link}}
Tone: warm, direct, no corporate filler. No "we were impressed by
your application" openers.
A second workflow watches the Gmail thread. Two branches:
- If the candidate replies with a question — Claude drafts a response using the job description and the original screening notes as context. The draft lands in the manager's Gmail as a reply-draft. One-click approval.
- If they book on Cal.com — the calendar event auto-creates with the resume link, the screening JSON, and the manager's prep notes pre-loaded into the description.
Zero time-zone confusion. Zero "does Tuesday at 2 work?" chains. The manager's entire job is: one click to approve, one click to send follow-ups when they exist.
Workflow 4 — The silver-medalist nurture nobody builds
This is the workflow that separates a hiring stack from a hiring afterthought. Every B-tier and every rejected candidate goes into a 14-day sequence:
- Day 1 — genuine rejection with specific feedback drafted by Claude from the screening reasoning field. Not "we've decided to move forward with other candidates." Actual sentences that reference why they didn't fit this role.
- Day 7 — check-in with two relevant open roles from the client's network (a small Airtable of partner-agency openings the client curates)
- Day 14 — invitation to a small talent pool for future openings, opt-in
The client hired their junior ops person from this list six weeks after the sprint ended. Zero additional sourcing cost. Zero platform fees. One candidate who'd been rejected for the developer role, was B-tier for ops on second look, and accepted at week six from the day-14 email.
Most hiring platforms treat rejected candidates as dead pipeline. They're not. They're the pipeline you already paid to attract, and 94% of them never hear back from anyone. Fixing that is a workflow, not a feature.
The numbers, audited
- Claude API spend across all four workflows, full sprint: $1.47
- n8n: self-hosted on a $5/mo VPS the client already ran
- Airtable, Cal.com, Gmail: free tiers, no upgrades
- Recruiter time reclaimed (manager's own calendar audit): 9h 12m over 3 weeks
- Applicants processed end-to-end: 184
- A-tier surfaced for human review: 22
- Hires closed from sprint: 1 senior developer (week 3), 1 junior ops (week 9, from nurture list)
- SaaS quote avoided: $3,744/year annual commitment
The stack does the three jobs the vendor promised, keeps every resume and every message in systems the client owns, and costs less than one recruiter's weekly coffee budget. When the client wants to change the rubric, they edit the prompt. When they want to add a source, they add a trigger. No support ticket, no seat upgrade.
Where bizflowai.io fits
This is the kind of stack we build for clients at bizflowai.io every week — take a workflow they were about to buy as SaaS, ship it as owned automation in a weekend, and hand back the API key. Hiring sprints, lead qualification, invoice chasing, support triage: the pattern is the same. Find the two nodes where an LLM genuinely earns its cost, plumb everything else with cheap, boring infrastructure the client already pays for.
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 the n8n hiring automation stack that replaces platforms like Gem or Ashby?
It's a set of four n8n workflows paired with a Claude API key that handles sourcing, screening, scheduling, and silver-medalist nurture. Sourcing normalizes candidates from email, webhooks, and job board scrapes into Airtable. Screening uses Claude to score resumes against a rubric. Scheduling sends Cal.com links via Gmail. It replaces vendor tools charging around $312/month for four seats.
How do I use Claude to screen job applicants automatically?
Trigger a workflow on new Airtable candidate rows, extract resume text with a PDF parser, then send it to Claude with a structured prompt containing the job description, a weighted five-criteria rubric, and the resume. Require Claude to return JSON with a 0-100 score, an A/B/C tier, and three sentences of reasoning tied to specific resume evidence. Write results back to Airtable and Slack A-tier candidates.
Why does requiring evidence-based reasoning matter for AI resume screening?
Without the constraint to tie reasoning to specific resume evidence, Claude hallucinates enthusiasm and produces unreliable scores. Forcing three sentences of evidence-based reasoning creates auditable output that hiring managers can trust and verify. In one sprint, this approach filtered 184 applicants down to 22 A-tier candidates the manager actually reviewed, eliminating the screening bottleneck entirely.
When should I build hiring automation in n8n versus buying a hiring platform?
Build in n8n when your hiring needs are sourcing, screening, and scheduling for a small team, since these are plumbing and prompt problems, not complex intelligence problems. Buy a platform if you need enterprise compliance, ATS integrations, or lack technical capacity. A six-person agency hiring two roles can replace a $312/month vendor with four n8n workflows and a Claude API key.
How does automated interview scheduling work with Cal.com and Claude?
When a hiring manager approves an A-tier candidate in Airtable, a webhook fires that generates a Cal.com booking link scoped to real availability, uses Claude to draft a personalized email referencing the candidate's resume, and sends it via Gmail. A second workflow monitors replies: if the candidate asks a question, Claude drafts a response for one-click approval; if they book, the calendar event auto-populates with resume and screening notes.