Imagine a plumber named Marisol who runs a small company with three trucks. At 3:07 AM a stranger's basement starts filling with water. They call the first plumber they find. It rings six times and goes to voicemail. They call the next one.
Marisol never knew. That call was the most valuable lead of her week, and it went to a competitor because she was asleep, which is what a person is supposed to be doing at 3 AM.
Small businesses lose calls like this constantly. An agent receptionist is the obvious fix, but "just add an AI" is not a design. This walkthrough covers the decisions that make the difference between a receptionist that helps and one that makes things worse. The pseudocode below is illustrative and not tied to any particular product.
Step 1: The greeting
The first ten seconds decide whether the caller stays on the line.
A good greeting does four things:
Something like: "Hi, you've reached Marisol's Plumbing. I'm an AI assistant. I can take down the details and get a plumber moving. What's going on?"
Notice the last line is a question, and an open one. At 3 AM the caller is stressed. Let them talk.
Step 2: Intent capture
The agent has one job here: understand the situation well enough that a human can act without calling back. Think of it as filling out a form through conversation.
For a plumbing business, the form might be:
call_record:
caller_name: required
callback_number: confirm from caller ID, then read back
address: required, read back to confirm
problem_type: burst pipe | leak | blocked drain | no hot water | other
severity: active flooding | slow leak | inconvenience
safe_right_now: yes | no | unsure (water near electrics?)
can_shut_off_water: yes | no | unsure
best_time_to_reach: now | morning | specificDesign notes that matter:
Step 3: Escalation rules
Not every 3 AM call deserves waking Marisol. Some do. The rules must be explicit, written down, and boring.
escalation_rules:
wake_owner_now if:
- severity == "active flooding"
- OR safe_right_now == "no"
- OR caller_says_emergency_keywords (gas smell, sparks, sewage backing up)
- OR caller_is_existing_customer AND problem_type != "other"
queue_for_morning if:
- severity in ["slow leak", "inconvenience"]
- AND safe_right_now == "yes"
never_decide_alone:
- quoting a final price
- promising an arrival time
- anything involving gas or electrical danger beyond "leave the building, call emergency services"Three principles to build in:
Err toward waking a human on danger. A false alarm costs Marisol a bad night. A missed gas leak costs far more. Asymmetric costs mean an asymmetric threshold.
Escalate with the context, not just the alarm. When the agent wakes the owner, it sends a text with the whole case, not "missed call from unknown number." Something like: "Active flooding, 41 Alder St, caller Priya, safe, water shut off. Call back: the number below." Marisol can act from her pillow.
Have a second human. If the owner does not respond within a set time, the agent tries the next person on the list, and tells the caller honestly what is happening: "I've alerted our on-call plumber and will let you know as soon as someone responds."
The agent must never promise what it cannot deliver. "Someone will be there in twenty minutes" is a lie unless a human said so.
Step 4: The follow-up to the caller
Calls end, and anxiety does not. Before hanging up, the agent should:
After the call, a short text goes out: "Thanks for calling Marisol's Plumbing. We have your details for 41 Alder St and have alerted our on-call plumber. If you don't hear back within 15 minutes, call or text this number." Giving the caller a thread to continue on, one that keeps the context, means that when they reply "he's here, thanks" or "water's rising," the agent still knows who they are. That continuity across channels is the problem the whitepaper calls the cold start.
Step 5: The morning summary
The next morning, Marisol should open one message that tells her everything she needs, in order of what needs action.
summary_message:
headline: "3 calls overnight: 1 emergency handled, 2 for today"
per_call:
- time, caller, address, problem, severity
- what the agent said and promised
- what was escalated, to whom, and the result
- recommended next action
at_the_bottom:
- link to the full transcript for any callBy text or email? Use text for the headline, since she will read it with her coffee, and email for the full detail with transcripts, since email carries structure well. This is the channel-matching question: short and urgent goes to text, long and structured goes to email.
Let the summary be honest about uncertainty: "Caller was unsure whether the water was near electrical outlets. Recommend calling first." An agent that hides doubt is worse than one that flags it.
What to test before you trust it
Run it through scripted callers: the panicked one, the one who cannot hear, the one who gives the wrong address twice, the one who asks if it is a real person. Check that every danger keyword escalates, every call produces a summary, and nothing is promised that a human did not authorize.
The takeaway
A good agent receptionist is not a clever conversationalist. It is a disciplined one: honest in the greeting, structured in the capture, conservative in the escalation, and thorough in the handoff. It does not replace Marisol. It makes sure that the 3:07 AM caller reaches her at the moment it matters, with everything she needs to know, and that the next morning she knows exactly what happened.
Voice, text, email, one thread, one identity: that is the shape of the infrastructure problem Dial works on, so the receptionist can focus on the conversation.