Cold-Sourcing Bot: 40 Candidate Emails/Day for $0.60

Every hiring automation demo sells you a screening AI. If your inbound funnel is empty, screening is theater. The real bottleneck for a two-person team trying to hire is outbound sourcing — writing 40 personalized cold notes to passive candidates, which nobody wants to do manually.
I build these pipelines for clients every week. Here's the exact outbound sourcing bot I ship: 40 personalized candidate emails per day, ~8 minutes of compute, ~$0.60 in Claude API costs, running on infrastructure you already pay for.
The stack: Google Sheet, Gmail, n8n, Claude
No Lemlist. No Instantly. No Greenhouse seat. No ATS migration. The whole pipeline is four moving parts you can wire up in an afternoon:
- Google Sheet — the candidate queue (4 columns).
- Gmail on a real business domain — drafts + send.
- n8n (self-hosted or cloud) — the two workflows.
- Claude API (Sonnet-class model is plenty) — drafting.
That's it. Total recurring cost for a solo founder: whatever you already pay for Google Workspace (~$7/user/month) + pay-as-you-go Claude ($0.60/day at 40 drafts) + a $0 self-hosted n8n container on any $5 VPS. If you're already running n8n for other automations, marginal cost is basically the API.
Compare that to the "proper" outbound stack: Lemlist at $59/mo, an ATS seat at $100+/mo, LinkedIn Recruiter Lite at $170/mo. You'd be spending $300+/month before you've sent a single email — and none of those tools actually write the email for you.
The input sheet: four columns, one that matters
The sheet has four columns:
| Column | Purpose |
|---|---|
linkedin_url |
Source of truth for de-dup |
role_context |
One line: what you're hiring for and why this person fits |
raw_profile_text |
About section + last 2 job titles + one recent post/project |
status |
ready, drafted, sent, replied, do_not_contact |
raw_profile_text is the whole game. If you feed the model a name and a title, you get generic slop that reads like every recruiter spam anyone's ever deleted. Feed it three concrete details — a shipped project, a specific stack, a recent conference talk — and you get an email that reads like a human wrote it at 11pm.
This is also the only step that's genuinely manual. Budget 15 minutes a week to curate the sheet, or pay a VA $3/hour to do the profile scraping. That curation is the moat, not the AI.
The drafting workflow: n8n → Claude → Gmail draft
Every morning at 8am, n8n polls the sheet, grabs up to 40 rows marked ready, and passes each to Claude with a prompt shaped like this:
You are drafting a cold outbound email to a passive candidate.
ROLE CONTEXT:
{{role_context}}
CANDIDATE PROFILE (raw text):
{{raw_profile_text}}
RULES:
- 2 paragraphs, max 90 words total.
- Reference ONE specific thing from the profile in sentence 1.
- Connect it to the role in sentence 2.
- Return JSON: {"subject": "...", "body": "..."}
FORBIDDEN OPENERS (do not use any variation):
- "I came across your profile"
- "I hope this email finds you well"
- "I was impressed by your background"
If you cannot find a specific reference in the profile text,
return {"subject": null, "body": null}.
The forbidden-phrases list is the single most important line in the prompt. Ban the three fallback openers every LLM defaults to, and the model is forced to actually cite something from raw_profile_text because there's no lazy escape hatch. The null-return clause catches thin profiles — if the input is garbage, the model refuses instead of hallucinating a fake reference.
n8n takes the JSON, calls the Gmail API with users.drafts.create, applies a sourcing-review label, and updates the sheet row to drafted. No email leaves your account without you touching it.
Why drafts, not auto-send
- Domain reputation. One weird hallucinated sentence blasted to 40 people torches your sending IP for months.
- Cost of a false positive. A bad cold email to a senior candidate you actually want is worse than sending nothing.
- 6 minutes vs 3 hours. The human gate takes coffee-length time. Auto-send saves nothing worth the risk.
The morning review: 6 minutes on your phone
I open Gmail on my phone, filter to label:sourcing-review, and skim 40 drafts. Rough distribution across ~60 mornings I've tracked:
- ~33 drafts read clean → hit send.
- ~5 drafts need one small edit (usually a phrasing tweak or a wrong-role assumption) → edit and send.
- ~2 drafts are off-base (profile text was thin, model reached) → delete, mark row
do_not_contact.
Total time: 5-7 minutes. This is the only human input the pipeline needs after the sheet is curated.
The 40/day ceiling isn't arbitrary. Google's own Workspace sending limits cap you at 2,000 recipients/day on paid plans, but that's the technical ceiling. The deliverability ceiling — the number where inbox placement stays clean on a warmed domain — sits much lower for cold outreach. Forty personalized, human-approved sends per day is a number I've held for 6+ months without a single spam complaint on the domains I run this on. Push past 60-80 and reply rates start visibly dropping as more sends land in Promotions or Spam.
The reply handler: replies → Telegram in <2 minutes
The second n8n workflow is what turns this from a drafting tool into a pipeline. It watches Gmail every 5 minutes for replies on any thread that originated from sourcing-review, and routes them:
IF reply contains unsubscribe patterns
OR sentiment = hard_no:
→ mark row status = do_not_contact
→ archive thread
ELSE IF thread has reply from candidate:
→ tag "interested"
→ push to Telegram channel with:
- candidate name + LinkedIn URL
- original outbound email (quoted)
- their reply (quoted)
→ mark row status = replied
ELSE IF thread has no reply after 3 days:
→ generate follow-up draft (Claude, shorter)
→ drop in sourcing-review label
→ do NOT auto-send
Telegram is the important channel here. Reply-time on cold outbound is the single biggest predictor of whether a passive candidate actually books a call. If a senior engineer replies to your cold email and you take 6 hours to respond, they've moved on. Telegram push on my phone means I see it within 2 minutes and can thumb out a reply from anywhere.
For sentiment classification I use a cheap Claude Haiku call — a 200-token prompt that returns one of interested, hard_no, unsubscribe, ooo, or other. Costs about $0.001 per reply. Not worth building a classifier.
The real numbers
Six months of running this on one hiring pursuit, tracked in the sheet:
| Metric | Value |
|---|---|
| Drafts generated/day | 40 |
| Sends after human review | ~33 |
| Compute time (drafting) | ~8 min spread across morning |
| Claude API cost/day | $0.58 avg |
| Reply rate (positive) | 11-14% |
| Hard-no + unsubscribe | ~3% |
| Time to first candidate hired | 5 weeks |
Compare against manual: 3 hours to send 12 personalized emails at, say, $75/hour founder time = $225/day for a third of the volume. Even valuing your time at $30/hour, the pipeline pays for itself on day one.
What breaks this pipeline
- Thin
raw_profile_text. The null-return clause catches most of it, but if 20 of 40 rows return null, your sheet curation is the bottleneck, not the bot. - Sending from a cold domain. Warm the domain for 2-3 weeks with normal traffic before you start blasting 40/day. New domain + 40 cold sends = spam folder from day 1.
- Skipping the human gate. I've watched two clients try to auto-send "to save time." Both saw reply rates collapse within a week as one bad hallucination poisoned the batch.
- Follow-ups that ignore the first reply. If someone replied with "not now, ask me in Q3" and your 3-day follow-up fires anyway, you look automated. Gate follow-ups on
status = sentAND no reply.
Why bizflowai.io helps with this
Most of my client work is exactly this shape: a small team drowning in a repetitive outbound or inbound task, no ATS budget, no ops hire, needs the pipeline running by end of week. At bizflowai.io I ship these outbound sourcing bots, reply-triage systems, and Telegram-based approval gates as fixed-scope builds — the client owns the n8n workflows and the Google Sheet, so there's no monthly SaaS tax after handoff. The AI drafts. The human approves. The pipeline runs on infrastructure the client already pays for.
The moat isn't the model. It's the clean input, the forbidden-phrases prompt, and the human review gate. Get those three right and 40 personalized candidate emails a day costs you a coffee and six minutes.
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 outbound sourcing engine built with n8n, Claude, and Gmail?
It's a self-hosted recruiting pipeline that reverses inbound ATS tools. A Google Sheet holds candidate profile data, n8n polls it each morning, Claude drafts personalized outreach emails using raw profile text, and drafts land in a Gmail folder for human review before sending. It replaces paid tools like Lemlist, Instantly, or Greenhouse using infrastructure most teams already pay for.
How do I stop AI-generated cold emails from sounding generic?
Feed the model three concrete profile details rather than just a name and title. Paste the candidate's About section, last two job titles, and a recent post or project into your input. Then ban fallback openers like 'I came across your profile,' 'I hope this email finds you well,' and 'I was impressed by your background.' This forces the model to reference something specific.
Why does keeping a human review step matter for AI cold outreach?
Auto-sending AI-drafted emails destroys domain reputation and turns you into a blocked spammy recruiter. Routing drafts to a labeled Gmail folder lets you skim 40 drafts in about six minutes, send the clean ones, edit a few, and delete bad ones. This human gate protects deliverability while preserving nearly all the time savings of automation.
How many cold emails can Gmail send per day before deliverability drops?
A Gmail account on a real business domain can send around 40 personalized emails per day before deliverability starts to slip. Pipelines should be calibrated to that limit by using a status column in a Google Sheet and stopping the workflow once 40 rows are drafted. No dedicated email sequencer is required to enforce the cap.
How much does an AI sourcing pipeline cost compared to manual outreach?
Drafting 40 personalized emails per day uses roughly eight minutes of compute spread across the morning and about 60 cents in Claude API costs. Compared to three hours of manual sourcing to send twelve emails, the pipeline runs on existing infrastructure: Google Workspace, a free self-hosted n8n instance, and pay-as-you-go Claude API, with no monthly SaaS fees.