Business

The Response-Time Budget: Setting a Target Before You Measure

Antonio Evans11 min read

A simple three-row table on a whiteboard.
Key points

Key points

  1. 1A response-time measurement means nothing until you have written down, per escalation class, what number counts as acceptable before you start measuring.
  2. 2Set targets from the cost of waiting: payment paths get the tightest budget because a blocked charge loses revenue and invites duplicate charges, account access is looser because nothing is lost, and general support is loosest of all.
  3. 3Use two numbers per class, a median (P50) for the typical case and a 95th percentile (P95) for the tail, because an average hides the slowest fifth of tickets.
  4. 4Compare a measured value against the target for the same class and the same percentile, then report pass or fail per class rather than one blended number.

Why the target has to exist before the measurement

A stopwatch with nothing to compare against produces trivia. If you measure a median first response of nine minutes across all tickets, the number is neither good nor bad until you know which tickets it covers and what waiting costs. Teams that skip this step end up in one of two dead ends: they celebrate a number that is fine for password resets but catastrophic for a failed card charge, or they panic about a number that is comfortably inside a reasonable budget.

Service design already carries this idea. A service catalog entry is expected to state the service levels in place, meaning the expected response and fulfillment times for that service, not just what the service does (Superblocks). The catalog is a promise, and a promise without a number is a slogan. Incident tooling encodes the same principle: escalation policies are ordered rules that notify a single target at a time until someone acknowledges, and the "escalates after" value is the window a responder has to act before the incident moves on (PagerDuty). You cannot write that rule without deciding what "too slow" means.

The distinction between an SLA and a service level target matters here. An SLA is a document outlining service expectations between an organization and its provider, while a service level target is a specific, measurable objective set for a particular aspect of a service (Giva). Most internal teams need targets, not contracts. Targets are what you measure against; contracts come later, if at all.

Three measurement choices have to be fixed in the same document, before any data arrives:

  1. Start clock. The moment the user's signal enters a system you control (ticket created, chat opened, payment webhook failed), not the moment a human noticed it.
  2. Stop clock. The first acknowledgment by a human or by an automated responder acting with authority, for example a bot that has already retried the charge or reset the credential. An auto-reply that says "we received your message" is not an acknowledgment.
  3. Calendar. Clock hours or business hours. A business-hours target can mean next-day in practice if a ticket lands at 5pm Friday (EmailAnalytics). Pick one and state it on the target sheet.

Fix those three and you have a measurable definition. Skip them and two teams will report different numbers from the same queue and spend the review arguing about methodology.

Build the three-class budget from the cost of waiting

The mistake is to give every ticket the same target. Cost of waiting is not uniform, so a single number forces you to choose between over-staffing the trivial and under-serving the expensive. Split incoming escalations into classes and price the wait for each.

Payment paths. A failed charge, a declined renewal, a stuck refund, a checkout that did not complete. Waiting costs money directly and, worse, invites a second attempt: the customer re-runs the card, the original charge settles after all, and now you owe a refund plus an apology. Duplicate-charge disputes are expensive to unwind and they damage trust at the exact moment money changes hands. Because the marginal minute is costly, the target is tight: a 2-minute median and a 5-minute 95th percentile.

Account access. Locked out, MFA device lost, SSO loop, permissions revoked by a role change. The user cannot work, but nothing is being lost or double-charged while they wait. A short wait is annoying, an hour is tolerable if the person can go get coffee or use a colleague's machine. Because the cost of waiting is productivity rather than money, the target is looser: an 8-minute median and a 20-minute 95th percentile.

General support. How-do-I questions, feature requests, small bugs, complaints that are not blocking anything. Nobody is losing revenue or being locked out. Waiting an hour costs goodwill, not cash. Target: a 30-minute median and a 2-hour 95th percentile.

ClassExamplesWhat waiting costsMedian target95th percentile target
Payment pathsDeclined charge, stuck refund, incomplete checkoutRevenue, duplicate charges, disputes2 min5 min
Account accessLocked out, MFA lost, SSO loopLost working time, no financial loss8 min20 min
General supportHow-to questions, requests, minor bugsGoodwill only30 min2 hours

