Why Error Budget Policy does not work in real production
Formally, an error budget policy exists almost always: availability metrics are collected, the share of failed requests is calculated, and the dashboard shows how much budget has been spent over the window.
Then the gap begins — a spent budget obligates no one to anything, and the decision to pause deployments is made manually by the on-call engineer, anew each time.
The reason is that reliability thresholds live separately from the release process. The budget reaches 80% — the alert fires, but what to do next is nowhere fixed: stop all deployments, let only fixes through, roll back the last release.
The on-call engineer chooses based on the situation and under pressure from the release plan, and almost always chooses "let's ship it and see." After several such deviations, the threshold stops being noticed, and managing service reliability turns into a decorative metric.
From this also grows the blurred responsibility of on-call engineers: the product team believes that operations is responsible for reliability, operations waits for a decision from the service owner, and the owner learns about the problem from an escalation.
Manual release freezes work unevenly: in one cycle deployments stop because of a single incident, in another they proceed with a completely burnt budget. Both extremes are expensive — either velocity drops for no reason, or incidents repeat at the same frequency.
We break down how this is closed: how to tie the error budget to the release pipeline, set unambiguous thresholds, and take the decision out of the on-call engineer's hands.
Measurable effect: release velocity and failure classes
While Error Budget Policy exists only as a table, it influences nothing.
As soon as the error budget becomes a rule — with a stop threshold, an owner of the decision, and a return-to-normal procedure — four measurable quantities change, and each is visible in reports from the very first month.
Deployment velocity grows not because the team writes code faster, but because a release stops being a risk.
Without measurable reliability, every change is approved "just in case"; with a budget, the decision is made based on the remaining allowance: if there is headroom, we ship; if the allowance is exhausted, we first eliminate the cause. Deployment frequency grows severalfold with the same number of incidents.
The class of failures also shifts: most outages become reversible, a rollback takes minutes, and service recovery time is counted not from the moment the problem was noticed, but from the moment the automation triggered.
The approach to reliability management is formalized in the Site Reliability Engineering practice and transfers to any stack.
The time to agree on a stop shrinks from days of back-and-forth to a single on-call decision: the threshold and consequences are prescribed in advance, and escalation does not require a meeting.
The share of recurring incidents falls, because every exhaustion of the budget is closed by a task with priority above product work, not by a report.
On-call predictability changes separately: the engineer knows in advance the allowable volume of nighttime pages, and the manager knows when development will pause and for how long.
Policy modes: from a soft signal to a hard stop
A policy mode is what the team and the system do at the moment when the agreed reliability allowance is exhausted.
It is defined not by a declaration but by specifics: who receives the signal, which checks are blocked in the deployment pipeline, what counts as an exception and who signs off on it.
The choice of mode affects delivery velocity more than the mere existence of an Error Budget Policy.
How to choose between modes
| Mode | When it fits | Limitations |
|---|---|---|
| Observation and warning | The first cycles after implementation, while reliability metrics do not yet inspire trust | Blocks nothing: if the signal is ignored, team behavior does not change |
| Mandatory postmortem with priority | The allowance is exhausted, but stopping delivery is unacceptable | Requires manual control: the postmortem is easy to postpone, and the mode degrades to observation |
| Automatic deployment stop | Periods of frequent failures and high cost of downtime | Blocks urgent fixes too, the very fix that addresses the cause of the failure |
| Stop with exception approval | A mature process: there is someone to sign and something to record it with | Without a clear procedure, exceptions become the norm and the policy is devalued |
It is practical to build this as a ladder: the mode is raised by fact, not by agreement — for example, after the second consecutive exhaustion of the allowance.
An automatic deployment stop is lifted only after a postmortem and restoration of the reliability metric, and every exception is recorded with a deadline and an owner, so that decisions do not dissolve in chat.
Implementation stages: from metric audit to handover of the procedure
Implementing an Error Budget Policy is not installing a tool but restructuring a process: first we measure, then we agree on thresholds, and only then do we automate the response.
The order is fundamental — if you start with notifications, the team gets a stream of noise instead of manageable decisions.
- Service metric audit — we collect what is already measured: availability, error rate, latency, load. Separately, we record where data is calculated manually and where it does not exist at all.
- Service criticality tagging — we divide services by impact on users and on revenue. For each level we set its own target reliability level and size of allowable failure share.
- Scheme design — we define the budget owner, the consequences of its exhaustion (release freeze, reallocation of effort to reliability), and how decisions are recorded in writing.
- Thresholds and alerts setup — calculation windows, budget burn rate, two-level signals: an early one for a postmortem, a late one for stopping changes.
- Test on a training incident — we run a scenario where the budget burns down: did the alerts fire, is it clear to the on-call engineer what to do, does the procedure hinder recovery.
- Handover of the procedure to the team — the document, dashboards, on-call schedule, owners, and the rule for reviewing thresholds once a quarter.
At the output, the team gets a working loop: release decisions rely on numbers rather than subjective arguments, and the policy is updated based on postmortem findings.
What we hand over: configurations, schemes, procedures
Along with a working error budget policy (Error Budget Policy), we hand over everything for running it independently: not a presentation about reliability, but files, schemes and procedures by which your engineers can change thresholds and handle incidents without us. Every artifact lives in your repository and is walked through line by line during the handover.
- Working policy configurations: error budget calculation rules, release slowdown thresholds, automatic alerts when the allowance burns down — connected to your monitoring and to your build and deployment systems.
- Reliability allowance calculation scheme: which availability and response time objectives are taken, how the unavailability share is calculated, by which formula the budget is zeroed out, and what counts as an exception.
- Incident postmortem procedure: the facilitator's roles, severity criteria, deadlines for publishing the postmortem, mandatory items — from the timeline to the tasks for eliminating causes.
- Access rules and roles: who sees the dashboard, who changes thresholds, who has the right to freeze releases, how rights are granted and revoked.
- Responsibility matrix: for each zone — service, on-call, policy change — who decides, who is notified, to whom it is escalated.
- Operating instructions: how to recalculate the budget when objectives change, how to safely loosen or tighten thresholds, what to do on false alarms.
- Handover protocol: a walkthrough of a real incident under the new procedure together with your team, an acceptance checklist, and a list of open questions.
Case: removed manual release freezes and downtime
Before the project, the deployment decision was made manually: the release manager opened the charts, checked recent incidents, and decided from experience whether to let the version into prod. Approval took from several hours to a day, and disputed releases were postponed indefinitely.
The opposite skew was no better: when the charts looked calm, deployments flowed, including Friday evening windows, and some of the degradations came from exactly there.
Downtime added up from two sources — risky deployments and drawn-out approvals, because of which fixes reached prod with a delay.
We fixed target levels for availability and latency of key scenarios and tied an error budget to them — the share of requests the service is allowed to lose over the observation window.
A rule in the alerting system calculates the budget burn rate: when burn accelerates, deployments are blocked automatically; when it recovers, they are unblocked.
The threshold, window and exception list live in the policy configuration, not in chat agreements; the approach relies on the Google SRE practice.
Metrics before and after
- Successful request share: 99.3% → 99.9%
- Deployment decision: hours of back-and-forth → automatic budget check in minutes
- Average downtime per incident: 42 → 9 minutes
- Rollbacks: every fifth release → one in twenty
- Deployment frequency grew 2.5x with no growth in the number of incidents
How Error Budget differs from SLO and SLA
SLA is a contractual level: an obligation to the customer, the violation of which entails sanctions. SLO is an internal target level that the team maintains voluntarily and usually stricter than the SLA.
Error Budget is a derivative of the SLO: the share of unreliability the service is entitled to spend.
The budget is calculated as 1 − SLO over the chosen window. At a target of 99.9% over 30 days, allowable unreliability is about 43 minutes; at 99.95%, half that.
It is not a penalty but a permission to take risk: releases, experiments and maintenance spend the budget rather than break a promise.
| Concept | What it sets | Who is responsible | What happens when the boundary is crossed |
|---|---|---|---|
| SLA | contractual level and sanctions | business together with engineers | contractual consequences, escalation to the customer |
| SLO | internal availability and latency target | the service team | root cause analysis, release freeze |
| Error Budget | allowable share of unreliability | the service team | switching to reliability work |
SLA is always set below SLO: the headroom is needed so that the internal target triggers earlier than the contractual one and there is time to react before sanctions. If the levels coincide, any incident immediately becomes contractual — the team loses room to maneuver.
If monitoring is already deployed and collects availability metrics, there is no need to rewrite it.
The budget calculation is placed on top of existing time series: a window is chosen — sliding or calendar — rules are set for burn rate (fast over an hour, slow over several days) and thresholds at which the policy kicks in.
All that remains is to agree on what exactly happens upon exhaustion: priority of reliability over new tasks and an explicit exception list.
Technical doubts before implementing the policy
Objections to an error budget policy (Error Budget Policy) are usually the same: there are no reliability metrics, the existing approval procedure has not been abolished by anyone, and incident priority will be understated to avoid spending the budget. We address each — and what exactly closes it at the configuration level.
You do not need to start with the whole loop: the policy is introduced service by service, and the first step is one or two services where telemetry is already being collected.
The rest are connected as metrics appear, so there is no need to agree on a single procedure for the entire infrastructure.
There are no reliability metrics — will the policy rest on subjective assessments?
The budget is calculated from signals the monitoring already emits: successful request share and response time. If coverage is narrow, we first expand checks on critical paths, and set the calculation window so that the sample is representative. Zero metrics is not a reason to postpone: the start comes from a service where data already exists.
Does the policy conflict with the existing approval process?
No, it sets a criterion within it. While the budget is not exhausted, releases follow the usual procedure; after exhaustion, only changes that restore reliability. The rule is fixed in the configuration, and manual haggling on every rollout stops.
Will incident importance be manipulated?
Priority is determined by attributes, not by a vote: the share of affected users, duration, degradation of a key scenario. We fix the priority matrix and auto-triage rules in advance, discuss disputed cases at a retrospective using logs, and adjust the thresholds.
Let's discuss the task: what to prepare for the conversation
To make the conversation about reliability substantive, it helps to gather a few inputs in advance. There is no need to prepare anything special — usually it is what the team already has: a list of services, dashboards, incident history.
From these we will reconstruct the real picture: where the bottleneck is, which services will benefit from the error budget policy the fastest, and what will have to change in the release process. After that we will come back with an estimate and a work plan.
- List of services and metrics — what relates to revenue, what to internal tools, where downtime is acceptable and where it is not; how availability and latency are currently calculated.
- Historical data — exports on incidents and degradations for at least several months: without them it is impossible to choose thresholds that will not fire every day.
- Pain points of the process — which failures repeat, where decisions are made "by eye", who stops the release manually and how often.
- Zones of responsibility — the service owner, the one who approves thresholds, and the one who introduces the release freeze.
- Existing procedures — the release order, incident handling instructions, escalation and on-call notification rules.
- Constraints — regulatory requirements, maintenance windows, dependencies on external vendors.
This is enough to discuss the reliability task on its merits and not spend the meeting gathering context. Describe your situation — we will come back with an estimate and a plan.







