Small Biz Workflows
FORM SBW-003 · REV B · 5-FILE KITLead Rescue

After-Hours AI Voice Receptionist

An AI agent that answers the calls you physically can't, qualifies the lead, books the appointment, texts you a summary, and leaves you a searchable transcript of every call.

TIME TO VALUE
1–2 weekends
RUNNING COST
$30–80 voice platform + LLM at typical small-business volume
STACK
A voice-agent platform (Vapi or Retell) · An LLM for conversation (Claude) · A booking link with real availability (Cal.com) · SMS for summaries · A database for transcripts and call logs
Get the kit free ↓Free Account · Field-TestedREAD THE FULL BUILD BELOW · KIT FREE WITH EMAIL

PROVENANCE: Production AI voice agent answering missed and after-hours calls for service businesses. Generalized for any small business, no vendor lock-in, no secrets, adapt freely. The kit's INSTALL.md is a one-shot Claude Code build: unzip, paste one prompt, answer ~5 questions.

TL;DR

The 9 PM caller with a burst pipe hires whoever answers. This build answers: a natural-sounding AI picks up on the second ring, asks your qualifying questions, books a real slot, then texts you a clean summary with the full transcript saved. Every call becomes structured data instead of a lost voicemail.

The problem this solves

The after-hours emergency caller is the most valuable lead your business will ever get, maximum urgency, minimum price sensitivity, and zero loyalty: they will hire whoever picks up. Voicemail loses them. A text-back (SBW-001) helps, but some situations need a voice.

A voice agent answers every time, sounds natural, asks the questions you'd ask, what's the problem, where are you, how urgent, books a time slot, and hands you the whole conversation as data.

The full picture

                          THE END-TO-END FLOW
═══════════════════════════════════════════════════════════════════════

 ┌──────────────┐  after hrs /  ┌──────────────────┐
 │   CUSTOMER   │  ring-no-ans  │   CALL ROUTING   │
 │  calls you   │ ────────────▶ │ day: your phone  │
 └──────────────┘               │ night: the agent │
                                └────────┬─────────┘
                                         ▼
                          ┌──────────────────────────┐
                          │      VOICE AGENT         │
                          │  (Vapi/Retell + Claude)  │
                          │                          │
                          │ "Hi, you've reached      │
                          │  Mike's Plumbing, I'm   │
                          │  the AI assistant…"      │
                          │                          │
                          │ asks: problem? where?    │
                          │       urgency? number?   │
                          └────────────┬─────────────┘
                                       │ live availability
                                       ▼
                          ┌──────────────────────────┐
                          │   BOOKING (Cal.com)      │
                          │ "I can get someone there │
                          │  between 9 and 11" = REAL│
                          └────────────┬─────────────┘
                                       │ call ends
                ┌──────────────────────┼──────────────────────┐
                ▼                      ▼                      ▼
     ┌────────────────────┐ ┌────────────────────┐ ┌────────────────────┐
     │  TRANSCRIPT + JSON │ │  SMS TO YOUR CELL  │ │   CALL LOG (DB)    │
     │  summary extracted │ │ "Dana, 84th Ave,   │ │ transcript, intent,│
     │  by post-call LLM  │ │  ceiling leak,     │ │ booking, outcome, │
     │                    │ │  booked 9am, URGENT│ │ searchable forever │
     └────────────────────┘ └────────────────────┘ └────────────────────┘
═══════════════════════════════════════════════════════════════════════

What you need

Piece What it does Pick
Voice platform Telephony + speech-to-text + text-to-speech Vapi or Retell, connected to a Twilio number
Conversation LLM The agent's brain during the call Claude (Sonnet tier for conversation quality)
Post-call LLM Reads the transcript, extracts structured data Claude (Haiku tier, cheap, runs once per call)
Booking Real availability the agent can offer Cal.com or your scheduler's API
Call log Transcripts + extracted data Supabase/Postgres

Phase 1, Route only the calls you'd otherwise lose

   INCOMING CALL
        │
        ▼
  ┌─────────────────────────────┐
  │ what time is it?            │
  ├──────────────┬──────────────┤
  │ business hrs │ after hours  │
  ▼              ▼              
  ring your      straight to    
  real phone     the agent      
  │                             
  │ no answer in 20s?           
  └────────────▶ agent picks up 

The agent is a safety net, not a replacement for answering your own phone. Day calls forward to you first; the agent catches ring-no-answer and everything after close.

Phase 2, Write the agent's job description (not a script)

This single prompt is 80% of the quality. Don't script lines; describe the job.

The system prompt (copy, fill, tune):

You are the after-hours assistant for {{business_name}}, a {{trade}} company serving {{service_area}}. You are an AI and you say so in your first sentence. You sound like a calm, friendly dispatcher: short sentences, plain words, never more than one question at a time.

Your job on every call:

  1. Find out what the problem is.
  2. Find out where they are. If outside {{service_area}}, politely say we can't help and suggest they search locally. Do not book them.
  3. Find out how urgent it is. Water, gas smell, no heat in winter, or safety = emergency.
  4. Get their name and best callback number.
  5. If emergency: tell them the on-call tech will call within 15 minutes. Do NOT book.
  6. If routine: offer the next real opening from the calendar and book it.

