River
Y CombinatorBacked by Y Combinator
FREE TEMPLATE

Internal Service SLA Template

Three documents and three sheets that set a response target for every request type from what your team has actually delivered, not a guess.

Free download  ·  No account needed

SLA Target by Request Type

Bramwell Foods, Data & Reporting team, 175 requests this quarter

Old targetOne flat 16-hour promise for every request type
Old breach rate37.1% overall — 0% to 100% depending on type
New targetEach type's own 80th percentile response time

Same quarter, five targets instead of one

Request typeOld flat target, 16hNew targetNew breach rate
New report build100.0% breached85.8h21.1%
Dashboard change63.4% breached38.7h19.5%
Bug fix41.7% breached20.6h20.8%
Ad hoc data pull17.2% breached15.7h19.0%
Access request0.0% breached7.4h21.2%

Access requests never once breached the old target and get a tighter one. New report builds always breached it and get a longer one. Same 16 hours, opposite problem, for five request types nobody had actually separated.

Search this and every result assumes a support desk: priority tiers named Critical, High, Medium, Low, each with a response time chosen because it sounded proportionate for a customer-facing ticket. Internal SLAs use the exact same mechanics as customer-facing ones, carried over wholesale. That fits an IT helpdesk triaging incidents by urgency. It fits nothing about a data or reporting team fielding five completely different kinds of work, where a twenty-minute access grant and a four-day report build were never the same promise wearing a different label.

The best advice on page one gets halfway there: use your own current average response time as the baseline, then set the initial target slightly tighter than that. An average still blends every request type into one figure, and a right-skewed distribution's average sits well above where most requests actually finish, so the resulting target's real breach rate stays undisclosed. The same reasoning engineers use for latency targets applies here: a percentile shows the shape of a distribution; a single average obscures the tail entirely.

Bramwell Foods' three-person Data & Reporting team tested this on 175 real requests logged in one quarter. One flat 16-hour target for everything breached 37.1% overall, and that average hid the real story: 0.0% for access requests, 100.0% for new report builds. Five targets, each a type's own 80th percentile, produced a designed, disclosed 20.0% breach rate on every type at once, the same discipline a process map applies to queue time and the decision rights pack applies to an escalation.

Three sheets, from percentile to procedure

SLA Target by Request Type, Volume Trend, and Breach Log.

SLA Target by Request Type

All 175 requests this quarter, rolled up by type, with the real distribution behind each target.

TypenP50P80 (target)P95Old breachNew breach
Access request334.7h7.4h9.3h0.0%21.2%
Ad hoc data pull589.9h15.7h21.3h17.2%19.0%
Bug fix2413.1h20.6h28.4h41.7%20.8%
Dashboard change4120.4h38.7h54.5h63.4%19.5%
New report build1956.7h85.8h93.2h100.0%21.1%
Total17537.1%20.0%

The old target's average conceals a 100-point range. Access requests cleared it every time; new report builds never did once. Both facts vanish inside one 37.1% blended figure.

P80 becomes the published target for every type with enough volume to trust the percentile, here all five. A type under roughly fifteen closed requests would inherit a comparable type's target instead.

Volume Trend

Same 175 requests, split by month, the number that starts a capacity conversation before the queue forces one.

TypeMonth 1Month 2Month 3Total
Ad hoc data pull16192358
Dashboard change11141641
New report build56819
Access request9111333
Bug fix78924
Total485869175

Every type grew, not just one. Total volume rose 43.8% from month one to month three. A team holding its new targets on a shrinking staff against a rising queue is a staffing conversation with a number attached, not a complaint.

The same trend by type also shows which request kind is driving the growth, here ad hoc pulls and dashboard changes together account for over half of it.

Breach Log

A sample of misses against the new targets, logged going forward. One line, no blame, unless the reason repeats.

TypeTargetActualDeptReason
Dashboard change38.7h51.5hSalesTwo change requests landed on the same dashboard the same week
New report build85.8h100.0hOpsSource data needed a two-day backfill discovered mid-build
Access request7.4h11.2hSalesRequested access included pricing fields, routed to a security review
Bug fix20.6h28.4hFinanceFix required a schema change held for a release window
Ad hoc data pull15.7h21.0hOpsThe one analyst who owns this data source was out that week