Two properties of this table matter more than the exact minutes. First, the ratios are deliberate: payment paths are four times tighter than access and fifteen times tighter than general support at the median. If your staffing plan cannot deliver that separation, you have a routing problem, not a target problem. Second, the tail targets are short multiples of the medians, not open-ended. That is what makes them usable as escalation triggers: a payment ticket still unacknowledged at five minutes is, by definition, in the worst 5 percent and should page a second line immediately, which is exactly what an ordered escalation policy with a short timeout is for (PagerDuty).

Industry guidance lines up with the loose end of this scale. Common channel targets are under 2 minutes for live chat, under 4 business hours for email, and within 24 hours for social (Crisp). A 30-minute median for general support sits comfortably inside those norms while being far tighter than the cross-industry average email reply of 12 hours and 10 minutes reported from a 2018 SuperOffice test of 1,000 companies (EmailAnalytics). Note what that benchmark says: average practice is not a target, it is a warning.

If you run a multi-tier support operation, the same pricing logic tells you where to spend. Fast first response changes outcomes: companies that reply to inquiries within 5 minutes are reported as 21 times more likely to qualify a lead than those waiting 30 minutes (EmailAnalytics). That is a revenue argument for pulling payment-adjacent conversations into the tight class, not an argument for tightening everything.

Why two numbers per class, and why the percentile is P95

Response times are skewed. A handful of tickets wait hours while most are answered in minutes, and skew breaks averages in both directions: one four-hour ticket can drag a mean above the median, and a mass of instant bot acknowledgments can pull a mean below what any human actually experiences. The median tells you what a typical ticket sees; the percentile tells you what the slow tail sees. Averages, by contrast, may not correspond to any real request at all (Aerospike).

Percentiles are the standard way to state a tail without being hostage to a single outlier. If a metric is set at the 95th percentile, then 95 percent of requests finish under that value and the slowest 5 percent exceed it; higher percentiles like P99 drill deeper into the rare worst cases (Aerospike). You could pick P99. For a support queue, P95 is usually the better operating point for three reasons.

  • At support volumes, P99 is a tiny sample. A queue handling 200 escalations a day produces two P99 cases; a bad hour on a single subject line can move the number.
  • P95 matches the escalation trigger you can actually run. It is the "worst reasonable case" that justifies paging a second line, not a once-a-month curiosity.
  • Tail effects compound across steps. If a workflow needs several calls or handoffs to complete, the chance that every step lands in its fast zone falls quickly, so a modest tail target at each step still produces a noticeable tail end to end (Aerospike).

Track mean time to acknowledgment alongside the distribution, because the metric names are already established. Splunk's list of incident response metrics includes mean time to acknowledge (MTTA) next to mean time to detect and mean time to resolution, and it treats them as the family of numbers that describe how quickly an organization notices, understands, and fixes a problem (Splunk). Use the mean as a companion, never as the target: report "median 9, P95 14, mean 12" and you have described the queue. Report only the mean and you have described nothing.

MetricWhat it answersUse it forDo not use it for
Median (P50)What a typical ticket experiencesPrimary target per classJudging the tail
95th percentileHow bad the slow fifth isSecondary target and paging triggerDay-to-day staffing tweaks
Mean (MTTA)Total waiting divided by ticketsTrend and comparison across periodsSetting or passing a target

A worked example where the median passes one class and fails another

Take a support organization with a single blended queue and one number on the dashboard. Over a week it handles 240 escalations: 120 payment path, 60 account access, 60 general support. Someone runs the report and finds a median first acknowledgment of nine minutes. Blended, that looks like a healthy number. Under the three-class budget it is a mixed verdict.

ClassTicketsTarget medianMeasured medianVerdictTarget P95Measured P95Verdict
Payment paths1202 min9 minMiss by 7 min5 min14 minMiss
Account access608 min9 minMiss by 1 min20 min14 minPass
General support6030 min9 minPass by 21 min2 hours14 minPass

Read the two failing rows carefully, because they call for different responses.

