Founders

How to Set a Minimum Accuracy per Ticket Category

Antonio Evans11 min read

A support manager's desk with a printed ticket volume report by category, a calculator showing a weighted average, and a whiteboard with a formula linking accuracy to service level.
Key points

Key points

  1. 1Start from the service level you promise, then work backward to the maximum error rate each ticket category can tolerate.
  2. 2Convert that maximum error rate into a minimum accuracy with a simple subtraction, and weight the results by ticket volume.
  3. 3Use the standard error of a proportion to prove that a measured accuracy is distinguishable from the threshold before you either panic or relax.
  4. 4Adjust thresholds on a fixed decision rule driven by service performance, not on opinion or a single bad week.

Start from the service level, not from the model

Most teams set accuracy targets by copying a vendor deck or picking a round number. That is backwards. The number that matters is the one your customer promise implies. If you promise that 95 percent of tickets are resolved within 24 hours, then your classification errors are only interesting to the extent that they break that promise.

The first step is to write down the service targets in plain numbers. A typical set looks like this:

Service targetPromiseWhat a classification error does to it
First response time90% of tickets answered within 1 hourWrong queue adds a re-route delay
Resolution time95% of tickets resolved within 24 hoursWrong queue can add a full working day
Escalation accuracy99% of urgent tickets flagged as urgentA missed urgent ticket is a real incident
Auto-reply correctnessNo wrong answer reaches a customerA wrong reply is visible and costly

Those four lines behave very differently under error, and that difference is the whole basis for per-category thresholds. As one practitioner guide puts it, the cost of a mistake is not uniform: routing errors are cheap because an agent reassigns the ticket and loses minutes, while an automatic reply that is wrong reaches the customer with your name on it Precision Federal. That single insight reshapes the arithmetic. You are not buying one accuracy number. You are buying a different number for each thing that happens after classification.

Before you compute anything, check that your categories are learnable. The same guide recommends taking 300 tickets and having two experienced agents label them independently: if they agree 90 percent or more of the time, the taxonomy is sound, and if they agree 70 percent, any model will hit roughly that same ceiling because you are asking it to reproduce a judgment people do not make consistently Precision Federal. No threshold survives a taxonomy that humans cannot apply reliably. Measure human agreement first, then treat it as the ceiling for your minimum accuracy.

Define what an error costs in service terms

Accuracy as a raw number hides the failures you care about. A system can be 99 percent accurate and still produce 100 wrong actions a day at volume, which is the point made in a survey of accuracy metrics for AI evaluation Galileo. The fix is to convert errors into service outcomes.

Do this per category, with three inputs:

  1. The volume. How many tickets per period does this category handle? Use a real export, not an estimate.
  2. The service-criticality. What fraction of errors in this category actually causes a breach of the promise? A misrouted billing ticket is usually caught by the customer or the agent; a misrouted safety report is not.
  3. The recovery path. If an error is caught, how much time does recovery add? A re-route costs minutes. A wrong auto-reply costs a correction plus trust.

The second input is the one people skip, and it is the one that does the work. Not every classification error breaches the service level. If a ticket lands in the wrong queue but the queue is still a customer-service queue and an agent sees it within the first-response window, the promise holds. The error matters only when it pushes the ticket past the target. Call that fraction the breach rate, and estimate it from your own history by sampling 100 to 200 resolved tickets per category, as recommended when building an evaluation set from real conversations Ertas.

That source also warns that models evaluated on clean synthetic test sets score 8 to 15 percentage points higher than the same models evaluated on real production data. Use real tickets for the breach-rate estimate, or your thresholds will be built on a number that does not exist in production.

The arithmetic: from promise to minimum accuracy

Now the formula. For a single category:

allowed_breaches   = category_volume * (1 - service_target)
max_error_rate     = allowed_breaches / (category_volume * breach_rate)
min_accuracy       = 1 - max_error_rate

Which simplifies to:

max_error_rate = (1 - service_target) / breach_rate
min_accuracy   = 1 - (1 - service_target) / breach_rate

This is the decision rule in one line. The category's volume cancels out, which surprises people. It cancels because both sides of the ratio scale with volume. Volume only matters when you combine categories into an overall figure.

A worked example. Suppose you promise that 95 percent of tickets in a period are resolved within 24 hours, so the target is 0.95 and the allowed breach share is 0.05.

CategoryMonthly ticketsBreach rate (errors that actually breach)Max error rateMinimum accuracy
Access and login4,0000.800.062593.75%
Billing dispute2,0000.500.1090.00%
Feature request1,5000.200.2575.00%
Outage report5000.950.052694.74%
Total8,000

Read the second row out loud. A billing dispute that goes to the wrong queue breaches the 24-hour promise half the time, so you can afford a 10 percent error rate, which means 90 percent accuracy is enough. A feature request routed to the wrong team still gets an answer inside 24 hours four times in five, so you can tolerate 25 percent error, and 75 percent accuracy meets the promise.

