Observability

Error budgets and SLOs for small teams: a practical introduction

SLOs came from teams with thousands of services and a reliability department. The idea is simpler than its reputation, and a three-person team can use it to settle its most common argument: ship, or stabilise?

An error budget draining over a month against a declared availability target

A service level objective is a target you set for your own service — say, 99.9% of checks succeed over a rolling 30 days — and the error budget is the failure that target allows: at 99.9%, about 43 minutes of downtime a month. An SLA is the version of that promise you make to a customer, with consequences; the SLO is the stricter internal target you run against so the SLA is never at risk. The budget turns reliability from a feeling into a number with a decision attached: while budget remains, ship; when it is spent, stabilise. For a small team, the whole practice can be one declared target per asset and a health score that shows budget remaining.

Key takeaways
  • SLO is the target you hold yourself to; SLA is the promise you make to customers. Set the SLO tighter than the SLA.
  • Error budget = 100% − SLO, as minutes. 99.9% → 43 min/month; 99.5% → 3 h 36 min; 99% → 7 h 12 min.
  • The budget's purpose is a decision rule: budget left, ship features; budget gone, stop and fix. It ends the argument.
  • A health score can simply be budget remaining. That is more honest than a blended "85/100" nobody can explain.
  • One SLO per user-visible asset is enough. Do not build a taxonomy; build one number per thing customers use.

SLO versus SLA, in one table

SLAExternal promise to a customer, in a contract, with credits or penalties. Example: 99.5% monthly availability. Reporting against it.
SLOInternal target you actually run to, stricter than the SLA so the SLA is safe. Example: 99.8%.
SLIThe measurement — the fraction of checks that succeeded, the fraction of requests under 500 ms. What the SLO is a target for.
Error budgetWhat the SLO allows to fail: 100% − SLO, expressed as minutes or failed requests over the window.

The arithmetic

Over a 30-day window (43,200 minutes):

99%432 minutes of failure allowed — 7 h 12 min
99.5%216 minutes — 3 h 36 min
99.9%43 minutes
99.95%21.6 minutes
99.99%4.3 minutes — not a target for a small team on ordinary hosting

Budget burns as failures are confirmed. A 25-minute incident on a 99.9% asset spends 58% of the month's budget. Two such incidents and the budget is gone with two weeks left — which is precisely the information the team needs. Latency SLOs work the same way with requests instead of minutes: "99% of checks under 800 ms" gives a budget of 1% slow checks. How the layers roll up.

The decision rule: ship or stabilise

This is the part that earns its keep. Write a one-paragraph error budget policy:

While an asset has error budget remaining in the current window, feature work proceeds normally. When the budget is exhausted, feature deploys to that asset stop until the window recovers or the cause is fixed; engineering time goes to reliability. Budget spent on a dependency outage counts unless the SLA excludes it.

The value is not the rule itself but that it was agreed in advance. "Should we ship this or fix the flakiness first?" is no longer a negotiation between the founder and the engineer; it is a look at a number. Deploy correlation tells you which deploys spent budget; catching small bugs early is how you stop spending it.

A health score that means something

Many dashboards show a health score — 87/100 — that blends uptime, latency, errors and "trend" with weights nobody remembers. The question "what does 87 mean?" has no answer. Budget remaining does: "this asset has used 31% of its monthly error budget" is a statement about the promise you made and how much room is left. It rises as the window rolls forward and drops when checks fail; it is comparable across assets on different tiers; and it tells a client exactly where the month stands. Monitoring says something is wrong; the budget says how much it cost.

Pitfalls for small teams

Quick reference

SLOInternal target you run to; stricter than the SLA
SLAExternal promise with consequences
Error budget100% − SLO, as minutes or failed requests over the window
99.9% / 30 days43 minutes of failure allowed
Decision ruleBudget remaining → ship; budget spent → stabilise
Health scoreBudget remaining, per asset, against its declared tier
How manyOne SLO per user-visible asset

Frequently asked questions

What is an error budget?

An error budget is the amount of failure a service level objective permits over a window. If the SLO is 99.9% availability over 30 days, the error budget is 0.1% of that window — about 43 minutes of downtime. Confirmed failures spend the budget; while budget remains the team ships normally, and when it is exhausted feature work pauses in favour of reliability.

What is the difference between an SLO and an SLA?

An SLA is the external promise made to a customer, usually in a contract with credits or penalties. An SLO is the internal target the team actually runs to, set stricter than the SLA so the SLA is never at risk. The SLI is the underlying measurement — for example the fraction of checks that succeeded — that both are targets for.

How do I calculate an error budget?

Subtract the SLO from 100% and multiply by the window. For 99.9% over a 30-day month of 43,200 minutes: 0.1% × 43,200 = 43.2 minutes. For 99.5%: 216 minutes, or 3 hours 36 minutes. For 99%: 432 minutes, or 7 hours 12 minutes. Latency SLOs use requests or checks instead of minutes.

Do small teams need SLOs?

A small team benefits more than a large one, because it has no reliability department to arbitrate the ship-or-stabilise argument. One declared target per user-visible asset, an error budget derived from it, and a one-paragraph policy about what happens when the budget is spent replaces that argument with a number.

What should a health score be based on?

Error budget remaining against a declared target is the most honest basis: it is a statement about a promise and how much room is left, comparable across assets on different tiers, and explainable to a client. Blended scores that weight uptime, latency and errors by hidden coefficients answer the question "what does 87 mean?" with silence.

What availability target should a small SaaS set?

One the architecture can actually deliver. A single-region deployment on ordinary hosting with no on-call rotation can honestly target 99.5%; 99.9% needs redundancy and a response process; 99.99% is not a small-team target. Set the SLO slightly tighter than whatever SLA you offer customers, and tighten it as the system earns it.

How Merik handles it

Merik's health score is exactly this: each asset carries a declared SLA tier, and its health is the error budget remaining against that tier over the window — measured from the outside by the same checks a user's request would take, not from the server's opinion of itself. Confirmed failures spend budget; recovered warnings do not. The score is comparable across a client's assets on different tiers and is the number the monthly SLA report is built on.

Deploys from GitHub and Vercel webhooks and provider incidents from vendor status feeds sit on the same timeline, so you can see which deploy or which dependency spent the budget — and apply an error budget policy with evidence rather than argument. See the Digital Operations module.

Create your workspace →

Or talk to us about your team →