Five rows, five different reasons. None repeats yet. The procedure only escalates a reason once it shows up three times in a rolling quarter, which is the difference between the expected one-in-five and an actual capacity problem.

13 breaches logged so far against 35 expected by construction (20% of 175). Below pace, which is itself worth watching for the opposite reason: are misses going unlogged.

What's in the pack

01

SLA Target by Request Type

Every request type's real P50, P80 and P95 response time from your own history, the old target's actual breach rate against the same data, and the new target's breach rate by construction. The comparison is computed, not estimated.

02

Why the 80th percentile, not the average

An average gets pulled around by the slowest outlier in the sample and blends request types that are not the same work. The 80th percentile of one type's own history is both achievable, since four in five past instances already cleared it, and honest about the fifth.

03

Volume Trend

Monthly request volume by type, so a rising queue shows up as a number before it shows up as a missed quarter. The same sheet says which request type is driving the growth, which is usually not the type anyone assumed.

04

Breach Log

One row per miss against the new targets, with a one-line reason and no individual review for a single occurrence. A reason code appearing three or more times in a rolling quarter is the one that gets pulled out and fixed.

05

Service Catalog

The request types defined precisely enough that classification doesn't drift between whoever is logging them, with what to include in a request so the clock starts on complete information instead of a follow-up question. A structured intake form is what actually gets that information captured on the way in.

06

SLA Definitions

The policy document stating each target, its derivation, and its expected breach rate in plain language, so the team publishing it and the department reading it agree on what the number actually promises.

07

Breach Procedure

What happens on a single miss (the requester gets a status update, the reason gets logged, nothing else) versus a repeated reason (a real review, routed to whichever side of the handoff the reason actually sits on).

How to use it

  1. 1

    Open in River, or download it

    Install the pack and hand River your request history, or download all three documents and three sheets blank and run the percentile calculation yourself.

  2. 2

    Send the request history

    A shared inbox, a Slack channel export, a spreadsheet log, or a ticketing tool export, with an open and close time on every request.

  3. 3

    Let the percentile set the target

    Every request type gets classified and its own P50, P80 and P95 computed. The 80th percentile becomes the published target for that type.

  4. 4

    Publish the definitions, log what's next

    The targets become the SLA Definitions, and every future request gets logged so next quarter's recomputation runs on real, growing history.

Frequently asked questions

Is this free, and what do I get?

Free, no signup needed for the download: three documents and three spreadsheets. The AI half is optional. Send River your request history and it computes the per-type percentiles and drafts the definitions for you. More in the template library.

Why not just set one target for everything, like two business days?

Because request types are not interchangeable units of work. In the worked example, one flat target breached 0% of the time for access requests and 100% of the time for new report builds. A number that is always right for one type and always wrong for another was never a real target.

Isn't a 20% breach rate too high for an SLA?

It depends entirely on where the target came from. Against an aspirational number, any breach looks like a failure. Against a chosen 80th-percentile target, a 20% breach rate is the design, stated up front, not a number to be embarrassed about or to quietly stop measuring.

What if a request type doesn't have enough history yet?

Under roughly fifteen closed requests, the percentile is too thin to trust. That type inherits the closest comparable type's target as a stated placeholder until it accumulates enough volume, rather than getting a number invented to fill the row.

How is this different from a customer support SLA?

Support SLAs segment by urgency tier, Critical through Low, because the underlying work is genuinely similar and only the stakes differ. Internal requests segment by type instead, because a bug fix and a new report build are different work regardless of how urgent either feels.

What does Edit with AI actually do?

Creates a free account, installs this exact pack as a private space, and primes the agent to read whatever request history you send. Nothing gets computed until you send something, and the blank pack is always there to download instead.

Set targets your team can actually hold

Take the documents and sheets blank, or install this pack in River and send it a quarter of your own request history.

Edit with AI