Most teams talk about reliability in feelings — 'the site's been flaky lately,' 'we should really be more stable' — and feelings don't survive a roadmap negotiation. The point of SLOs and error budgets is to turn reliability from a vibe into a number: a specific, agreed target for how reliable a service should be, and a running account of how much unreliability you have left to spend. Done well, this ends the perpetual, unwinnable argument between the engineers who want to ship features and the ones who want to stop and fix things, because both sides are now looking at the same shared number instead of trading anecdotes. It's a practice borrowed from Google's SRE playbook, but you don't need to be Google to use it — you need a handful of well-chosen metrics and the discipline to actually let them drive decisions.
SLIs: measure what the user actually feels
Everything starts with the Service Level Indicator — the specific metric you'll measure — and the classic mistake is measuring what's easy instead of what matters. Server CPU, memory, and raw uptime are easy to graph and nearly useless as reliability signals, because a box can be 'up' at 20% CPU while every user request is timing out. Good SLIs are defined from the user's perspective: the proportion of requests that succeed (availability), the proportion served faster than some threshold (latency), and for data pipelines, freshness or correctness. Frame each as a ratio of good events to total events — 'proportion of homepage requests that returned 200 in under 300ms' — because that's directly what a user experiences and it's the thing worth defending. If your dashboards are full of infrastructure metrics but can't tell you what fraction of users had a good experience in the last hour, you're measuring the wrong layer, which is exactly the gap a proper observability setup is meant to close.
SLOs: pick a target, and be honest that it isn't 100%
A Service Level Objective is the target you set for an SLI over a window — '99.9% of requests succeed, measured over 28 days.' The single most important thing to internalize is that the right target is never 100%: perfect reliability is impossible, and chasing it is ruinously expensive, so the real question is how much unreliability your users genuinely won't notice or mind. Each 'nine' costs dramatically more than the last — 99.9% is about 43 minutes of downtime a month, 99.99% only about 4 minutes, and the engineering effort to go between them is enormous — so set the objective at the point where more reliability stops being worth what it costs you in velocity. Set it from the user's tolerance, not from vanity; a background analytics job and your checkout path deserve very different targets. And set it a little below the reliability you actually deliver today, so the number is honest and achievable rather than an aspiration everyone quietly ignores.
The error budget: permission to spend the difference
Here's the idea that makes the whole system click. If your SLO is 99.9% success, then 0.1% of requests are allowed to fail — and that 0.1% is your error budget: a concrete, quantified allowance of unreliability you're free to spend however you like over the window. This reframes reliability from 'never break anything' (paralyzing) to 'stay within budget' (actionable), and it turns risky-but-valuable activities into a resource decision. Shipping a big feature, running a migration, doing a bit less testing to move faster — all of these spend error budget, and that's completely fine as long as there's budget left. The error budget is what gives engineers explicit permission to move fast: you're not being reckless, you're spending a resource that was allocated for exactly this. Reliability stops being a moral argument and becomes a bank balance everyone can see.
The error budget policy: what happens when it runs out
An error budget only changes behavior if something actually happens when you exhaust it, and that 'something' is the error budget policy — agreed in advance, in calm times, so it's a pre-committed rule rather than a fight during an incident. The standard policy is simple and powerful: while there's budget remaining, the team ships freely; when the budget is spent, feature work pauses and the team's priority shifts to reliability — fixing the classes of failure that burned the budget — until you're back within objective. This is the mechanism that self-corrects the velocity-versus-stability tension without a manager having to adjudicate it every sprint: a stable service naturally earns the right to ship fast, and an unstable one automatically forces the fixes that will let it ship fast again. Pair it with a fast-burn alert — page someone when the budget is being consumed unusually quickly — so you catch a bad deploy in minutes rather than discovering at month-end that you blew through everything on day three. This is also the discipline that makes incident response and blameless postmortems productive: the budget tells you objectively when reliability work has to win.
Start small and let it earn trust
You don't roll this out across forty services on day one; you start with the one or two user journeys that matter most — the login, the checkout, the core API — define a single good SLI for each, set a conservative SLO you're already meeting, and simply start watching the budget. The early value is clarity: for the first time, 'are we reliable enough?' has a yes-or-no answer, and conversations about whether to slow down and fix things reference a number instead of the loudest voice in the room. Resist the urge to define dozens of SLOs no one looks at — a few that genuinely drive decisions beat a wall of dashboards that don't. Over a quarter or two, as the team sees the budget catch a regression or justify a pause, it earns trust and you extend it to more services. The goal isn't a perfect measurement framework; it's a shared, honest number that makes the reliability-versus-speed tradeoff a decision you manage on purpose rather than one that manages you.
How Infiniti Tech Partners puts SLOs to work
We help teams make reliability a number they manage instead of a feeling they argue about. We start where it matters — your critical user journeys — defining SLIs from the user's actual experience (success rate, latency, freshness) rather than infrastructure vanity metrics, and setting honest SLOs pegged to user tolerance and to what you already deliver. Then we stand up the error budget and, crucially, the error budget policy: an agreed, pre-committed rule for when velocity yields to reliability, plus fast-burn alerting so a bad release is caught in minutes. We wire it into your observability so the budget is always visible, and we start small so the practice earns trust before it scales. The outcome is an end to the endless features-versus-stability standoff — a shared, quantified target that lets your team ship confidently when they've earned it and fix decisively when they haven't.
Frequently asked questions
What is the difference between an SLI, an SLO, and an error budget?
An SLI (Service Level Indicator) is the metric you measure — ideally from the user's perspective, like the proportion of requests that succeed or are served under 300ms. An SLO (Service Level Objective) is the target you set for that SLI over a window, such as 99.9% success over 28 days. The error budget is the allowed shortfall: if the SLO is 99.9%, then 0.1% of requests are permitted to fail, and that budget is a concrete allowance of unreliability you're free to spend on shipping features, migrations, or moving faster.
Why shouldn't an SLO target be 100%?
Perfect reliability is impossible and ruinously expensive to chase, so the right target is the point where more reliability stops being worth what it costs you in velocity. Each additional 'nine' costs dramatically more than the last — 99.9% is about 43 minutes of downtime a month, 99.99% only about 4 minutes, for an enormous jump in engineering effort. Set the objective from your users' actual tolerance and slightly below the reliability you already deliver, so the number is honest and achievable rather than an aspiration everyone ignores.
How does an error budget policy work?
An error budget policy is an agreed rule, decided in calm times, for what happens when the budget runs out. The standard version: while budget remains, the team ships features freely; once it's spent, feature work pauses and reliability work becomes the priority until you're back within objective. This self-corrects the features-versus-stability tension without a manager adjudicating every sprint — a stable service earns the right to ship fast, an unstable one is automatically forced to fix what's breaking. Pair it with a fast-burn alert so a bad deploy is caught in minutes.
Related reading
Incident Management and Blameless Postmortems: Turning Outages Into Reliability
A practical incident management playbook for growth-stage SaaS: severity levels, the incident commander role, on-call that doesn't burn people out, and blameless postmortems that actually prevent repeats.
EngineeringEvent-Driven Architecture: Queues, Streams, and When Async Actually Helps
When to reach for queues and event streams instead of synchronous calls — the difference between a queue and a log, the patterns that make async reliable (outbox, idempotency, dead-letter queues), and the failure modes teams underestimate.
EngineeringAPI Design and Versioning: Building Interfaces You Won't Regret
How to design APIs that survive contact with real integrators — resource modeling, consistency, pagination, and a versioning and deprecation strategy that lets you evolve without breaking every customer.