Now check the aggregate. The allowed breaches across all categories are 8,000 times 0.05, which is 400 tickets. Each category's error budget is its volume times its maximum error rate: 4,000 times 0.0625 equals 250; 2,000 times 0.10 equals 200; 1,500 times 0.25 equals 375; and 500 times 0.0526 equals about 26. That sums to 851 allowed errors. But only 851 times the weighted breach rate breaches the promise, and since the breach rates differ by category, the aggregate has to be computed error by error, not as a single average accuracy.

This is the part first search results miss. The weighted average accuracy across the four categories is about 88.9 percent, comfortably below the 95 percent service target, and yet the promise still holds, because most errors land in categories where errors are cheap. If you had set a flat 95 percent accuracy floor on every category, you would have spent review capacity on feature requests that did not need it and starved the outage queue. Set the floor from the promise, per category, and the aggregate takes care of itself.

For a stricter promise, the same arithmetic tightens fast. At a 99 percent resolution target, the allowed breach share is 0.01, so the outage category with a breach rate of 0.95 needs 98.95 percent accuracy, while the feature request category needs 95 percent. Note what happened: the cheap-error categories moved least. That is the decision rule working as intended.

Prove the threshold is measurable before you enforce it

A threshold is only useful if the measurement can tell you whether you crossed it. Accuracy is a proportion, so it carries sampling noise. The standard error of a proportion is the square root of p times (1 minus p), divided by n Statology. The normal approximation behind it is adequate when n times p times (1 minus p) is at least 3 San Jose State, and a confidence interval around the estimate is the sample proportion plus or minus z times the standard error Statology.

Use it as a sizing tool. For the outage category, suppose you sample 200 tickets and the model is right on 186 of them. Accuracy is 0.93, the standard error is the square root of (0.93 times 0.07) divided by 200, which is 0.018, and the 95 percent interval, using a z of 1.96 Statology, runs from 0.895 to 0.965. Your threshold is 0.9474. The interval straddles it, so you cannot yet tell whether the system clears the bar. At 500 tickets the half-width shrinks to roughly 0.012, and the question becomes answerable. The arithmetic for the interval is the same one a basic proportion confidence interval calculator performs Sample Size Calculators.

The mirror image is a sample size question. If you want a margin of error of plus or minus 0.05 at 95 percent confidence, the planning formula gives roughly 400 observations when you assume maximum uncertainty, and about 300 if you assume the true proportion is 0.25 San Jose State. Survey calculators make the same point: a 5 percent margin at 95 percent confidence needs around 383 respondents when the population is large, and a 3 percent margin needs about 2,345 Select Statistical Services. Decide the margin you need to distinguish your threshold from the true rate, then size the review sample accordingly, and remember that when the population is small relative to the sample the requirement shrinks Survey Calculator.

One more check specific to classification. Accuracy can be misleading when classes are imbalanced: a naive classifier can score 95 percent on a dataset that is 5 percent positive simply by labeling everything negative Galileo. Ticket categories are exactly this shape. Outage reports are rare, so a model that never predicts an outage can still look accurate overall. That is why the outage category gets a recall-first threshold on the urgent class specifically, as the same guide recommends, and why raw accuracy is a poor gate for the rare categories Galileo. For a rare category, set the threshold on recall for that class and accept a higher false-positive rate, because over-flagging is far cheaper than under-flagging Precision Federal.

Here is the full calculation as a small script you can port to a spreadsheet:

import math

def min_accuracy(service_target, breach_rate):
    return 1 - (1 - service_target) / breach_rate

def interval(correct, n, z=1.96):
    p = correct / n
    se = math.sqrt(p * (1 - p) / n)
    return p, (p - z * se, p + z * se)

for name, vol, breach in [
    ("access", 4000, 0.80),
    ("billing", 2000, 0.50),
    ("feature", 1500, 0.20),
    ("outage", 500, 0.95),
]:
    print(name, round(min_accuracy(0.95, breach) * 100, 2))

print(interval(186, 200))

Run it and you get the table above plus an interval of roughly 0.895 to 0.965, which is the same conclusion the arithmetic gave by hand.

Decide when to move a threshold

Thresholds should not be frozen, and they should not drift with every complaint. Use a fixed decision rule with three triggers.

Trigger one: standing service data. Compare the measured breach share for a category over a rolling period against the allowed share. If the measured breach share exceeds the allowed share for two consecutive periods, tighten the category's minimum accuracy. If it is below the allowed share for two consecutive periods and the interval clears the threshold, relax it by one step. Two periods, not one, because a single window is noisy, as the standard error already showed you.

Trigger two: the interval over the threshold. Before you tighten, check that the measured accuracy is statistically below the floor. The interval formula above is the test. If the interval contains the threshold, the honest answer is that you do not know, and the correct action is a larger review sample, not a model change.

Trigger three: taxonomy change. Any change to the category list invalidates the accuracy test, because a category that was merged or split now measures something different Ploch. Treat a taxonomy edit as a reset, re-run the human agreement check, and recompute the breach rates before the next measurement.

SituationAction
Breach share above allowed for two periodsLower the minimum accuracy for that category
Accuracy interval entirely above the floorAllow a relaxation of one step
Accuracy interval straddles the floorIncrease the review sample, decide nothing
Category split or mergedRe-run human agreement, then recompute from scratch
Volume shift of more than 25 percent in a categoryRecompute the aggregate, not the per-category floor

