Ticket-routing model — handoff
What ticket-router-v4 does, where it is measured to work, and the conditions under which another team can reuse it.
Assumptions
The card
The model assigns one of 12 support queues to an inbound ticket from its subject and first message. It runs on CPU inside the ticket-router service and returns a queue plus a confidence score. Reuse means deploying the same weights against your inbox, not retraining; retraining is a separate project.
- Route an inbound ticket to one of 12 support queues at intake
- Suggest a queue to a triage agent when confidence is below the auto-route threshold
- Any language other than English and Spanish
- Tickets with an attachment as the only content
- Priority or severity scoring
- Any customer-facing decision (refund, closure, escalation)
- 620k tickets from the support inbox, 2024-03 to 2026-05, PII scrubbed, queue label from the final human assignment
- 14k held-out tickets from 2026-06 as the test split, same label source
| Metric | Value | Split | Note |
|---|---|---|---|
| Macro F1 | 0.89 | test | |
| Accuracy | 0.93 | test | |
| Auto-route coverage | 71% | prod | share of tickets at confidence >= 0.85 |
| Auto-route accuracy | 0.97 | prod | measured on the 71% auto-routed |
| Latency p95 | 62 ms | prod | CPU, batch 1, 4 vCPU |
- Confuses Billing and Refunds on tickets under 20 words
- Accuracy drops to 0.81 on tickets forwarded from a partner mailbox because the signature dominates the text
- Trained on the queue set of one inbox; a new queue needs a retrain, not a config change
- Input text may contain PII; the service logs only the queue and the score, never the text
Where it works and where it does not
Per-queue numbers decide reuse more than the macro score. Three queues carry most of the errors, and all three exist because the human labels themselves disagree on the boundary. If your inbox has the same boundary, expect the same errors.
Per-queue performance on the 2026-06 test split
| Queue | Share of tickets | F1 | Most common confusion |
|---|---|---|---|
| Billing | 18% | 0.84 | Refunds |
| Refunds | 9% | 0.82 | Billing |
| Login and access | 16% | 0.95 | Account changes |
| Account changes | 8% | 0.88 | Login and access |
| Shipping | 14% | 0.94 | Order status |
| Order status | 11% | 0.91 | Shipping |
| Product defect | 7% | 0.92 | Returns |
| Returns | 6% | 0.9 | Product defect |
| Partner and reseller | 3% | 0.81 | Billing |
| Legal and privacy | 2% | 0.93 | Account changes |
| Feedback | 4% | 0.87 | Product defect |
| Other | 2% | 0.76 | Feedback |
F1 per queue; share is the fraction of test tickets with that label.
How a ticket moves through the router
The confidence threshold is the only tunable that changes behaviour without a retrain. Lowering it raises coverage and lowers auto-route accuracy; the 0.85 setting was chosen so that auto-routed errors stay under the triage team's 3% re-route budget. Tickets the model cannot score at all go to triage with no suggestion, and that path fires on about 0.4% of traffic.
Intake path for one ticket
Reuse test
Run this list against your inbox before you commit. Two or more fails mean the model is not a fit as shipped. A retrain on your labels is the smaller project only if you already hold six months of human-assigned queue labels.