Payment paths fail badly at both percentiles. A nine-minute median means the typical blocked charge waits more than four times its budget, and a 14-minute P95 means roughly 6 of the 120 payment tickets in the week waited past two-thirds of the two-hour general target. The fix is structural: payment tickets need their own routing rule that bypasses the general queue and pages on a five-minute timeout, plus an automated first action (retry the charge, check settlement status) that counts as acknowledgment under your definition. Tightening the general queue will not help; the payment tickets are sitting behind it.

Account access fails narrowly at the median and passes at the tail. A one-minute median miss with a comfortable P95 says the class is mostly fine and one recurring cause is stretching the typical case, for example an MFA reset that requires a manual step during business hours. Thin the median by automating the most common access request; leave the tail alone.

General support passes both and that is not entirely good news. A nine-minute median against a 30-minute target means the class is being answered far faster than required, which usually means expensive responders are spending time on cheap tickets. That is the class to slow down deliberately: deflect with self-service, point users at the catalog, and redeploy the recovered minutes to payment paths. A service catalog that presents services in plain language with clear request procedures is the standard mechanism for exactly this kind of deflection (ManageEngine).

Run the blended average through the same week and it lands somewhere near nine minutes, identical to the payment median and meaningless for both classes. That is the whole argument for class-level targets in one line: the blended number hides a seven-minute miss on the class that costs money behind a 21-minute surplus on the class that does not.

Watch the acknowledgment window, not just the first reply

The moment you set a five-minute P95 for payment paths, every acknowledge-only workflow becomes an exposed edge. An acknowledgment stops escalation, so a responder who taps "ack" at minute four and then does nothing has met the target and left the customer waiting. Acknowledgment is a claim of ownership, not a fix; the incident lifecycle continues until resolution or the underlying condition clears (PagerDuty).

Design the window so the claim has to be honored. A practical pattern for a payment-path policy:

  • Rule 1: page the payment on-call immediately. Timeout 3 minutes.
  • Rule 2: page the secondary and the team lead. Timeout 3 minutes.
  • Rule 3: page the engineering manager and open a severity-1 record.

Then pair it with two counters: acknowledged-then-idle time (the gap between first ack and the first substantive action) and reopen rate on acknowledged tickets. If acknowledged-then-idle time exceeds the class median, your responders are acknowledging to clear the page. That is an incentive problem in the policy, not a discipline problem in the team, and the fix is to move the escalation trigger from acknowledgment to the first substantive action for that class. Escalation design guidance makes the same point from the other side: the delay before escalating, the number of levels, and who sits at each level are all knobs you can set deliberately, and reviewing missed escalations is part of keeping the policy honest (incident.io).

The same logic applies to AI responders. An automated first reply only counts toward the target if it can complete the common action (retry, unlock, re-issue) or bind a named human to the ticket. Where a bot cannot act with authority, keep its messages out of the acknowledgment metric and let the human clock run, so you do not launder a missed target into a passing one.

Turn the comparison into a repeatable check

The comparison itself should be small enough to put in a script, so nobody renegotiates the target during review. Read from data that already exists: ticket timestamps, class label, channel, and the identity of whichever party (human or agent) acknowledged.

TARGETS = {
    "payment": {"p50": 2,  "p95": 5},
    "access":  {"p50": 8,  "p95": 20},
    "general": {"p50": 30, "p95": 120},
}

def percentile(sorted_vals, p):
    k = (len(sorted_vals) - 1) * (p / 100.0)
    lo, hi = int(k), min(int(k) + 1, len(sorted_vals) - 1)
    return sorted_vals[lo] + (sorted_vals[hi] - sorted_vals[lo]) * (k - lo)

def verdict(tickets, minutes_field="ack_minutes", cls_field="class"):
    out = {}
    for cls, rows in group_by(tickets, cls_field).items():
        vals = sorted(t[minutes_field] for t in rows)
        p50, p95 = percentile(vals, 50), percentile(vals, 95)
        t = TARGETS[cls]
        out[cls] = {
            "n": len(vals),
            "p50": p50, "p50_pass": p50 <= t["p50"],
            "p95": p95, "p95_pass": p95 <= t["p95"],
            "mean": sum(vals) / len(vals),  # report, never gate on this
        }
    return out

