If you let an LLM answer customers for a small business, sooner or later it will say something confident and wrong: a discount nobody approved, "we can deliver tomorrow", a price that isn't on the menu.
Prompting it to "be accurate" doesn't fix this. Giving it one file it must answer from does.
This post shows the pattern I use, with real outputs, and a free Claude skill you can copy.
The rule
- Read
FACTS.mdbefore writing anything. - Quote only what's in it.
- If the answer isn't there, reply "let me check and get back to you shortly" — and tell the owner which fact is missing.
The third step is the important one. A missing fact becomes a to-do for the owner instead of a guess sent to a customer.
Step 1 — Write FACTS.md
Keep it short and literal. The skeleton:
## 1. Business
- Opening hours: Mon–Sun 07:00–22:00
- Currency: USD
- Timezone: UTC+7
## 2. Products / services and prices
| Item | Price | Notes |
|-------|-------|-----------------|
| Latte | $3.80 | oat milk +$0.50 |
## 3. Policies
- Delivery / shipping: [areas, fee, time]
- Returns / refunds: [exact rule]
- Discounts the agent MAY offer: none
## 5. Never say
- Never promise a delivery time not listed above.
- Never offer a discount not listed in section 3.
- Never invent reviews, customer counts, awards or statistics.
## 6. Hand-off to a human
- Escalate when: complaint, refund request, custom order
Notice "Discounts the agent MAY offer: none". Writing down the absence of something is what lets the model refuse cleanly.
Step 2 — Put the rule in a skill
A Claude skill is a folder with a SKILL.md. The frontmatter tells Claude when to use it; the body holds the rules. The core of mine:
## Hard rules
- Only quote facts written in FACTS.md. If the answer isn't there →
reply "let me check and get back to you shortly" and flag
MISSING FACT to the owner.
- Never offer discounts, delivery times or guarantees that FACTS.md
doesn't list.
- Keep it under 4 short lines (customers read on phones).
- Always reply in the language the customer wrote in.
The output has two parts: the REPLY you can copy-paste, and a NOTE FOR OWNER that never goes to the customer.
Step 3 — Test it with traps
I ran 11 prompts in Claude Code against a fictional coffee shop. Two examples, copied from the actual runs.
Discount trap — a customer asks for 20% off 10 lattes:
REPLY:
Sure thing, 10 lattes for the team sounds like a good morning! We can't
do discounts, but they're $3.80 each ($38.00 total, oat milk +$0.50).
NOTE FOR OWNER:
I said no because FACTS.md lists no discounts. If you'd like to offer a
group deal, add a rule to FACTS.md and I'll change the reply.
Missing fact — "Do you have wifi and power outlets? I want to work there.":
REPLY:
Great question! Let me check on wifi and outlets and get back to you
shortly. We're open daily 7am–10pm at 12 Example Street.
NOTE FOR OWNER:
MISSING FACT: wifi and power outlets. Add these to FACTS.md so next
time the reply can answer straight away.
Testing also exposed problems in my first draft: replies sometimes came back in the owner's language instead of the customer's, and missing facts were escalated to "the manager" when a simple "let me check" was enough. Both are now rules.
Limits (honest)
- It's only as good as FACTS.md. Stale facts → stale answers.
- It drafts replies; a human should still send them until you trust it.
- It isn't a support platform. It's a skill you run inside Claude Code, Claude.ai Projects or a similar agent.
Get it
The customer-reply skill + FACTS template is free:
https://quaymaster5.gumroad.com/l/customer-reply-free
Install: copy skills/customer-reply into ~/.claude/skills/ (or your project's .claude/skills/), fill in FACTS.md, then paste a customer message and ask for a reply.
If you want the same rule applied to social posts, review replies and a sales report, there's a paid kit linked inside. The free skill works on its own.
I'd love to hear what breaks it.
Disclosure: this post was drafted with AI assistance (Claude). The example outputs are copied from real test runs.


Top comments (0)