Case Study · Operations
Case Study: Support Ticket Triage + Draft Reply Automation
How a customer-support team auto-classified 2,000 tickets/day, drafted first replies for 60% of them, and cut median first-response time from 4 hours to 12 minutes.
Results
Median first-response time
12 min
Tickets auto-classified
94%
Draft reply acceptance rate
67%
Agent hours saved / week
120 hrs
Escalation misroute rate
3.2%
Background
LedgerFlow provides invoicing and payment tools for SMBs. Support volume scaled from 800 to 2,000 tickets/day after a pricing change brought a wave of billing questions. Median first-response time hit four hours. CSAT dipped.
Hiring was slow. They needed automation that made agents faster, not a bot that talked to customers unsupervised.
The problem
Every ticket arrived as unstructured text. Agents manually:
- Read the ticket and guess intent (billing, bug, onboarding, escalation)
- Looked up the account in three internal tools
- Searched the knowledge base for the right macro
- Personalized the macro and sent
Steps 1–3 took 6–10 minutes per ticket. Macros were stale. Escalations landed in the wrong queue one time in nine.
Architecture
Zendesk webhook (new ticket)
→ Classify intent + urgency (structured JSON)
→ Fetch account context (API)
→ Retrieve relevant KB articles (hybrid search)
→ Draft reply (LLM)
→ Present draft in agent sidebar (Zendesk app)
→ Agent edits / approves / rejects
→ Log diff for prompt refinement
No ticket was sent without agent approval in v1. Two low-risk intents (password reset, invoice lookup) earned auto-send in v2 after review.
Implementation phases
Phase 1 — Classification only (2 weeks)
They trained the team on nothing — instead, they built a 200-ticket labeled set from historical tickets and used GPT-4.1 mini with structured outputs:
{
"intent": "billing_dispute | bug_report | onboarding | account_access | escalation",
"urgency": "low | medium | high",
"confidence": 0.0–1.0,
"suggested_queue": "tier1 | tier2 | billing_specialist"
}
Tickets with confidence < 0.75 routed to a human triager. Accuracy on the holdout set: 94%. Misroutes: 3.2%.
Phase 2 — Draft replies (4 weeks)
For the top five intents (covering 60% of volume), the pipeline added:
- Account tier, MRR, and last 3 ticket summaries from Postgres
- Top 3 KB articles via hybrid search
- A draft reply in the agent's voice guidelines
Agents saw the draft in a Zendesk sidebar app. One-click insert, edit, send. Acceptance rate started at 41% and climbed to 67% over six weeks of prompt iteration.
Phase 3 — Selective auto-send (week 8+)
Password reset and invoice-link requests hit 97% draft acceptance after review. Leadership approved auto-send for those intents only, with a post-send audit sample of 5%.
Results
| Metric | Before automation | After 8 weeks |
|---|---|---|
| Median first-response time | 4.0 hours | 12 minutes |
| Tickets handled/agent/day | 38 | 61 |
| CSAT (support) | 3.6 / 5 | 4.1 / 5 |
| Escalation misroutes | 11% | 3.2% |
Agents reported the biggest win wasn't the draft — it was automatic account context. "I used to have four tabs open before I could write a sentence."
Observability
Every LLM call went through Langfuse with:
- Intent label vs. agent override
- Draft text vs. sent text (diff)
- Time-to-first-response per ticket
- Cost per ticket (~$0.04 average)
Weekly reviews focused on rejected drafts and large diffs — those became prompt changelog entries.
What they'd do differently
- Label 200 tickets before writing any code — they built the classifier twice because the first label schema was too granular.
- Instrument agent overrides from day one — the diff logs were the best training signal they had.
- Set CSAT as a guardrail metric — they almost auto-sent billing disputes in v2; a one-week CSAT dip stopped it.
Takeaway
Support automation isn't about replacing agents — it's about removing the 10 minutes of lookup before the agent can be helpful. Classification + context + draft, with a human approving every customer-facing word, was the pattern that actually shipped in a regulated industry.
Lessons learned
- 01
Human-in-the-loop was non-negotiable for fintech — agents edited or rejected 33% of drafts, but even rejected drafts saved research time by surfacing the right account data.
- 02
Intent classification with structured outputs (JSON schema) was more reliable than free-form labels — misroutes dropped from 11% to 3.2%.
- 03
Pulling the last 3 support interactions + account tier into context beat a generic knowledge-base-only approach for personalized drafts.
- 04
They logged every draft→sent diff in Langfuse and used the diffs to refine prompts weekly — the highest-ROI improvement loop.
- 05
Fully automating 'password reset' and 'where is my invoice' replies (no agent review) worked only after 200+ reviewed examples proved >95% accuracy.
Frequently asked questions
Related on AIKnowHub
Concept
Guardrails & Output Validation
LLMs don't come with guarantees. Guardrails and output validation are how you enforce safety, structure, and policy on probabilistic outputs before they reach users.
Concept
LLM Observability in Production
You can't debug what you can't see. LLM observability means tracing every prompt, token, latency spike, and failure — here's the production stack.
Concept
Structured Outputs Explained
Structured outputs make models return valid JSON every time — no more parsing failures, no more 'almost JSON.' Here's how they work and when to use them.
Tool Guide
Langfuse Guide
The definitive guide to Langfuse for LLM observability — traces, prompt versions, evals, cost tracking, self-host setup, and when to pick it over Braintrust or Phoenix.
Tool Guide
Make Guide
The definitive guide to Make (Integromat) for AI automations — routers, iterators, Claude modules, pricing, and when to pick it over Zapier or n8n.
Workflow
Build an AI Docs Chatbot
A RAG-powered chatbot that answers questions from your documentation with citations — the kind every SaaS site needs in 2026.