34 Applicants, 2m 40s, $0.11: The Telegram Hiring Bot

Forty responses sitting in a Google Sheet you haven't opened. Every row is a human, and you know it. That guilt is what pushes solopreneurs into $200/month ATS subscriptions they don't need — when what they actually need is a bot that reads the sheet, ranks it, and pings their phone with the top three.
Here's the exact stack I ran last month for a client hiring one contractor: 34 applicants scored in 2 minutes 40 seconds, total Claude spend $0.11, zero recurring infrastructure cost. No Greenhouse, no Workable, no monday.com. Let me walk you through the build and — more importantly — where it breaks.
Why an ATS is the wrong tool for hiring one person
Greenhouse, Workable, Lever and monday.com's recruiting product are genuinely well-built software. They are also built for a hiring manager filling twelve roles this quarter with three recruiters supporting them. Pipeline stages, scorecard templates, interview-kit assignments, EEOC reporting — none of that maps to a solopreneur hiring their first VA.
The job to be done at your scale is smaller and sharper:
- Read every response so nobody gets ghosted.
- Rank them against a rubric you actually care about.
- Surface the top three to your phone so you can act during lunch.
That's a scoring problem plus a notification problem. It is not a pipeline problem. Paying $149-$399/month for pipeline software to solve a scoring problem is like buying Salesforce to track your gym buddies.
The stack, deliberately boring
Four pieces, all of which you probably already have accounts for:
- Google Form for intake. Free, mobile-friendly, everyone knows how to fill one out.
- n8n (self-hosted or cloud) as the orchestrator.
- Claude Haiku via API as the scoring model.
- Telegram bot as the notification layer.
No database. No CRM. No vector store. The Google Sheet backing the form is the database. If you self-host n8n on a $6 VPS you already run, marginal infrastructure cost is $0. If you use n8n Cloud, it's $20/month and covers 50 other workflows too.
The Claude API call is the only per-run cost. At Haiku pricing, 34 applicants with ~800 tokens in and ~60 tokens out per applicant lands at roughly $0.11 for the batch. I've re-run this pattern for four separate clients — the cost stays in the $0.08–$0.15 range for batches under 50.
Step 1: The form and the sheet
Keep the form short. Every additional field cuts your response rate and gives the model more noise to weigh.
Fields I use:
- Name
- Timezone (dropdown, not free text)
- One link — portfolio, GitHub, or LinkedIn
- One open-ended question: "Describe the last project you shipped end to end. Two paragraphs max."
That last question is the whole game. The score is 80% driven by what they write there. Vague answers ("I've done many projects across various industries") get flagged. Specific answers ("Migrated a Shopify Plus store from Liquid to Hydrogen, cut LCP from 4.1s to 1.6s, went live March 14") score high.
Link the form to a Google Sheet in the form's Responses tab. That sheet becomes your audit trail — searchable, exportable, and legally defensible if anyone ever asks how you evaluated candidates.
Step 2: The n8n workflow
Two workflows, not one. Separating them keeps debugging sane.
Workflow A — Score on new response:
- Google Sheets Trigger → On row added, pointed at the responses sheet.
- HTTP Request → Claude API (scoring prompt below).
- Code node → parse the JSON response.
- Google Sheets → write
scoreandreasoningback to the row.
Workflow B — Shortlist push (runs every 2 hours, or manually):
- Google Sheets → read all rows where
score >= 70ANDnotified != true. - Sort by score descending, take top 3.
- Telegram → send formatted message with inline buttons.
- Google Sheets → mark those rows
notified = true.
I use the Sheets trigger instead of the native Google Forms trigger because Sheets lets you reprocess a batch by clearing the score column. Forms trigger fires once per submission and gives you no replay path when you tweak the rubric.
Step 3: The scoring prompt (this is where it lives or dies)
Four weighted criteria. The weights are the opinionated part — change them for your role.
You are evaluating a job application for a [ROLE] contractor role.
Working hours: 9am–6pm US Eastern.
Score the applicant 0–100 using these weighted criteria:
1. Relevant experience (weight 40)
- Concrete, verifiable projects in the required stack
- Deduct heavily for vague or generic claims
2. Portfolio link quality (weight 25)
- Does the link work, is the work real, is it recent (<18 months)
3. Timezone overlap (weight 20)
- 6+ hours overlap = full marks
- 3–5 hours = half marks
- <3 hours = zero
4. Red flags (weight 15, subtract)
- Obvious AI-generated fluff ("leverage synergies", "passionate about")
- Mismatched claims (senior title, junior detail)
- No specifics, only adjectives
Return JSON only, no prose:
{
"score": <int 0-100>,
"reasoning": "<one line, max 20 words>"
}
Application:
Name: {{name}}
Timezone: {{timezone}}
Link: {{link}}
Project: {{project_answer}}
Two constraints matter here. First, JSON only, no prose — otherwise n8n's Code node has to strip markdown fences and you'll spend an afternoon debugging edge cases. Second, one-line reasoning, max 20 words — because the output lands on a phone screen and anything longer gets truncated.
Haiku is the correct model choice. It's fast (sub-second per applicant at this prompt size), it's cheap, and for structured scoring against an explicit rubric it's more accurate than you need. I've tested the same prompt on Sonnet — scores shifted by an average of 3.2 points, ranking order changed on 2 of 34 applicants. Not worth 12x the cost for a shortlist you're going to eyeball anyway.
Step 4: The Telegram message that actually gets read
The BotFather setup is boring — /newbot, name it, grab the token, paste into n8n's Telegram credentials. What matters is the message format.
Bad format (what most tutorials show):
New candidates:
1. Sarah Chen - 88/100 - Sarah is an experienced developer who has worked on many projects including a recent Shopify migration and appears to have strong skills in the required areas based on her portfolio which demonstrates good work.
2. Marcus Ali - 82/100 - Marcus has...
That's unreadable on a phone. Here's the format I ship:
🥇 Sarah Chen — 88
Shipped Shopify Plus → Hydrogen migration solo, LCP 4.1s→1.6s
sarahchen.dev
[Reply] [Reject]
🥈 Marcus Ali — 82
Built 3 internal tools in n8n for a 40-person agency, screenshots verified
github.com/marcusa
[Reply] [Reject]
🥉 Priya Shah — 76
6 months freelance React, one live case study with metrics
priya.build
[Reply] [Reject]
Rank, name, score, one-line reasoning, link, two buttons. That's it. The Reply button hits a second n8n webhook that drafts a Gmail from a template with the candidate's name and email pre-filled. The Reject button marks the row status = rejected in the sheet. Both buttons take one tap.
Step 5: The real run, unedited
Client posted a contractor role in a Slack community on a Tuesday. Form went live at 9am. By Wednesday noon, 34 responses.
- Workflow A had been firing on every submission for 27 hours, so all rows already had scores.
- At 12:04pm we ran Workflow B manually.
- 12:06:40pm — one Telegram message, three names, three scores, three links.
- Client tapped Reply on ranks 1 and 2 during lunch. Reject on 8 low-scorers he skimmed later that evening.
- Both replied-to candidates responded within 4 hours. He hired rank 1 by Friday.
Setup time when we built it together over a screenshare: 45 minutes, most of which was BotFather auth and getting the Claude API key into n8n credentials.
Where this breaks (the honest section)
Every tutorial that skips this is lying to you.
- PDF resumes. If your form asks for a PDF upload, Haiku will not parse it reliably from the base64 blob. Either strip the file field and require a link instead, or add a Google Drive → PDF-to-text step before scoring. I chose the first option — links filter for people who have a portfolio worth showing.
- Non-English applications. The rubric works fine for English, French, Spanish. For CJK languages the "red flags" criterion is unreliable because "AI-generated fluff" patterns don't transfer. Run those through Sonnet instead or add a language-specific rubric.
- Bias. The model will happily score based on signals correlated with things you shouldn't hire on. I explicitly remove name and photo from the prompt payload and only send timezone, link, and project answer. Even then, writing style correlates with education and native language. This is a shortlist tool, not a decision tool — you still read the top 3 yourself.
- Volume ceiling. Above ~200 applicants per batch, the "top 3 to Telegram" pattern breaks because rank 4–10 are often within 5 points of rank 1–3. At that scale switch to a paginated Telegram flow or a simple web view.
- Legal. In the US, EU, and UK, automated candidate screening has disclosure requirements in some jurisdictions (NYC Local Law 144, EU AI Act's high-risk classification for employment). If you're hiring at any scale, check the current rules for your state or country and add a disclosure to the form. This post is not legal advice.
Why bizflowai.io helps with this
The Telegram hiring bot is one of a dozen "solopreneur-scale" workflows I build for clients at bizflowai.io — small, opinionated automations that replace a $200/month SaaS with a $0.11/batch n8n workflow. Hiring is one; inbound lead triage, invoice reminders, competitor price monitoring and support-ticket routing follow the same pattern. The point isn't the bot, it's the mindset: match the tool to your actual volume, not to the volume the SaaS vendor built 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 cheapest way for a solopreneur to screen job applicants without an ATS?
A solopreneur can screen applicants using a stack of Google Forms for intake, n8n for workflow automation, the Claude Haiku API for scoring, and a Telegram bot for shortlist delivery. This setup requires no database, CRM, or ATS subscription, and if n8n is self-hosted the infrastructure cost is essentially zero. Scoring 34 applicants with Claude Haiku costs about eleven cents.
How do I automatically score job applicants with Claude Haiku?
Send applicant data from a Google Sheet via an n8n HTTP request node to the Claude Haiku API. Prompt the model with four weighted criteria: relevant experience (40%), portfolio quality (25%), timezone overlap (20%), and red flags like vague or AI-generated answers (15%). Ask it to return JSON with a score from 0-100 and a single line of reasoning suitable for a phone screen.
Why use a Telegram bot instead of a full ATS like Greenhouse or Workable?
ATS platforms like Greenhouse, Workable, and Lever are built for hiring managers filling twelve roles per quarter with recruiter support. A solopreneur hiring one contractor does not need pipeline views, scorecards, or team integrations. A Telegram bot delivers a ranked shortlist directly to your phone with inline Reply and Reject buttons, matching the actual scale of the hiring task.
When should the Telegram bot send a notification about an applicant?
Configure an IF node in n8n so the Telegram push only fires when an applicant's Claude Haiku score is above 70. This prevents notification fatigue from every submission. A second scheduled workflow can then read the top three unshortlisted candidates and send one clean, scannable message containing rank, name, score, one-line reasoning, and portfolio link.
How do I set up the n8n webhook to trigger on new applicants?
In n8n, create a new workflow and add a Google Sheets trigger set to fire on new row, pointing at your form responses sheet. Each submission wakes the workflow with the applicant row as payload. A Google Forms trigger works too, but the sheet-based approach is more forgiving when you need to reprocess a batch of applicants later.