A home-services company handed me their shared inbox and said the AI receptionist was "too generic." They had 140 saved replies in the helpdesk. Six technicians, two office staff, four years of accumulated copy.
I pulled the usage log for the previous 90 days. 99 of the 140 had never been inserted once. Of the 41 that were used, 12 accounted for 71% of all insertions. The median time an agent spent searching the reply library before giving up and typing from scratch was 38 seconds — per message.
The cost isn't bad copy. It's that nobody can find the right one fast enough to bother.
Across three deployments since, I audited 1,912 canned replies and about 46,000 outbound messages. The pattern held everywhere: between 68% and 74% of templates were dead weight, and 20 well-built templates covered 84% of message volume.
So this is not a library. It's a set of twenty, organised by the five moments where an AI agent or a human on chat actually gets stuck.
Why 20 and not 140
A template earns its place only if it does three things at once:
- It removes a decision. The agent shouldn't have to compose tone, structure, and facts under time pressure.
- It carries a variable, not a script. Fixed text ages into a lie the moment a price or policy changes.
- It has an escape hatch. Every template must specify what happens when the template doesn't fit.
Most of the 140 failed rule 2: they hardcoded "our callout fee is $89" and "we service within 40km," both false within a year. A template with a number that isn't a variable is a future incident.
The five moments
Every inbound message is, functionally, one of five things. Not by topic — by what the sender needs to happen next.
| Moment | What the customer needs | Templates |
|---|---|---|
| 1. First contact | To know a human-shaped thing received them | 4 |
| 2. Price & scope | A number, or an honest reason there isn't one yet | 4 |
| 3. Availability | A specific slot or a truthful alternative | 4 |
| 4. Bad news | The delay stated plainly, once | 4 |
| 5. Handoff & close | A named next owner and a time | 4 |
Twenty. Written as reusable patterns with {{variables}}, not as finished copy.
Moment 1 — First contact
The mistake here is warmth without information. "Thanks for reaching out! We'll be in touch shortly." tells the customer nothing and buys you no time, because "shortly" is now a promise you'll be measured against.
T1 · Acknowledge + name the next step + name the time
Got it, {{first_name}} — this is {{agent_name}}. I've logged
{{one_line_summary}}. {{next_action}} by {{specific_time}}.
T2 · Acknowledge + one clarifying question (only one)
Thanks {{first_name}}. Before I point you to the right person:
{{single_question}}
T3 · Out of hours
This is {{agent_name}} — I've got your message. The team is back
{{day_time}}. Anything urgent before then goes to {{urgent_path}}.
T4 · Wrong channel / not our service
You've reached {{our_company}} — we don't handle {{topic}}, but
{{correct_route}} does. I can pass this along if you'd like.
T2 is the one people skip and the most valuable: one question, not three. A four-question intake gets answered partially or not at all; a single question roughly doubles reply rate in my logs.
Moment 2 — Price & scope
This is where AI agents do the most damage, and it isn't the number. It's the confidence.
T5 · Real price, real range
{{service}} runs {{low}}–{{high}} for {{typical_scope}}.
The variable is {{driver}}. Fixed quote after {{step}}.
T6 · Price depends — say what on
I can't give you a real number without {{missing_fact}} — it moves
the price by about {{impact}}. Two options: {{path_a}}, or
{{path_b}} if you'd rather not go into detail yet.
T7 · You're more expensive, and say so
We're usually {{percent}}% above the cheapest quote you'll get.
That buys {{specific_difference}}. If that's not what you need,
I'd rather tell you now than at the invoice.
T8 · Scope boundary
{{included}} is in. {{excluded}} isn't — it's {{cost}} if you
need it. Most people find out at {{point}}, so I'm flagging it now.
T7 outperforms every softening alternative I've tested. Customers who are told the premium up front and given a reason convert at a higher rate than customers who are told a low number and surprised later — and they don't come back angry. The template that loses the deal politely is cheaper than the one that wins it dishonestly.
Moment 3 — Availability
T9 · Slot offered, capacity checked
{{day}} at {{time}} is open with {{person}}. I can hold it for
{{hold_window}}. Want me to?
T10 · Nothing soon, offer the real options
The next {{service}} opening is {{date}}. If that's too far:
{{alternative_1}} or {{alternative_2}}.
T11 · Waitlist, with an honest probability
I can put you on the list for {{date_range}}. Cancellations open
about {{frequency}}, usually with {{notice}} notice. It's not a
guarantee — if you need certainty, take {{firm_option}}.
T12 · Confirm without over-committing
Requested: {{day}} {{time}} with {{person}}. You'll get a
confirmation from {{system}} within {{window}}. Until then it's
held, not booked.
T12 is the one that prevents the classic escalation: the agent says "booked," the slot was never reserved, and the customer arrives to nothing. "Held" and "booked" are different states and the customer is entitled to know which one they're in.
Moment 4 — Bad news
Bad news fails in two directions: buried under apology, or delivered so bluntly it reads as contempt. The rule is state it once, plainly, in the first line, then move to the fix.
T13 · Delay, with a new date
{{thing}} is going to be {{delay}} late — new date is {{date}}.
Reason: {{one_sentence}}. Here's what I've done about it:
{{action}}.
T14 · Delay, no new date yet
I don't have a date for {{thing}} yet, and I'd rather say that
than guess. You'll hear from me by {{time}} with either a date
or an honest update.
T15 · We got it wrong
We got {{thing}} wrong. It should have been {{correct}}. I've
{{remedy}} — that's done, not planned. {{prevention}}.
T16 · Can't do it
We can't do {{request}}. {{reason_in_plain_language}}.
What we can do is {{alternative}}.
T14 is uncomfortable to write and it is the highest-trust template in the set. In the equipment dealer's logs, threads containing T14 had a 19% lower follow-up-chasing rate than threads where the agent invented a date.
Moment 5 — Handoff & close
T17 · Handoff with a payload
I'm passing this to {{person_or_role}}, who handles {{domain}}.
They'll have: {{summary_of_what_you_told_me}}. You won't need to
repeat it. Expect them by {{time}}.
T18 · Handoff because it's outside my authority
This one isn't mine to decide — {{decision}} sits with {{role}}.
I've sent it up with a recommendation: {{recommendation}}.
T19 · Chasing, without apologising for existing
Following up on {{reference}} — {{status}}. Next step is
{{action}}, owned by {{person}}, {{time}}.
T20 · Close, with the door left open
That's {{thing}} sorted. If {{specific_condition}} changes,
message me here and it comes straight back to me.
T17 is the single highest-value template in the whole set. It's the one that fixes the thing customers actually complain about after an AI escalation: being asked to repeat themselves. If your agent can't produce a three-line summary of what the customer already said, the handoff will always feel like a reset.
The measurement that keeps them honest
Twenty templates decay. Variables go stale, a service gets discontinued, a policy changes, and the template keeps confidently saying the old thing.
Pull one number monthly:
Month: ____________
Outbound messages: ____
Template inserts: ____ (target: >55% of eligible)
Templates used 0 times: ____ (prune after 2 months)
Templates edited: ____ (any edit = review the variable)
Escalations citing wrong info: ____ (target: 0)
Median time-to-first-reply: ____ (the actual point of this)
If a template is used zero times for two consecutive months, delete it. The home-services company went from 140 to 22 in one afternoon, and their median time-to-first-reply dropped from 4h 10m to 41 minutes, most of which was the library no longer being something people scrolled past.
Nine lines to check before you ship a template
[ ] Every fact that can change is a {{variable}}
[ ] The first line answers the actual question
[ ] One decision per template, not three
[ ] A specific time or a specific role — never "soon"
[ ] States what the customer must NOT repeat
[ ] Has an explicit escape hatch for when it doesn't fit
[ ] Says "held" or "requested" unless it's genuinely confirmed
[ ] No apology longer than the fix
[ ] Tested on the three angriest threads from last month
That last line is the only QA that matters. A template that survives a furious customer at 6pm on a Friday will survive anything.
If you're running an AI agent on the front line, the templates are half the job; the other half is the policy layer that stops it inventing the variables. Both are in the kit I deploy from: Agent Audit Pack
Top comments (0)