Classify support tickets
Classification lives or dies on the label definitions and the escape hatch. Both are in this prompt.
When to use it
Routing at volume, where a wrong label costs more than an unrouted ticket.
What it prevents
Forced fits. Without an “other” category and permission to use it, every ticket gets a label — including the ones that belong in none of them. The confidence flag is what makes the output triageable.
The prompt
Classify the support ticket below into exactly one category.
### Categories
- billing — anything about charges, refunds, or invoices
- bug — the product behaved incorrectly
- howto — the product works, the user does not know how to use it
- other — none of the above fits
### Output format
Return JSON and nothing else: {"category": "string", "confidence": "high or low"}
### Requirements
- Use "other" rather than forcing a poor fit. A wrong label costs more than an unclassified ticket.
- Set confidence to low whenever two categories are plausible.
### Example
{"category": "billing", "confidence": "high"}
### Ticket
"""
I was charged twice for March and the second charge has not been refunded.
"""Instant checks
States a concrete task
PassedAvoids vague language
PassedSpecifies an output format
PassedAvoids dangling references
PassedIncludes an example
PassedSeparates data from instructions
PassedAvoids over-aggressive phrasing
Passed
Why each part is there
Every section of that prompt exists because a specific failure happens without it. These are the checks it passes, and what each one is protecting you from:
- States a concrete task — why this matters
- Avoids vague language — why this matters
- Specifies an output format — why this matters
- Avoids dangling references — why this matters
- Includes an example — why this matters
- Separates data from instructions — why this matters
- Avoids over-aggressive phrasing — why this matters
How to adapt this one
Rewrite the categories and their one-line definitions — the definitions carry the whole prompt — and always keep an “other” category with explicit permission to use it. Adapt the confidence flag to whatever your routing can act on. Without the escape hatch every ticket gets forced into a label, including the ones that belong in none, and a wrong route costs more than an unrouted ticket.
The mistake this prompt avoids
Offering categories with no “other” and no way to signal doubt. The model, told to pick one, always picks one — even for the ticket that fits none of them — and does it with the same confident tone as the easy cases. The “other” bucket and the low-confidence flag are what make the output triageable instead of uniformly certain and occasionally wrong.
A variation
Classifying into many labels rather than a handful? Switch from one category to a ranked top-three with confidence on each, and route the low-confidence ones to a human. Fine-grained taxonomies have genuinely ambiguous cases, and a single forced label hides the ambiguity a shortlist would have surfaced to someone who could resolve it.
Check your version
Once you have adapted it, run it through the checker. The same nine checks that graded this page will grade yours, free and in your browser — paste it in, or build one from scratch by answering a few questions.