Hard rules:

  • Never quote prices. Say "the tech will confirm pricing before any work starts."
  • Never promise arrival times outside the calendar's real openings.
  • Never claim to be human, even if asked directly.
  • If the caller is angry, confused, or the situation doesn't fit, stop qualifying and say the owner will call first thing, then end gracefully.
  • Calls are recorded; the platform's greeting discloses this.

Worked example, what a good call sounds like:

 AGENT:  Hi, you've reached Mike's Plumbing. I'm the AI assistant, 
         I can get help headed your way. What's going on?
 CALLER: Yeah hi, we've got water dripping through the kitchen ceiling.
 AGENT:  That sounds urgent. Where are you located?
 CALLER: 84th Avenue, near the school.
 AGENT:  Got it, that's in our area. Is the water still coming through?
 CALLER: Yeah, it's getting worse.
 AGENT:  Okay, what's your name and the best number to reach you?
 CALLER: Dana, this number is fine.
 AGENT:  Thanks Dana. Our on-call tech will phone you within 15 minutes.
         If you can, shut off the water at the main valve, usually in
         the basement near the meter. Help is on the way.

Six exchanges. No rambling, no fake cheer, one piece of genuinely useful advice.

Phase 3, The post-call pipeline (transcripts into data)

The call ends; the platform hands you a transcript. Don't let it rot in a dashboard, run it through an extraction LLM immediately.

  CALL ENDS
     │ transcript + recording URL via webhook
     ▼
  ┌──────────────────────────────────────────┐
  │ POST-CALL LLM, returns strict JSON:     │
  │ {                                        │
  │   "caller_name": "Dana",                 │
  │   "callback_number": "+1403…",           │
  │   "address_area": "84th Ave",            │
  │   "problem": "water through ceiling",    │
  │   "urgency": "emergency",                │
  │   "booked_slot": null,                   │
  │   "promised": "on-call callback 15 min", │
  │   "out_of_area": false,                  │
  │   "follow_up_needed": true               │
  │ }                                        │
  └────────────────┬─────────────────────────┘
                   │
        ┌──────────┴──────────┐
        ▼                     ▼
  ┌───────────────┐    ┌──────────────────┐
  │ SMS SUMMARY   │    │ call_log row     │
  │ to your cell  │    │ transcript +     │
  │ in <60s       │    │ JSON, searchable │
  └───────────────┘    └──────────────────┘

The extraction prompt:

Below is a transcript of a call answered by our AI assistant for {{business_name}}. Return ONLY JSON: caller_name, callback_number, address_area, problem (under 8 words), urgency ("emergency", "soon", "routine"), booked_slot (ISO time or null), promised (anything the agent committed to, under 12 words), out_of_area (bool), follow_up_needed (bool, true if anything was left unresolved). If a field wasn't said, use null. Never guess.

TRANSCRIPT: {{transcript}}

The promised field matters most: it's the list of commitments your AI made on your behalf. Read it every morning.

Data model

 call_log
 ┌──────────────────┬────────────────────────────────────────┐
 │ id               │ uuid                                   │
 │ called_at        │ timestamp                              │
 │ caller_number    │ +1403…                                 │
 │ recording_url    │ link (platform)                        │
 │ transcript       │ full text                              │
 │ caller_name      │ Dana                                   │
 │ problem          │ water through ceiling                  │
 │ urgency          │ emergency | soon | routine             │
 │ booked_slot      │ timestamp or null                      │
 │ promised         │ "on-call callback 15 min"              │
 │ out_of_area      │ boolean                                │
 │ follow_up_needed │ boolean                                │
 │ outcome          │ booked | callback_done | lost | spam   │
 └──────────────────┴────────────────────────────────────────┘

Folder structure

 voice-receptionist/
 ├── CLAUDE.md             ← the AI-builder brief (ships in this kit)
 ├── prompts/
 │   ├── agent-system.md   ← the job description above, versioned, tuned weekly
 │   └── extract.md        ← post-call extraction prompt
 ├── api/
 │   ├── call-ended.ts     ← platform webhook → extraction → SMS + log
 │   └── availability.ts   ← feeds real Cal.com slots to the agent
 └── lib/
     ├── extract.ts        ← LLM call + JSON validation
     └── notify.ts         ← owner SMS summary

Compliance notes (US + Canada)

This is practical guidance, not legal advice, confirm the rules for the states/provinces you operate in.

Numbers to watch

Metric Healthy Where it comes from
Capture rate (contact info or booking) 60–80% of answered calls call_log
Booked directly 30–50% of routine calls booked_slot
Out-of-area filtered every one saves a wasted callback out_of_area
Promise follow-through 100%, read promised every morning your own discipline

One saved after-hours emergency per month typically pays for the system several times over.

Week-one checklist

Troubleshooting

MEMBERS · FREE · THE KIT

Sign in free to unlock the After-Hours AI Voice Receptionist kit

One free membership unlocks this kit, the whole library, and every new workflow the week it ships, plus your members dashboard. One tap with Google or a magic link. No password.

Sign in / Join free

Already a member? This unlocks the moment you sign in.