That last row deserves a note, because it is where the decision rule earns its keep. If the outage category grows from 500 to 1,000 tickets a month, its per-category minimum accuracy does not move, since volume cancelled out of the formula. The overall promise gets harder to keep, though, because cheap-error categories now make up a smaller share of the mix. The right response is to check capacity in the expensive categories, not to raise their accuracy floors. Raising the floor spends effort on the part of the system that was already working.

If you are still deciding where classification sits in the workflow, or you want a review-set built from your own ticket export before you commit to thresholds, a short scoping conversation is often faster than a spreadsheet you build alone. You can book a free 30-minute discovery call to map your service targets to per-category thresholds with a specialist: Quanta Consulting. And when the thresholds exist and you need one endpoint to run the classifier across chat, email and voice transcripts without stitching providers together, Quanta Inference offers text, image, video, audio and embedding models through one API key.

Common traps and how to avoid them

The most expensive trap is setting one accuracy number for the whole system and reporting it weekly. It satisfies a dashboard and tells you nothing, because it averages a cheap error with an expensive one. The second trap is measuring on a clean test set. A synthetic set reflects what you imagine the distribution looks like, not what it actually is, and it overstates performance on the categories that matter Ertas. Pull the measurement from production tickets, and keep the edge cases in a separate set rather than mixing them into the core score.

The third trap is evaluation that stops at launch. An offline score is a statement about a fixed dataset at a moment in time, and it says nothing about live traffic after a prompt or model change LaunchDarkly. If the judge or scoring method has its own error, the threshold is measured through a blurry lens; some studies of automated judges found the weakest of four frontier judges matched an expected score only 40 percent of the time on paraphrased responses, as reported in that same review LaunchDarkly. A practical habit is to keep a human-reviewed sample in the loop so the threshold is anchored to reality rather than to another model's opinion Confident AI.

The fourth trap is measuring one thing. A combination of code checks, model scoring, human review and production sampling covers failure modes that no single method catches Arize. For ticket classification the working set is small: an exact code check for the fields the form provides, a sampled human label for the ambiguous cases, and a live sample that confirms the queue routing actually happened.

Finally, tie the threshold to a check that is cheap to run every period. The formula is stable, the breach rates are not, so refresh them quarterly from a fresh sample of resolved tickets using the 100 to 200 ticket guidance Ertas. If you want to see how a real classifier is judged before you commit, the same sampling discipline applies to any classification task with an operational consequence Precision Federal.

FAQ

FAQ

What exactly is the minimum accuracy formula?

Minimum accuracy equals 1 minus the allowed breach share divided by the breach rate, where the allowed breach share is 1 minus your service target. The breach rate is the fraction of classification errors in that category that actually cause the promise to fail. Volume cancels out per category, which is why a cheap-error category can have a lower floor than an expensive one.

Why not set one accuracy target for all categories?

Because a single number averages cheap errors with expensive ones and hides both. A misrouted feature request usually still gets answered inside the promise, while a misrouted outage report often does not. Per-category floors put review and model effort where errors actually threaten the service level, and the weighted average then takes care of itself.

How large a sample do I need to verify a category meets its threshold?

Size the sample from the interval you need, not from a habit. A 5 percent margin at 95 percent confidence needs roughly 400 observations under maximum uncertainty, and a 3 percent margin needs far more. For a rare category, measure recall on that class specifically and accept a larger sample if the interval still straddles your floor.

Does a merged or split category reset the threshold?

Yes. Changing the category list changes what is being measured, so the previous accuracy test no longer applies. Re-run the two-agent human agreement check, recompute breach rates from a fresh ticket sample, and recalculate the minimum accuracy for every category the change touches.

How often should I revisit the thresholds themselves?

Recompute breach rates quarterly from resolved tickets, and apply the decision rule continuously: tighten after two periods of breach share above the allowed level, relax only when the accuracy interval clears the floor. Taxonomies and volumes move; the formula does not, so keeping the inputs fresh is what keeps the thresholds honest.

Sources

Sources

  1. Classifying Support Tickets - Precision Federal
  2. Accuracy Metrics for AI Evals From F1 to Agents
  3. Build an Eval Dataset from Real Conversations
  4. Standard Error of the Proportion: Formula & Example - Statology
  5. Inference for a Proportion
  6. Confidence interval for a proportion
  7. Sample Size - Population Proportion
  8. Sample Size Calculator and Confidence Interval - IdSurvey
  9. Ticket automation: categories and an accuracy test
  10. LLM Evaluation: Tutorial & Best Practices
  11. LLM Evaluation Metrics: The Ultimate LLM Evaluation Guide
  12. LLM evaluation: methods, metrics, RAG & agent evals guide
About the author

About the author

Antonio Evans
Antonio Evans

Antonio Evans is the founder of Quanta Intelligence and a fractional CTO who builds HIPAA-ready AI systems for health and life-science companies. Before that he was technical co-founder of FriendsEAT for twenty years, CEO of Socialdraft, and a data engineer at IBM. Antonio lives with his dog Santino in Lisbon, Portugal.

All articles