Weekend Agent — AI calls.
An outbound voice agent that actually calls your leads, qualifies them, books meetings, and writes everything back to your CRM — built in a weekend with Vapi, ElevenLabs, and a small amount of glue code.
The inbound chatbot era is ending.
Everyone built one. Every B2B site has the little square in the bottom right that pretends to be helpful. Most of them are a glorified FAQ over a slow LLM. They wait. They get answers in 30 seconds. They don't actually do anything.
The next loop is louder, and it doesn't wait: the AI that picks up the phone, calls your leads, and books the meeting before they've finished their coffee.
That's what Weekend Agent is. A SaaS-shaped outbound voice agent that calls the leads in your pipeline, speaks naturally, qualifies them against your rubric, books straight onto your calendar, and pushes the call summary + disposition into your CRM. All without a human on the line.
I built v1 in a weekend. Not because the agent is small — it's not — but because the stack underneath outbound voice has finally caught up with the use case. Five years ago this was a six-month project for a 10-person team. Today it's a Saturday and a Sunday for one person who knows where the seams are.
This is a write-up of those seams.
Why anyone should care
If you sell anything where the first conversation matters — services, software, real estate, education, healthcare — you already know the math: the lead that gets called in the first five minutes converts ~9× higher than the one called at the one-hour mark. And after 24 hours, you might as well not bother.
- 0×< 5 minutes
- 0×30 minutes
- 0×1 hour
- 0×24 hours
The reason no one calls in five minutes is that humans don't scale to the inbox. SDRs sleep. Time zones rotate. Even a well-staffed team has a 30-minute median response time on a good day. Your forms fire 24/7, your humans don't.
What an outbound voice agent gives you is:
- Sub-60-second dial time on every form fill, from any source, at any hour
- Consistent qualification — same rubric every call, no mood drift, no "I forgot to ask about budget"
- Native CRM writeback — the disposition, summary, and next step land in HubSpot/Salesforce before the call hangs up
- No coffee, no smoke break, no Friday-afternoon-energy — the agent's 4pm call is identical to its 9am call
- A real audio recording + searchable transcript on every call — you stop arguing about what was said in discovery, because the recording exists and it's tagged
The thing that's changed in the last twelve months is the last 200ms of latency. Voice agents used to feel like a hostage tape — long pauses, robotic "uhhh"s while the model thought. The conversation cadence is now close enough to human that prospects routinely don't realize they're talking to a machine until the agent volunteers it. (Which, ethically, it should — and Weekend Agent does, in the second sentence.)
Hi — is this Sarah? I'm calling on behalf of Acme. Quick one — you filled the demo form earlier this morning?
What it actually does, end-to-end
Concretely, here's the full loop a single inbound lead triggers:
- Lead fills a form on your site → webhook fires
- Agent decides whether to call (timezone check, lead score threshold, dedupe against last-30-days)
- Agent dials the lead's phone over PSTN
- Live conversation: introduction → consent → qualification (4–6 questions, branched) → calendar slot offer → booking
- On hangup: transcript → summary → disposition → CRM update → calendar invite sent → Slack ping to your AE
- Recording + transcript + summary land in a dashboard you can search
- +00sform firedlead webhook · enrichment · timezone check
- +02sdial decisionscore ≥ threshold · dedupe pass · ok to call
- +04sagent dialingpstn out · ringing · ElevenLabs voice loaded
- +18squalifying4-question branched script · function-calls live
- +90sbookingcalendar.create · invite sent · slack ping
- +108sdispositionsummary · transcript · crm writeback complete
Total wall-clock from "form submit" to "meeting booked" on the happy path: about two minutes. The longest pole is the human picking up.
The stack
The whole thing is four moving parts, all rentable, all replaceable:
1. Vapi — the voice orchestration layer
Vapi is the load-bearing piece. It handles:
- STT (speech-to-text — they default to Deepgram, swap to whisper or any other)
- LLM call (your prompt, your model, your function definitions)
- TTS (your voice provider — ElevenLabs in our case)
- Telephony (Twilio under the hood, but you don't touch it)
- The turn-taking logic — when to interrupt, when to wait, how long to wait before assuming the other side is done
The reason Vapi is the right choice for a weekend build is that you write the prompt and the function schema, and they handle the millisecond-level latency game. You can build it yourself with LiveKit + Twilio + your own LLM pipe, but you'll spend three weeks tuning end-pointing alone.
2. ElevenLabs — the voice itself
The voice is what the prospect actually hears. If it sounds even slightly off, they hang up.
ElevenLabs gives you two things that mattered for this build:
- A custom voice clone — you upload 5 minutes of any human voice (a cofounder's, a sales lead's, your own) and the agent calls in that voice. This is the difference between "the AI called me" and "someone from Vinci Labs called me, I think". Used responsibly with disclosure, it's the right primitive.
- Real-time streaming TTS — sub-300ms time-to-first-audio, which is what makes the conversation feel like a conversation instead of a walkie-talkie.
3. Claude (Sonnet 4.6) — the brain
The actual LLM call inside each turn is Claude Sonnet 4.6. Three reasons:
- Function calling is well-behaved — when the model decides to call
book_meeting(slot, contact), it actually fills in the arguments correctly instead of hallucinating fields. This is the part that breaks most voice agents. - It's fast enough — sub-700ms first-token-time at the prompt sizes I run, which keeps the total turn well under the 1.5-second feels-human threshold.
- It refuses cleanly — when a prospect asks something out of scope ("can you also do my taxes?") it doesn't make something up, it gracefully redirects.
Opus 4.7 is the better model for everything except this. For voice, you want fast and consistent over smart. The model decides between maybe four function calls and a handful of branching paths — that's not what you need Opus for.
4. n8n — the glue
n8n holds the workflows together. Inbound webhook → enrichment → dial decision → call → post-call summary → CRM write → Slack notification. The whole loop is one n8n workflow you can open and read in one screen.
I used to write this in TypeScript. n8n is what I reach for first now for anything that's "API A talks to API B and then writes to API C". The build time savings are unreasonable.
What "built in a weekend" actually means
Day 1 (Saturday, ~6 hours):
- Vapi account, ElevenLabs voice clone, Claude API key wired up
- One agent persona in Vapi, with the qualification script as a system prompt
- A
book_meetingfunction pointing at a stubbed calendar - Manual test calls to my own phone until the cadence felt right
- Three hours of prompt iteration on the first sentence alone
Day 2 (Sunday, ~6 hours):
- Real calendar integration (Cal.com API)
- HubSpot writeback for the disposition + summary
- n8n workflow for the inbound webhook → dial decision
- Dashboard scaffold (Next.js, three pages: calls, leads, settings)
- Three more friends/family calls to debug edge cases
- Deploy to Vercel + a small AWS Lambda for the call-recording archive
What did NOT get built in the weekend:
- Eval suite (came in week 2 — and is the only reason I trust it now)
- Compliance — TCPA, do-not-call lists, time-of-day rules per jurisdiction
- The admin UI for non-technical operators
- Multi-language (the v1 is English-only)
The compliance and the eval suite were each bigger than the original build. The "I built it in a weekend" demo and "I have something I'd let a customer use" reality are separated by about three weeks of unglamorous work.
What I'd do differently if I started again
Three things:
-
Build the eval harness on day 1. Voice eval is harder than text eval — you're scoring not just "did the agent give the right answer" but "did the conversation feel human", "did it interrupt at the right moments", "did it concede on price-related questions without being asked". I'd start that scoring rubric before the agent ever speaks.
-
Pick the disclosure language first, not last. "Hi, this is an AI assistant calling on behalf of [company]" sounds straightforward. It is not. The exact phrasing changes conversion by ~15 percentage points in my A/B tests. Write 20 versions, A/B them with friends, pick one before you write the qualification script.
-
Don't ship outbound until inbound is wired. The agent is going to mishandle calls, especially in week one. You need a path for "press 1 to talk to a human" that actually routes to a human, not a voicemail box. The trust collapse from one bad call is permanent for that prospect.
What's next
The v1 calls one prospect at a time, one workflow at a time. The v2 question I'm sitting on is whether the right unit is the agent or the swarm.
A swarm version would dial 20 prospects in parallel from 20 cloned voices, each with a slightly different opener, all reporting back into a single live dashboard you can watch like a trading floor. That's a different shape of company — more orchestration, less per-call sophistication.
I don't know yet whether that's the right move or whether it's just visually exciting. The next month is figuring that out.
Try it
The full source — agent config, n8n workflows, dashboard, eval scaffolding — is on GitHub:
→ github.com/arorachakit/chakit-ai-projects/tree/main/apps/custom-voice-agents
The live dashboard:
→ chakit-ai-projects-custom-voice-agents.vercel.app
If you're shipping something in this shape — or want to talk about the tradeoffs between swarm-of-agents and one-agent-many-calls — hi@chakit.ai. I'm collecting case studies.
Owned, undistributed, and published only here — no newsletter, no funnel, no upsell.