I deleted 140 canned replies and kept 20. Response time went down and the answers got better. A developer audited 1,912 canned helpdesk replies across three deployments and roughly 46,000 outbound messages, finding that 68–74% of templates were never used while 20 well-built templates covered 84% of message volume. The work distills the library into twenty variable-driven templates organized around five customer moments—first contact, price and scope, availability, bad news, and handoff—and argues that templates hardcoding prices or service areas become incidents once those facts change. 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. A template earns its place only if it does three things at once: 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. 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. 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. 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. 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. 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. 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. 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. 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 https://whop.com/agentfast-04b6/