Your Uptime SLA Is an Insurance Policy. Nobody Ran the Actuarial Numbers.
A VP of Sales at a 90-person SaaS company closes a seven-figure logo in the last week of the quarter. The procurement team on the other side sends back a redline: they want 99.95% monthly uptime, a tiered service-credit schedule, and a termination-for-cause clause that triggers after three consecutive monthly breaches. The VP doesn't want to lose momentum on a deal that took eight months to close, so they accept the number, run it past legal for the boilerplate around force majeure and scheduled maintenance, and get it signed.
Nobody asks engineering what the company's actual uptime has been for the past twelve months.
It turns out to be 99.7%. Not a catastrophic number — most SaaS companies would be glad to have it — but nowhere near 99.95%. The gap between what was promised and what the system has actually delivered isn't a rounding error. It's the difference between roughly 26 hours of allowable annual downtime and roughly 4.4 hours. The company didn't just accept an aggressive target. It accepted a number that its own recent history says it will very likely breach, on a contract that ties that breach to real service credits and, eventually, to the customer's right to walk away.
Nobody did anything reckless in that scenario. The salesperson negotiated in good faith and matched what competitors publish. Legal reviewed the contract language and it was clean. Engineering wasn't hiding anything — nobody asked. That's the actual failure: an uptime SLA is a number that obligates the company to pay a specific financial penalty under specific measurable conditions, and it was set without anyone checking it against the one dataset that would tell you whether it's achievable. That's not a legal oversight. It's an underwriting failure — the same category of mistake an insurer makes when it prices a policy off a rate card instead of the applicant's actual loss history.
This article is about closing that gap: what an SLA number actually costs when it's wrong, how to measure what you can honestly commit to, and how to decide, deal by deal, whether the answer is to invest in reliability or to negotiate a different number.
The Number Sales Promises Is a Financial Instrument, Not a Technical Detail
Most engineering leaders think about SLA numbers the way they think about marketing copy: something commercial teams write, occasionally too aggressively, that engineering quietly absorbs the consequences of. That framing understates what's actually happening. A signed SLA is a contingent financial liability. It has a trigger condition (uptime falling below a threshold, or a support ticket not resolved inside a time window), a payout mechanism (a service credit calculated as a percentage of fees, sometimes capped, sometimes not), and in many enterprise contracts, an escalation path that ends in the customer's unilateral right to terminate and, depending on the contract, seek damages beyond the credit itself.
That is structurally identical to an insurance policy. An insurer that sells a policy without checking the applicant's claims history, driving record, or property condition isn't being generous — it's pricing risk it hasn't measured, and it will eventually pay for the gap between the premium it charged and the losses it didn't anticipate. A software company that publishes or contractually commits to an uptime number without checking it against its own incident history is doing the same thing, except the "premium" it's failing to price correctly is the service credit exposure sitting in a contract that finance has already recognized as revenue.
The reason this matters more now than it did five years ago is straightforward: SLA terms have become a standard part of enterprise procurement, not a rare request from a handful of sophisticated buyers. Mid-market and enterprise buyers routinely run security questionnaires and legal redlines that include specific uptime and resolution-time commitments, often benchmarked against what the buyer has seen from other vendors in the same category. A company selling into that market signs dozens or hundreds of these agreements over a few years. If the number in the template is wrong, the company isn't taking one bad bet — it's writing the same underpriced policy over and over, at scale, without knowing it.
None of this means SLA commitments are inherently dangerous or that companies should avoid them. Reliability commitments are a legitimate, often necessary, part of enterprise sales — many deals simply don't close without one. The problem is specifically that the number is usually chosen through a process that has nothing to do with the company's own operating reality.
Where the 99.9% Actually Comes From
Ask a founder or VP of Sales how their published or contractually-offered uptime number was chosen, and the honest answer is almost always some version of "that's what everyone else offers." Sales teams benchmark against competitors' publicly posted SLA pages, against what a customer's procurement team says other vendors have agreed to, or against a round number that sounds credible — "three nines" has become a kind of default assumption, the way "24/7 support" became a default assumption in an earlier era of SaaS marketing.
This is competitive benchmarking, and it's a reasonable input to a negotiation. It's a dangerous input to a financial commitment when it's the only input. Competitive benchmarking tells you what number will make a deal competitive. It tells you nothing about whether your infrastructure, your team's incident-response process, or your dependency stack can actually deliver that number without a materially higher probability of breach than the sales team, the finance team, or the board would accept if they saw the real numbers.
The failure mode is compounding for a specific reason: SLA numbers, once offered to one enterprise customer, tend to become the default for the next one, and the one after that. A number chosen aspirationally for a single deal becomes a template clause in the master services agreement, then a line on the pricing page, then a competitive claim in a sales deck. By the time anyone in engineering leadership is asked to weigh in, the number has already been repeated in enough contracts that "renegotiating" it feels like reneging on an existing set of promises rather than correcting a single deal term.
Hypothetical scenario 1 — the first enterprise contract at a seed-stage fintech startup. A 14-person fintech startup building expense-management software for mid-size companies is closing its first contract with an enterprise buyer: a 1,200-employee logistics company. The buyer's procurement checklist, copied from a template their legal team uses for every SaaS vendor, asks for "99.9% uptime with service credits for non-compliance." The startup's head of sales, eager to close the deal and unfamiliar with the operational implications, agrees without escalating. The company has been live in production for nine months. It has had four incidents that produced customer-visible downtime, totaling around 11 hours, against roughly 6,570 production hours in that period — a measured uptime of approximately 99.83%, not 99.9%. The gap looks small as a percentage. In minutes, it's not: 99.9% permits about 8.76 hours of downtime a year; 99.83% is already running close to double that rate on a nine-month sample, and the sample includes no seasonal peak-traffic period yet, no major platform migration, and no scaling from 40 customers to the several hundred the funding round is meant to support. The company just contractually promised a number its own short operating history says it's not currently meeting, on a system that hasn't yet been tested at the scale the funding is meant to enable.
The failure here isn't that the startup offered an SLA. Enterprise buyers routinely expect one, and refusing to offer any commitment can itself cost the deal. The failure is that nobody translated "99.9%, industry standard" into "here's what our actual operating history says, here's the gap, and here's what it will cost us if we breach twice in the first year." That conversation takes perhaps thirty minutes with the eng lead pulling incident data. It didn't happen because nobody thought to ask for it before the number was already in a signed document.
What You Can Actually Measure Before You Promise Anything
Before an SLA number is offered to a customer, or renewed unchanged into another year of contracts, there is a specific, boring, and entirely doable measurement exercise that should happen. It doesn't require new tooling in most companies — it requires someone pulling data that usually already exists in an incident tracker, a status-page history, or monitoring dashboards, and putting it in a form a non-engineer can read.
Historical uptime. The starting point is simple: over a defined trailing window (twelve months is standard; shorter windows are noisier and easier to game accidentally), what percentage of time was the customer-facing system actually available, measured the way a customer would experience "available" — not the way an internal dashboard defines "green." This number should be calculated the same way the contractual definition will calculate it, including or excluding the same categories (scheduled maintenance, degraded-but-technically-responsive states, partial outages affecting a subset of customers).
MTTR (mean time to recovery). The average time between when an incident starts affecting customers and when service is restored. This number matters independently of raw uptime because it drives two different things in an SLA: the uptime percentage itself (more minutes down per incident directly reduces the uptime percentage) and, separately, any resolution-time commitments in the contract ("critical issues acknowledged within 30 minutes, resolved within 4 hours"). A company with a good MTTR but infrequent, severe incidents has a very different risk profile than one with a mediocre MTTR but frequent, minor ones — the SLA needs to reflect which pattern actually describes the business.
MTBF (mean time between failures). How often incidents happen at all, independent of how long each one lasts. This is the number that tells you whether a good MTTR is disguising a system that fails often but recovers quickly (which erodes customer trust and increases the chance of hitting a termination-for-cause threshold that counts number of breaches, not just cumulative downtime) versus a system that fails rarely but takes a long time to recover when it does (which risks a single catastrophic breach large enough to blow through even a generous monthly credit cap).
The trailing window matters more than the average. A single bad month can be an outlier or a warning. The useful analysis isn't just "what was our average uptime over the last year" — it's "what was our worst month, and how far below the proposed SLA threshold did it fall." A company that averages 99.95% but had one month at 99.4% because of a database migration that went wrong is a different underwriting risk than one that has been steady at 99.9% every month. An SLA number chosen from the average, ignoring the worst month, is priced for a version of the business that hasn't actually happened yet.
Component-Level Availability Is Not End-to-End Availability
A common measurement error compounds the problem: engineering teams often report uptime for individual components — the API gateway, the primary database, the authentication service — rather than for the full path a customer actually depends on. A database can report 99.99% availability while the checkout flow that depends on it, the payment processor it calls, the search index it feeds, and the notification service downstream of it produce a customer-visible experience that's degraded far more often than the database metric alone suggests.
This distinction is not academic. Contractual SLA definitions almost always specify availability from the customer's point of view — can they log in, load the dashboard, complete the core workflow the product exists to support — not from the point of view of any single internal service. If the reliability number being compared against the proposed SLA threshold is a component metric rather than an end-to-end one, it is very likely flattering the business's actual position, sometimes substantially. The right measurement unit is whatever a synthetic monitor or real-user monitoring tool captures when it exercises the same critical path a paying customer exercises, not whatever a single service's health check reports.
In practice, this means two complementary measurement approaches, not one. Synthetic monitoring runs a scripted transaction — log in, load the dashboard, add an item to a cart, submit a form, whatever the contractually relevant workflow is — against production on a fixed interval (commonly every one to five minutes) from a location outside the company's own network, and records whether it succeeded and how long it took. This is the closest proxy to "would a customer have been able to do the thing they pay for right now," and it is the measurement method most enterprise SLA definitions implicitly assume, because it produces a clean, continuous, auditable time series that can be handed to a customer during a dispute. Real-user monitoring (RUM) complements it by capturing what actual customer sessions experienced, which catches problems synthetic checks miss — a regional network issue affecting only customers in one geography, a browser-specific failure, a slow-but-technically-successful request that a synthetic check logs as "up" but a real user would describe as broken. A company that wants a defensible answer to "what was our uptime last year" needs both: synthetic monitoring for a clean, continuous record against the specific contractual workflow, and RUM as a check against the synthetic data understating real customer impact.
Metrics that mislead: why a single uptime percentage can hide the number that actually matters. A raw uptime percentage treats every minute of downtime as equally costly, which is rarely true for a real business. Ten minutes of downtime at 3 a.m. on a Sunday for a B2B product used only during business hours is a very different event, in both customer impact and revenue effect, than ten minutes of downtime during a Monday-morning traffic peak or a end-of-quarter billing run. A company that only reports a simple time-based percentage can look reliable on paper while its downtime is disproportionately concentrated in the hours that matter most to customers and revenue — or, less obviously, can look worse on paper than its business impact actually was, because a low-traffic maintenance window skews the raw percentage down without affecting many real users.
| Metric | What it measures | What it can hide |
|---|---|---|
| Simple time-based uptime (minutes up ÷ total minutes) | Raw availability over a period, unweighted | Whether downtime clustered in high-traffic or high-revenue windows |
| Request-weighted or traffic-weighted availability (successful requests ÷ total requests) | Availability as experienced by actual usage volume | Can look artificially good if a company throttles or sheds load during an incident, technically "succeeding" fewer requests rather than failing them outright |
| Revenue-weighted availability (uptime during periods weighted by billing or transaction value) | The metric most directly tied to financial impact | Requires more instrumentation to calculate; rarely what a standard contract measures, so it's useful internally even when it isn't the contractual number |
| Customer-count-weighted availability (percentage of customers affected × duration) | Distinguishes a full outage from a partial one affecting a subset of accounts | A contract that doesn't define partial outages precisely may not credit a customer proportionally to what they actually experienced |
The practical implication for SLA design is not that a company needs revenue-weighted monitoring before it can offer any SLA — most enterprise contracts still use simple time-based uptime because it's auditable and easy for both sides to agree on. It's that engineering leadership should look at more than the single contractual metric internally, because the contractual metric can systematically understate or overstate the business cost of a given incident pattern, and that gap is exactly the kind of thing that should inform how much headroom to keep, not just the headline percentage itself.
The Composability Problem: Your Vendors Set Your Ceiling
Even a perfectly engineered, zero-defect application cannot promise better uptime than the weakest critical dependency in its own request path, if that dependency is a hard requirement for the feature being measured. This is the composability problem, and it is the most frequently ignored input in SLA design, because it requires looking outward at vendor commitments instead of inward at your own team's performance.
If a checkout flow requires a call to a third-party payment processor, and that processor is unavailable, the checkout flow is unavailable too, regardless of how well the company's own infrastructure performed. The achievable ceiling for that specific flow is mathematically capped by the combined availability of every hard dependency in the chain, not by the company's own engineering quality alone.
Chart 1 — Composability: how dependent-service uptime caps your achievable ceiling
| Step | Dependency in the critical path | Assumed monthly availability | Combined ceiling after this step |
|---|---|---|---|
| 1 | Your own application and database | 99.95% | 99.950% |
| 2 | Add: identity/authentication provider | 99.95% | 99.900% |
| 3 | Add: third-party payment processor | 99.90% | 99.800% |
| 4 | Add: transactional email/notification provider (non-blocking, excluded from critical path) | 99.90% | 99.800% (unchanged — excluded) |
Combined ceiling arithmetic: 0.9995 × 0.9995 × 0.999 ≈ 0.998001, or approximately 99.80%.
What this shows: Even if the company's own application never has a single unplanned minute of downtime beyond the 99.95% assumed above, the moment checkout requires a hard, synchronous call to an identity provider and a payment processor that are each independently reliable at a respectable 99.9%–99.95%, the mathematically achievable ceiling for that specific flow drops to roughly 99.80% — below the 99.9% "three nines" figure that shows up by default in so many SLA templates. A company that offers 99.9% checkout availability without accounting for this has offered a number that is not achievable even in a defect-free world, because the ceiling was never in its own hands. The fix is not necessarily better engineering. It's either designing graceful degradation so the payment step can be decoupled from the parts of the experience being measured (allow browsing and cart management to stay "up" even if checkout is degraded), or making sure the SLA's definition of the measured flow doesn't quietly assume 100% availability from a vendor whose own SLA doesn't promise that.
This is also why many published cloud-provider SLAs are narrower than they look at first read: they cover a specific service's own availability, explicitly exclude failures caused by other services or by the customer's own configuration, and require the customer to architect around known limitations (for example, running instances across multiple availability zones) to get the provider's highest published tier. A company inherits both the reliability and the fine print of every vendor it depends on for a customer-facing SLA to hold.
How Enterprise Credit Structures Actually Work
The clearest, most rigorously documented examples of SLA credit design are the ones published by major cloud infrastructure providers, because they've had to formalize the mechanics at scale, across huge customer bases, in a way that holds up under audit and dispute. They're a useful reference point for understanding the shape of a credit structure even though most SaaS companies' own commercial SLAs will use different specific numbers.
Chart 2 — How three major cloud providers tier service credits against monthly uptime shortfall
| Provider / Service | Committed uptime | Uptime band | Service credit |
|---|---|---|---|
| AWS EC2 (region-level) | 99.99% | 99.0% to <99.99% | 10% |
| 95.0% to <99.0% | 30% | ||
| <95.0% | 100% | ||
| Google Cloud Compute Engine (multi-zone, standard tier) | 99.9% | 99.0% to <99.9% | 10% |
| 95.0% to <99.0% | 25% | ||
| <95.0% | 100% | ||
| Azure Virtual Machines (availability zone deployment) | 99.99% | <99.99% (down to 99%) | 10% |
| <99% (down to 95%) | 25% | ||
| <95% | 100% |
Sources: Amazon Compute Service Level Agreement; Google Compute Engine Service Level Agreement; Azure Virtual Machines SLA (mirror of Microsoft's published VM SLA terms).
What this shows: All three providers converge on the same underlying structure despite different exact thresholds: a modest credit (roughly 10%) for a shortfall that's still fairly close to the committed number, a meaningfully larger credit (25–30%) for a shortfall that drops into the mid-90s, and a full refund of the relevant fees (100%) once availability falls below roughly 95%. None of them offer uncapped, escalating cash penalties beyond the fees paid for that billing period — the maximum financial exposure is bounded by what the customer paid, not by the customer's downstream losses. This is a deliberate and important design choice: it caps the vendor's downside to a known, bounded number tied to its own revenue from that customer, rather than an open-ended liability tied to the customer's business impact. It is also worth noting explicitly, since it changes the analysis: this bounded-liability structure is not automatic. A SaaS company's own commercial contracts, especially ones drafted or heavily redlined by an enterprise customer's legal team, do not have to follow this pattern, and some enterprise MSAs push for credit structures that are not capped at the monthly fee, or that include termination and damages provisions well beyond a simple credit. The cloud-provider pattern is a reasonable default to anchor a negotiation against; it is not a guarantee of what a given customer's legal team will accept.
A second structural element worth naming explicitly: every provider's SLA carves out a specific, narrow definition of what counts as "unavailable" or "downtime," and excludes categories like factors outside the provider's reasonable control, issues caused by the customer's own configuration, and (for many enterprise SaaS contracts, though this varies by vendor and isn't part of the public cloud provider SLAs above) scheduled maintenance windows announced with advance notice. These exclusions are not evasive fine print — they exist because an SLA that didn't exclude force majeure or third-party network failures outside the vendor's control would be uninsurable in practice. But the scope of these exclusions is itself a negotiated term, and it directly affects how much of a company's real incident history should count against the proposed number. An incident caused by an upstream cloud provider's own regional outage might be excluded from the customer-facing SLA's downtime calculation entirely, or it might not be, depending entirely on how the exclusion clause is worded — which is exactly the kind of detail that should be reviewed by qualified counsel rather than assumed from a template, since the practical financial exposure of a given SLA depends as much on how "downtime" and its exclusions are defined as on the headline percentage itself.
Table 1 — Typical enterprise SaaS SLA structure by exclusion category (illustrative composite, not a specific vendor's contract)
| Exclusion category | Typically excluded from downtime calculation? | Why it matters for the number you promise |
|---|---|---|
| Scheduled maintenance, announced in advance (e.g., 72 hours' notice) | Usually yes, within a capped monthly/quarterly window | Lets you plan necessary maintenance without it counting against the SLA — but an overly generous maintenance window can quietly erode the customer's actual experienced reliability without showing up in the contractual number |
| Force majeure (natural disaster, war, widespread internet infrastructure failure) | Usually yes | Standard risk allocation; rarely contested in negotiation |
| Root cause in customer's own environment or misconfiguration | Usually yes | Requires a clear, auditable way to demonstrate the root cause, which most companies don't have until they need it in a dispute |
| Root cause in a named third-party dependency outside your control | Sometimes, sometimes not — heavily negotiated | This is the composability issue in contract form; if it's not excluded, your effective SLA ceiling is set by your worst hard dependency, whether or not that's disclosed to the customer |
| Degraded performance short of full unavailability (slow but technically responding) | Rarely excluded automatically; usually requires explicit performance thresholds to be defined | Many real incidents are "slow," not "down." If the contract doesn't define a latency or error-rate threshold for "unavailable," this is a source of dispute after the fact, not before |
Beyond Credits: What Termination Rights and "Sole Remedy" Language Actually Do
Service credits get most of the attention because they're the part of the SLA with a clean formula attached, but two other clauses usually sitting next to the credit table matter just as much to the company's real exposure, and they're the two most likely to be reviewed only by a generalist and not flagged for engineering's input at all.
The first is the termination-for-cause threshold, the clause specifying how many breaches, within what rolling window, give the customer the right to exit the contract without penalty, sometimes with a pro-rated refund of prepaid fees. This is where the earlier headroom discussion has its sharpest financial consequence: a company can survive a single breach's service credit without much difficulty, but a termination trigger converts a recurring reliability weakness into the loss of the entire remaining contract value, not just one month's fees. A company that has three qualifying breaches in a rolling twelve-month period on a five-year enterprise contract can lose four-plus years of remaining revenue over a cumulative reliability problem that, breach by breach, looked individually manageable. Modeling the probability of hitting the termination threshold, not just the expected cost of a single breach, is the calculation most commonly skipped, because it requires thinking about breach frequency as a distribution over a year, not a one-time event.
The second is "sole and exclusive remedy" language, a standard but consequential clause stating that the service credit is the customer's only remedy for an availability shortfall, foreclosing a separate claim for the customer's own downstream losses (lost revenue, reputational harm, costs of a backup vendor) outside of a genuinely severe breach of contract. This clause is what keeps the cloud-provider credit model in Table 1 workable at all — it's the reason a provider's maximum exposure for a given customer in a given month is bounded at the fees paid, rather than open-ended. Whether a specific enterprise customer's legal team accepts sole-remedy language, or successfully negotiates carve-outs (for repeated or willful breaches, for data loss, for security incidents), is a heavily contract-specific negotiation, and it is exactly the kind of clause where the practical financial exposure described throughout this article can expand well beyond the credit-table arithmetic if the carve-outs are broad. This is squarely legal-review territory rather than an engineering judgment call, but engineering leadership benefits from understanding that it exists: a company that has done careful headroom analysis on the credit percentage but has no visibility into whether its contracts cap liability at the credit amount or leave it open has only priced part of its actual exposure.
The Arithmetic Nobody Runs Before Signing
Here is the exercise that should happen before an SLA number goes into a contract, and rarely does: translate the proposed percentage and credit structure into an actual dollar exposure, using the company's own contract economics.
Hypothetical worked example — a scale-up e-commerce platform's mid-market contract. A scale-up e-commerce infrastructure company (illustrative, not a real company) signs an annual contract worth $600,000, billed at $50,000 per month, with a mid-market retail customer. The commercial team, following the company's standard template, has offered:
- 99.9% monthly uptime commitment
- Credit tiers: 99.0%–99.9% uptime → 10% credit; 95.0%–99.0% → 25% credit; below 95.0% → 100% credit (mirroring the common industry pattern shown in Chart 2 above)
- Credits capped at the fees paid in the affected month
- Three consecutive monthly breaches, or four in a rolling twelve-month period, trigger the customer's right to terminate for cause
In month seven of the contract, the company's checkout flow depends on a third-party payment processor. That processor has a regional outage lasting roughly six hours during a weekday. Because the payment step is a hard, synchronous dependency in the checkout path — the exact composability issue described earlier — the company's own checkout availability for that month drops accordingly. Combined with two shorter, unrelated incidents earlier in the month (a database failover that took 40 minutes longer than expected, and a deployment that briefly broke the search index), total customer-visible downtime for the month comes to 8 hours and 12 minutes against a 30-day month (43,200 minutes).
The arithmetic:
- Total minutes in the month: 30 days × 24 hours × 60 minutes = 43,200 minutes
- Downtime minutes: 8 hours 12 minutes = 492 minutes
- Monthly uptime percentage: (43,200 − 492) ÷ 43,200 = 42,708 ÷ 43,200 = 0.98861, or 98.86%
That result falls into the 95.0%–99.0% band, which triggers a 25% credit, not the smaller 10% credit that a shallower breach would have triggered.
- Monthly fee: $50,000
- Credit owed: 25% × $50,000 = $12,500 for that single month
That $12,500 is real, but it is not the whole cost. If this is the first breach of the contract year, it is a one-time hit to that month's recognized revenue and a mark against the relationship. If it happens twice more within the rolling twelve-month window defined by the termination-for-cause clause, the customer gains the contractual right to walk away from the remaining $450,000 of contract value (the unexpired portion of the $600,000 annual deal) — and in competitive mid-market and enterprise categories, a customer who has an SLA-based exit right they've already triggered once is measurably more likely to use it at renewal even without a fourth breach, because the relationship's risk profile has changed in the buyer's eyes. The service credit is the visible, quantified cost. The elevated probability of non-renewal on the remaining contract value is the much larger, harder-to-quantify cost sitting behind it — and it is the reason a single breach a company shrugs off as "not that expensive" can still be the wrong number to have promised.
This is also where the composability discussion from earlier stops being theoretical: the largest single contributor to the breach, the six-hour payment processor outage, was not something the e-commerce company's own engineering team could have prevented through better code or more testing. It was a third-party dependency risk that should have been priced into the SLA's exclusion language, into the choice of whether to architect a fallback payment path, or into the decision of what number to promise in the first place — not discovered for the first time when the credit invoice went out.
How Much Headroom Is Enough
Once a company has an honest measured baseline, the next decision is how much margin to keep between what the data says the system actually does and what the contract promises. The instinct to promise exactly your trailing average is understandable and wrong: a trailing average is, by definition, a number your actual performance falls below roughly half the time. Promising your average is functionally promising a coin-flip chance of breach in any period you're measured against, even before accounting for the fact that trailing averages are usually pulled up by a few very good months that may not repeat.
A useful way to think about the right amount of headroom is in minutes, not percentage points, because minutes are what a customer, a service-credit clause, and an on-call engineer all actually experience.
Worked example — translating headroom into minutes. Suppose a company's trailing twelve-month measured uptime, calculated end-to-end and including every incident, is 99.95%.
- Minutes in a year: 365 × 24 × 60 = 525,600
- Downtime implied by 99.95%: 525,600 × 0.0005 = 262.8 minutes (about 4.38 hours) per year, measured
If that same company promises 99.9% in its SLA:
- Downtime allowed before breach at 99.9%: 525,600 × 0.001 = 525.6 minutes (about 8.76 hours) per year
- Headroom: 525.6 − 262.8 = 262.8 minutes, or roughly 4.38 hours — meaning the company could have a year twice as bad as its actual recent track record and still not breach the contractual threshold.
That is a defensible margin: enough room to absorb one meaningfully bad incident, or a cluster of smaller ones, without the SLA number itself becoming the thing that fails. A company that instead promises 99.95% — its exact trailing average — has zero structural margin for a worse-than-typical year, and a company that promises 99.99% based on nothing but "what a competitor's page says" has committed to a number that would require its worst historical month to essentially never happen again.
The gap should not be zero for the same reason an insurer doesn't price a policy at exactly its expected payout: normal variance exists even in a well-run system. A single unusually bad incident (a botched migration, a cascading dependency failure, a config error that takes longer than expected to identify) does not indicate the system has gotten worse; it indicates that variance is real and the number promised needs to survive it. The size of the appropriate margin depends on how volatile the company's own incident history actually is. A company with a tight, low-variance incident history, few surprises and consistent MTTR, can reasonably promise closer to its measured average. A company whose worst month was dramatically worse than its typical month, the profile of a system that hasn't yet been through a difficult scaling event, migration, or major vendor failure, needs more margin, not less, because its own history is telling it that its variance is high even if its average looks fine.
Resolution-Time Commitments Are a Different Promise, With Different Arithmetic
Everything above focuses on uptime percentage, but most enterprise SLA templates bundle a second, separate commitment into the same document: a resolution-time or response-time promise, usually structured by severity — "critical issues acknowledged within 30 minutes and resolved within 4 hours; major issues acknowledged within 2 hours and resolved within 24 hours; minor issues resolved within 5 business days." This is a materially different financial instrument from the uptime commitment, even though it usually shares the same credit mechanism, and it deserves its own measurement discipline rather than being treated as a boilerplate add-on to the uptime clause.
Uptime SLAs are measured against a continuous time series and can, in principle, be monitored automatically. Resolution-time SLAs are measured against a company's own incident-management process — how quickly an alert reaches a human, how quickly that human correctly triages severity, how quickly the right specialist is engaged, and how quickly a fix is deployed and verified. Every one of those steps is a process and staffing question, not an infrastructure question, which means the honest baseline for a resolution-time commitment comes from MTTR data segmented by severity, not from the same trailing-uptime dataset used for the availability commitment.
This distinction matters because a company can have excellent uptime and a mediocre resolution-time track record, or the reverse, and a resolution-time promise that's disconnected from the company's actual staffing model creates its own breach exposure independent of the uptime number. A common failure pattern: a company with a single, US-hours-only on-call rotation offers a global enterprise customer a "critical issues resolved within 4 hours" commitment without qualifying it by time zone or business hours, because the clause was copied from a template written for a different customer segment. An incident that starts at 2 a.m. in the on-call engineer's time zone, and takes 90 minutes just to page a second responder who can diagnose the specific subsystem involved, breaches a 4-hour resolution commitment before the team has even finished triage — not because the engineering was bad, but because the commitment assumed a staffing model the company doesn't actually run.
Hypothetical worked example — a resolution-time breach in a support-heavy SaaS contract. A hypothetical mid-market SaaS vendor (illustrative, not a real company) has a $240,000 annual contract, billed monthly at $20,000, with a resolution-time SLA: critical (P1) issues resolved within 4 hours, with a credit of 15% of the monthly fee for each P1 breach, capped at 60% of the monthly fee regardless of how many P1 issues breach in a given month. In one month, a data-sync bug causes three separate P1 incidents for this customer, two resolved within the 4-hour window and one taking 6 hours and 40 minutes to resolve because the root cause required a schema migration that couldn't be safely rushed.
- One P1 breach in the month: 15% credit
- Credit owed: 15% × $20,000 = $3,000 for that month
Because only one of the three P1 incidents actually breached the 4-hour threshold, the exposure is a single 15% credit rather than the 60% cap — but it's worth noting explicitly that the cap exists precisely because resolution-time SLAs, unlike uptime SLAs, can generate multiple independent breach events within a single short measurement period if a company is having a genuinely bad month, and an uncapped per-incident credit structure could compound quickly in a way a monthly uptime percentage, which is a single calculated number, cannot.
The practical takeaway is that a resolution-time commitment needs its own underwriting exercise, using the company's segmented MTTR-by-severity data and an honest look at staffing coverage (time zones, on-call depth, specialist availability) rather than being copied wholesale from the uptime clause's due diligence. A company that has done the uptime-headroom math carefully but offered a 4-hour critical resolution commitment without checking it against its actual after-hours staffing model has only solved half the underwriting problem.
Error Budgets Are an Internal Tool. SLAs Are External Financial Instruments. Conflating Them Is a Mistake in Both Directions.
Site reliability engineering practice, formalized in Google's widely cited SRE literature, uses the concept of an error budget: the inverse of a service level objective, expressed as an allowable failure rate over a defined period, used to make internal engineering decisions about release velocity and risk tolerance. Google's SRE book is explicit that "100% is probably never the right reliability target," because pursuing it consumes engineering effort disproportionate to what users actually need or notice, and because "extreme reliability comes at a cost: maximizing stability limits how fast new features can be developed." The SRE workbook's error budget policy material describes a specific operational mechanism: when a service has exceeded its error budget for a defined recent window, non-critical releases halt until the service is back within its target, converting a subjective reliability debate into a threshold-based, largely automatic decision.
That is a genuinely useful concept, and companies without any formal SLO/error-budget discipline internally are giving up a real tool for managing the trade-off between shipping velocity and reliability. But it is important to be precise about what an error budget is for: it's an internal engineering decision mechanism, tuned to a team's own risk tolerance and release cadence, not automatically the same number that belongs in a customer contract.
There are two specific reasons the internal SLO and the external contractual SLA should usually not be the same number. First, an internal SLO is a target the team is actively managing toward and can adjust the moment it's proving unrealistic — if a service is burning its error budget too fast, the team can halt releases and course-correct within days. A contractual SLA, once signed, cannot be adjusted mid-term without a renegotiation the customer may not agree to; it needs to survive a full contract period, often a year or more, without the benefit of an internal course-correction. Second, an internal SLO failure has internal consequences (a release freeze, an internal postmortem). A contractual SLA failure has external, financial, and relationship consequences the moment it happens, calculated automatically by whatever formula is in the contract, with no opportunity for engineering judgment to intervene before the credit is owed.
The practical implication: the contractual number offered to a customer should generally sit at or below the internal SLO, with the gap between them functioning as exactly the kind of deliberate headroom described in the previous section. A team with an internal SLO of 99.95% and a well-managed error budget around it is in a reasonable position to contractually promise 99.9%, keeping the internal target as the more ambitious, non-contractual goalpost. A team that sets its contractual SLA equal to its internal SLO has removed its own margin for error twice over — once by only building for average performance, and again by making that average the number a customer can hold it to financially. And a team that has no internal SLO or error-budget discipline at all has no principled way to know what number it's even close to keeping, which is its own signal that a customer-facing SLA number chosen right now is a guess, not a commitment.
When an SLA Commitment Justifies New Investment — and When It Doesn't
Once a company has real measured data and a defensible headroom calculation, the next question is what to do when a specific deal, or a specific customer segment, wants a number the current infrastructure genuinely can't support with adequate margin. There are two legitimate responses — invest in reliability to earn the number, or negotiate a different number — and the mistake most commonly made is treating "invest" as the default without running the comparison.
Table 2 — Decision matrix: invest in reliability, or renegotiate the SLA structure
| Signal | Favors investing in reliability | Favors renegotiating the SLA instead |
|---|---|---|
| Size and durability of the deal(s) at stake | One or a small number of very large, multi-year accounts specifically require the tighter number | The tighter number is being requested broadly, by many mid-size accounts, none of which individually justifies the investment |
| Root cause of the current gap | Gap is caused by your own architecture (single points of failure, manual failover, undertested deploy process) — addressable with defined engineering work | Gap is caused primarily by a third-party dependency's own SLA ceiling (the composability problem) — no amount of your own engineering closes it |
| Cost shape of the fix | The fix is a bounded, one-time architectural investment (add redundancy, automate failover, add a read replica) with a knowable cost and timeline | The fix would require open-ended, ongoing investment (multi-region active-active, vendor diversification, 24/7 follow-the-sun on-call) whose cost keeps scaling with the target |
| Effect on the rest of the product | The investment also improves reliability for the whole customer base, not just the one demanding account | The investment is narrowly custom to one account's contractual demand and doesn't generalize |
| Alternative contract terms available | None — the customer's procurement policy has a hard floor on the percentage with no flexibility | The customer is open to a different structure: a lower percentage with a lower credit cap, a usage-based/tiered credit definition instead of a binary breach, or a longer measurement window (quarterly instead of monthly, which smooths out single bad days) |
Hypothetical scenario 3 — an enterprise vendor's tiered SLA portfolio. A more mature SaaS company (illustrative, not a real company) with an established base of mid-market customers on a standard 99.9% SLA is approached by a large enterprise prospect asking for 99.99% with an uncapped credit structure, as part of a deal that would be the company's largest to date. Engineering leadership is asked, for the first time in the company's history, to weigh in before the number is offered. The honest answer: the company's trailing measured uptime is 99.92%, comfortably above the standard 99.9% commitment with reasonable headroom, but well short of 99.99% — a target that implies roughly 52 minutes of allowable downtime a year against the company's actual recent pattern of closer to 7 hours. Closing that gap would require multi-region active-active infrastructure, automated cross-region failover, and a meaningfully larger on-call rotation — a real, ongoing cost, not a one-time project, and one that would need to be sized against this single account's revenue, since the rest of the customer base isn't asking for it.
Rather than either refusing the deal or quietly agreeing to a number the data says is not achievable, the company brings a counter-structure to the negotiation: 99.95% (still tighter than the standard tier, and within reach of the measured baseline with a modest, defined margin), paired with a credit structure that scales by severity — a smaller credit for a shallow breach, a larger one for a severe one — rather than the customer's originally proposed binary "any breach equals full remedy" clause, and with the credit capped at the monthly fee rather than left open-ended. The enterprise customer, whose actual operational concern was avoiding a repeat of a bad experience with a previous vendor's prolonged outage rather than requiring literally 99.99%, accepts the revised structure. The company got the deal without contractually promising a number its own data said it would likely fail, and without committing to an open-ended infrastructure investment sized for one account.
The scenario illustrates the two-sided nature of the decision: sometimes the right move genuinely is investment, when the gap is self-inflicted and the fix is bounded and broadly useful. Sometimes it's a different negotiated structure, when the gap is set by a vendor ceiling or an open-ended cost curve, and the customer's real concern can be addressed without matching their first-offer number exactly.
Startup, Scale-up, Enterprise: The Same Percentage Means a Different Bet
The right process for setting an SLA number, and the right amount of caution around it, changes with company stage — not because the arithmetic changes, but because the confidence in the inputs does.
Table 3 — SLA approach by company stage
| Company stage | Typical starting point | Biggest risk in SLA design | Recommended default approach |
|---|---|---|---|
| Startup negotiating its first few enterprise contracts | Little or no meaningful incident history; system largely untested at scale | Promising a template number ("99.9%, industry standard") with no data behind it at all, and with a system about to be stressed by the growth the contract itself represents | Offer the lowest number the deal will tolerate; be explicit internally that any number offered now is a judgment call, not a measured commitment, and revisit it formally at the one-year mark once real data exists |
| Scale-up with a standard SLA template applied uniformly | Real trailing data exists, usually 12+ months, but is applied as one-size-fits-all across very different customer sizes and technical profiles | Applying the same number to a $10,000/year account and a $500,000/year account, when the cost of a breach and the customer's leverage to enforce escalation differ enormously | Recalculate headroom periodically (at least yearly) against updated trailing data; consider segmenting the standard SLA by account size or criticality rather than one template for all |
| Enterprise with a portfolio of differentiated SLA tiers | Rich historical data, often segmented by product line, region, or infrastructure tier; dedicated commercial/legal function managing contract terms | Tiers drift out of sync with actual measured reliability over time as infrastructure changes, without a formal review cycle to catch it; the tier that was conservative three years ago is now aggressive because the product surface has grown | Establish a recurring (at minimum annual) formal review connecting current measured reliability to each SLA tier's headroom, owned jointly by engineering and the commercial/legal function that manages the contract templates |
The common thread is that the underwriting discipline doesn't stop being necessary once a company graduates from "startup guessing" to "enterprise with real data." It changes shape — from "we don't have enough data yet, so be conservative" to "we have plenty of data, so build a formal, recurring process to keep the promise honest as the system and the business change."
A handful of concrete warning signs tend to show up before an SLA number formally drifts out of sync with what a company can actually deliver, and they're worth watching for regardless of stage. A rising trend in the number of incidents even while total downtime minutes stay flat often means MTTR has improved while MTBF has quietly worsened — a pattern that erodes customer trust and increases the odds of hitting a termination-for-cause threshold measured by breach count, even though the raw uptime percentage still looks acceptable. A growing gap between component-level dashboards reporting "green" and customer support tickets reporting problems usually means the measurement methodology has stopped reflecting the end-to-end experience, and any SLA number benchmarked against the dashboard rather than the ticket volume is quietly optimistic. And a standard SLA template that hasn't been revisited since before a major architectural change — a move to a new cloud region, the addition of a new hard third-party dependency, a significant increase in transaction volume during peak periods — is a template that was priced against a system that no longer exists in its current form, whether or not anyone has noticed yet.
A Pre-Signature SLA Review Checklist
The following is a practical checklist for a CTO, VP of Engineering, or founder to run through before signing off on a customer-facing SLA number — whether it's a single deal-specific commitment or a change to a standard contract template. This is not a substitute for legal review of the actual contract language; it's the engineering-side diligence that should happen before the number reaches a lawyer's desk, so legal is reviewing a number the business can actually defend rather than one it's discovering for the first time.
- Has the proposed number been checked against trailing twelve-month measured uptime, calculated end-to-end (the customer's actual critical path), not component-by-component?
- Has the worst single month in that trailing window been identified, not just the average — and does the proposed number have headroom against the worst month, not just the mean?
- Has every hard, synchronous third-party dependency in the measured critical path been identified, along with its own published or negotiated SLA, so the composability ceiling is known rather than assumed?
- Is the definition of "downtime" or "unavailable" in the proposed contract language specific and measurable (a defined error rate or latency threshold, not just "the service doesn't work"), and does it match how the internal measurement is calculated?
- Are exclusions (scheduled maintenance, force majeure, third-party root cause, customer-caused issues) explicitly scoped, and has someone checked whether they're broad enough to be defensible without being so broad they're commercially meaningless to the customer?
- Is the credit structure tiered by severity, or is it a single binary threshold that pays the same remedy for a one-minute breach as a six-hour one?
- Is the credit capped, and if so, at what — the monthly fee, the annual contract value, or something else — and does everyone who approved the deal understand what the uncapped or capped exposure actually is in dollars?
- What is the termination-for-cause threshold (number of breaches, over what rolling period), and has anyone calculated the probability of hitting it given the company's actual historical breach frequency?
- Who owns re-checking this number on a defined cadence (annually, at minimum, or after any material infrastructure or vendor change), and is that ownership assigned to a specific role rather than left implicit?
- Has engineering leadership actually seen and signed off on the number being offered, before it's in a contract, rather than after?
Who Owns This Number
The organizational fix implied by everything above is not complicated, even though it's rarely formalized: SLA numbers should be jointly owned by engineering (which supplies the real reliability data and an honest, technically grounded read of what's achievable without disproportionate cost) and whoever owns commercial contracts — legal, deal desk, or a VP of Sales in smaller companies — who translates that data into credit structures, exclusions, and escalation terms that are legally sound and commercially competitive.
Neither side should own the number alone. Engineering alone, left to set the SLA in isolation, will tend toward excessive conservatism that costs deals unnecessarily — a system with 99.95% measured uptime and healthy headroom can often support a 99.9% commitment without meaningful additional risk, but an engineering team asked in isolation, with no visibility into what the deal is worth or what a competitor is offering, may reflexively lowball the number out of caution. Commercial teams alone, setting the number from competitive benchmarking with no engineering input, produce exactly the failure mode this article opened with.
In practice, this usually means a short, recurring process rather than a one-time policy: whenever a customer negotiation involves a non-standard SLA request, or at least once a year for the standard template, someone in engineering pulls the current trailing data (uptime, worst month, dependency composability, MTTR/MTBF) and someone on the commercial or legal side translates that into proposed contract language, with both sides seeing the final number before it's offered.
Table 4 — A minimal responsibility map for the SLA lifecycle
| Activity | Primary owner | Consulted | Approves before it's offered externally |
|---|---|---|---|
| Pulling trailing uptime, MTTR/MTBF, worst-month data | Engineering / SRE lead | — | — |
| Identifying third-party dependency ceilings (composability) | Engineering | Whoever manages vendor contracts | — |
| Translating data into a proposed percentage and headroom | Engineering leadership (CTO/VP Eng) | Finance (for credit exposure sizing) | — |
| Drafting credit structure, exclusions, termination triggers | Legal / commercial contracts owner | Engineering leadership | — |
| Final number offered to a specific customer | Sales / deal desk | Engineering leadership, legal | CTO or VP Engineering, plus whoever owns commercial risk (CRO, GC, or founder in smaller companies) |
| Annual (or post-incident) review of standard template against updated data | Engineering leadership | Legal, sales leadership | CTO or founder |
A structure like this doesn't need to be heavyweight or slow down every deal — for a standard, already-vetted template, the "approves" step can be a five-minute confirmation that nothing material has changed since the last review. Its value is in making sure that step exists at all, rather than the number reaching a contract with no one outside sales having looked at it. This is also the point worth stating plainly: none of the analysis in this article is legal advice, and the actual language of exclusions, credit caps, termination triggers, and liability limitations in any specific contract should be reviewed by qualified counsel familiar with the relevant jurisdiction and the customer's own redlines — the engineering-side measurement work described here is what makes that legal review productive, by giving counsel a defensible number to draft around instead of an arbitrary one.
Frequently Asked Questions
Should a startup with no meaningful uptime history ever agree to a specific SLA percentage? Yes, often unavoidably — many enterprise buyers won't sign without one. The discipline that matters at this stage isn't refusing to commit, it's being explicit internally that the number is a judgment call made without real data, keeping it as conservative as the deal will tolerate, capping the credit tightly, and setting a firm date (commonly the one-year mark) to revisit the number once actual incident history exists.
Is offering a lower published uptime number than competitors a real competitive disadvantage? Sometimes, but less often than sales teams assume. Many enterprise buyers care more about the credibility and specificity of the commitment — a well-defined measurement methodology, clear exclusions, and a track record of honoring the number — than about the headline percentage itself. A vendor that has never breached a 99.9% commitment is often a safer bet in a buyer's eyes than one offering 99.99% with a history the buyer can't verify.
How does a usage-based or tiered credit structure differ from a binary breach definition, and why does it matter? A binary structure pays the same remedy whether the system was down for two minutes or two hours, as long as both cross the same monthly threshold. A tiered structure, like the ones cloud providers use (shown in Chart 2), scales the credit with the severity of the shortfall. Tiered structures are generally better for both sides: they avoid a cliff-edge dispute over whether a marginal breach counts, and they align the financial remedy more closely with the customer's actual experienced harm.
Does every service or feature need to be covered by the same SLA number? No, and treating them uniformly is a common source of unnecessary exposure. Core, revenue-critical paths (login, checkout, the primary workflow the product exists to support) usually justify tighter measurement and a real contractual commitment. Secondary or auxiliary features can often be explicitly excluded from the measured scope, which is both more honest about where reliability investment has actually gone and reduces the surface area exposed to a credit calculation.
What's a reasonable default SLA for a company with genuinely no reliable incident data yet? There's no universally correct number, but the reasoning process matters more than the specific figure: choose something below what the sparse data suggests, keep the credit capped and modest, keep the measurement window monthly rather than something stricter, and treat the number explicitly as provisional pending a full year of real data — not as a permanent commitment made once and forgotten.
How should a company handle SLA commitments when it wants to expand into a new customer segment that expects tighter guarantees than the current infrastructure was built for? Treat it as a build-versus-buy decision on reliability, not as a contract term to concede on quickly. Model the segment's aggregate revenue opportunity against the ongoing cost of the infrastructure investment required to support the tighter number for everyone, not just the first account, since a bespoke reliability tier built for one customer rarely stays bespoke once a second enterprise prospect asks for the same thing. If the segment is large enough to justify the investment on its own economics, build it deliberately, on a timeline that precedes the contractual commitment rather than following it. If the segment is a handful of accounts, the tiered, capped, and negotiated structure described in the decision matrix above is usually the more defensible path than quietly guessing the infrastructure will hold.
The Decision This Really Is
An uptime SLA is not a marketing claim and not a technical footnote. It is a number that determines, in advance, exactly how much money changes hands and under what conditions a customer can walk away, calculated automatically the moment a measurement crosses a threshold someone chose before they had the data to choose it responsibly. Treating that number as something sales negotiates and engineering merely lives with afterward gets the ownership backward. The number should be priced, the way any other financial commitment with a defined trigger and payout is priced: against real historical data, with an explicit, deliberate margin for the variance that real systems have, and with a clear-eyed view of which dependencies outside the company's control already cap what's achievable before a single line of new code gets written.
The question worth taking back to a leadership team is not "what uptime number sounds competitive." It's this: if the SLA sitting in your current contracts triggered a breach next month, based on your own last twelve months of incident data, would that be a surprise — or would it be roughly what the numbers already predicted?