Three rules keep the check meaningful.

Gate on percentiles, report the mean. The weekly review passes or fails per class on P50 and P95. The mean goes on the chart as context.

Show the count next to every number. Tiny segments produce violent percentiles. Define a minimum sample size per class, and below it report the raw list instead of a percentile (Crisp). Then fix the sampling before you draw conclusions.

Re-derive from raw timestamps after any change to classification. The class label drives everything, so a routing rule that newly sweeps refund requests into payment paths will move both the numbers and the verdicts in the same week. Log the label alongside the timestamps, and keep the label history, so a comparison against last month compares like with like. That is the same discipline audit and observability practices apply to any automated decision: record the inputs and the decision at the time it was made, not reconstructed later (Latitude).

If you are using an AI agent to triage and acknowledge, the budget applies to it as well, and the same logging discipline decides whether it is working. The structured telemetry expectation for agent activity is that every action is tied to an identity and a policy check, so you can answer which agent acted, under whose authority, and why (LoginRadius). For triage, the minimum is: the class the agent assigned, the model and version that made the call, the action taken, and the timestamp. Without those fields, an agent that acknowledges in seconds looks like a passing target while quietly mislabeling payment tickets as general support.

When triage spans several models or you want one key for a fallback chain, a gateway helps: Quanta Inference puts text, image and embedding models behind one OpenAI-compatible key (https://quantaintelligence.ai/inference). Whatever you route through, the metric stays the same. Only the label and the timestamp count.

FAQ

FAQ

What is a response-time budget?

A response-time budget is a target you write down per escalation class before you measure anything: which events start and stop the clock, whether the clock runs in business or clock hours, and the median and 95th percentile each class must meet. It converts measurement from an exercise in looking at numbers into a pass-or-fail test. The target is a service level target, a specific measurable objective, rather than a contract, which is what an SLA is (Giva).

Why set targets per class instead of one number for all tickets?

Because the cost of waiting differs by an order of magnitude between a blocked payment and a how-to question. One number forces you either to over-staff the cheap class or to under-serve the expensive one, and a blended median then hides a serious miss on the expensive class behind a comfortable surplus on the cheap one. The worked example in this article shows a nine-minute median missing the payment target by seven minutes while passing the general target by 21.

Should the target use the average or a percentile?

Set the target on the median and the 95th percentile, and report the average as context only. Averages are pulled by a single multi-hour ticket and may not correspond to any real request, while the median shows the typical case and P95 shows the slow tail (Aerospike). Track mean time to acknowledge alongside them because the metric is already standard, but do not gate on it (Splunk).

What actually counts as an acknowledgment?

An acknowledgment is the first action by a human, or by an automated responder acting with authority, that takes ownership of the issue: retrying a charge, resetting a credential, or binding a named person to the ticket. A promise to look into it does not qualify. This definition matters because acknowledging an incident stops escalation, so a careless ack meets the response target and can leave the underlying problem untouched (PagerDuty).

How do the targets connect to escalation rules?

The 95th percentile target sets your escalation timeout. If payment paths must be acknowledged in five minutes at P95, the first rule's timeout should be short enough to page a second line before the budget expires, for example three minutes. Escalation policies notify single targets in order until someone acknowledges, so the timeout values are the operational expression of the budget (PagerDuty). Keep the two documents in sync, and review missed escalations whenever a class fails two weeks running (incident.io).

Sources

Sources

  1. Service Catalog Management: Examples, Best Practices & ...
  2. Escalation Policy Basics
  3. 10 Exceptional IT Service Catalog Examples
  4. Customer Service Response Time Standards by Industry ...
  5. 10 proven ways to improve customer service response time ...
  6. What Is P99 Latency? Understanding the 99th Percentile of ...
  7. Top 8 Incident Response Metrics To Know
  8. ITIL service catalog guide: ITSM examples and templates
  9. Escalation policy best practices: designing ...
  10. Audit logs in AI systems: What to track and why - Latitude.so
  11. Auditing and Logging AI Agent Activity: A Guide for Engineers
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