Blog
Uptime says your system is running, availability says users can actually use it. Learn where they split, how to count degraded time and what belongs on a status page.
The difference in uptime vs availability is the difference between reachable and usable. Uptime is the share of time a system is running and answering. Availability is the share of time, or of requests, in which users can actually complete what they came for. A server can report 100% uptime for a month while checkout was broken for an afternoon, so if you promise or report anything to customers, measure availability from the user's side and publish it per component.
Uptime is a property of a machine or process. The host is powered on, the process is alive, the port accepts connections, the health endpoint returns 200. It answers the question: is it running?
Availability is a property of a service as experienced by its users. A request arrives, gets a correct response, within a time the user accepts. It answers the question: can people use it?
Both are usually expressed as a percentage, which is why they get mixed up. The formulas look similar but count different things:
uptime = time the system was running / total time
availability (time-based) = minutes in which users could succeed / total minutes
availability (request) = successful valid requests / all valid requestsThe definition of "succeed" is where all the work is. If you have not written it down, you are measuring uptime and calling it availability.
Most real incidents in small SaaS teams do not take a server offline. They leave everything running and break something in between. Typical cases where uptime stays green and availability drops:
200 OK with an error page, a blank shell or a maintenance banner rendered by the framework.It also works the other way round. With redundancy, availability can be higher than the uptime of any single part. If one of three app servers is down for an hour behind a load balancer, host uptime drops, but users may never notice. That is why host uptime is a poor customer-facing metric in both directions: it overstates problems that redundancy absorbs and hides problems that no single host owns.
Uptime tells you whether your infrastructure is running; availability tells you whether your customers can use the product. Report the second one.
A binary up/down model breaks as soon as only part of the product fails or everything gets slow. You need explicit rules, decided before the incident, not during the monthly report.
A partial outage means some users or some features are affected. The cleanest way to count it is to split the service into components that match what users do, then compute availability per component. "Checkout unavailable for 90 minutes" is honest and useful. Folding it into one global percentage either hides it or exaggerates it.
If you need a single number, request-based availability handles partial failures naturally: if 20% of requests fail for an hour, that hour counts as 20% bad, not 0% or 100%.
Degraded performance is the hardest case, because nothing fails. Pick a latency threshold above which a request or minute counts as unavailable, and write it next to the formula. For example: a minute is bad if checks fail or if the response time from users' regions exceeds 2 seconds. The exact value is your decision and should come from what your users tolerate, not from a benchmark.
Three common options, from strict to lenient:
A 30-day month has 43,200 minutes. Assume no server went down, checkout returned errors for 90 minutes, and the whole app was slow above your threshold for another 120 minutes.
host uptime = 43200 / 43200 = 100.00%
checkout availability (errors) = (43200 - 90) / 43200 = 99.79%
checkout availability (+ slow) = (43200 - 210) / 43200 = 99.51%Same month, three defensible numbers. Which one you report depends on your written definition. The mistake is reporting the first while users experienced the third.
Measuring availability means testing what users do, from where they are, with success criteria stricter than "the port is open". A practical sequence:
A minimal external check that tests usability rather than reachability:
code_time=$(curl -s -o /tmp/body -w "%{http_code} %{time_total}" \
--max-time 10 https://app.example.com/api/health)
code=${code_time% *}; t=${code_time#* }
[ "$code" = "200" ] || echo "FAIL status $code"
grep -q '"db":"ok"' /tmp/body || echo "FAIL dependency"
awk -v t="$t" 'BEGIN { exit !(t > 2.0) }' && echo "DEGRADED ${t}s"And a request-based availability ratio from metrics, here in PromQL, counting 5xx as failures:
sum(rate(http_requests_total{job="api",code!~"5.."}[30d]))
/
sum(rate(http_requests_total{job="api"}[30d]))Decide what "valid" means before you trust this number. Requests rejected with 4xx because of a client bug or an attacker usually should not lower your availability; a 429 caused by your own overloaded rate limiter probably should.
Users visit a status page to answer one question: is the thing I am trying to do broken, and is it me? Host uptime does not answer that. Availability per component does.
worker-03 is.Whether degraded time turns a day's bar yellow or red should follow the same rule you use for your availability number. If the page shows green while support is flooded, the page loses its purpose. The article on status page components, honest status levels and update cadence goes deeper into that part.
If you use m0nitor, the building blocks map onto the steps above. Uptime checks for websites, APIs and servers run on a fixed interval from probes in several regions, and an outage is only confirmed when multiple locations agree, which keeps single-route blips out of the record. Monitor types include HTTP(S), TCP and UDP ports, SSH, ping, DNS, SSL certificate expiry and heartbeat monitors for scheduled jobs, plus manual static components for things you cannot probe directly.
Hosted status pages show those monitors as components with incident history, can run on a custom domain and notify email subscribers. Other monitoring setups work just as well with the approach in this article; what matters is that checks test usability and components reflect user journeys.
No. Uptime measures whether a system is running and reachable. Availability measures whether users can successfully use the service within an acceptable response time. A system can be up but unavailable, for example when it returns errors from a failed dependency or responds too slowly to be usable.
Either time-based, as good minutes divided by total minutes, or request-based, as successful valid requests divided by all valid requests. Both need a written definition of success that includes status codes, response content and a latency threshold. Request-based availability handles partial outages more accurately; time-based is easier to explain in an SLA.
Yes, at the level of individual components. With redundancy, one server or instance can be down while a load balancer routes traffic to the others, so users see no failure. That is why the uptime of a single host says little about what customers experience.
That depends on your definition. Many SLAs exclude announced maintenance windows from the calculation, but users still cannot use the service during that time. A common approach is to exclude it from the contractual number, show it as maintenance on the status page and keep an internal number that includes it.