The problem
Before this build, the shop's after-hours line went straight to voicemail. The office manager spent the first 90 minutes of every morning triaging messages, calling people back, and watching three or four of them get booked by a competitor who'd answered live the night before.
The owner could see the leak — water-heater calls coming in at 9pm, booked elsewhere by 7am — but couldn't justify $4,500/month for a human answering service that wouldn't actually book the job, only take the message.
What we built
We deployed a Vapi voice agent on a dedicated number that the main line forwards to after 6pm. The agent triages the call live: water heater emergency, AC out in a heatwave, drain issue, or routine quote. It collects the address, scores urgency from the conversation, books the right on-call tech on the shared calendar, and SMS-pings the dispatcher with the booking and a one-paragraph summary.
After-hours emergency receptionist
Behind the agent, an n8n workflow handles the post-call work — writes the booking to the CRM with a P1 tag, updates the on-call tech's calendar, and posts the transcript to Slack for morning review.
The triage prompt itself is intentionally short — the conversational behavior comes from the tool definitions and the fallback rules, not from a 3,000-word system prompt.
// agent.config.ts
export const dispatcherAgent = defineAgent({
voice: 'vapi:warm-female-01',
fallback: { transferTo: ON_CALL_SUPERVISOR },
tools: [bookOnCalendar, lookupCustomer, classifyUrgency],
})The numbers
"I haven't listened to a voicemail in three weeks. I didn't know that was a thing you could be free from." — owner, week 4 post-launch