Reliability

Your application is up. So why are users still having problems?

"It says 100% uptime." "Well, it doesn't work." Two true statements, one gap — and the gap is where your unexplained churn lives.

A green uptime dashboard beside a frustrated user

An application can be fully "up" — servers healthy, uptime checks passing — while users experience real failures, because uptime measures whether the server answers, not whether the product works. Frontend exceptions, failing API calls behind a loaded page, broken flows in specific browsers, degraded third-party services and painful latency all happen on the working side of an uptime check. Closing the gap means monitoring the layers users actually experience: what runs in their browsers, what each endpoint returns, and how fast — measured against what "normal" means for your application.

Key takeaways
  • "Up" is a statement about servers; "working" is a statement about user experience. They are different measurements and they diverge routinely.
  • The gap has five main residents: frontend errors, per-endpoint failures, slow-as-broken latency, third-party degradation, and segment-specific breakage.
  • Users experiencing the gap rarely report it — they retry, distrust, and leave, so the gap converts directly into churn.
  • Every resident of the gap is independently monitorable; none requires exotic tooling.
  • The cultural fix matters too: treat "users report problems while dashboards are green" as a monitoring bug, not a user mystery.

What uptime actually measures

An uptime check asks one question: did the server return an acceptable response to this request? It is a good question — necessary, cheap, and the right first layer. But hold it against what a user needs for the product to "work":

  1. DNS resolves, TLS handshakes, the page arrives (this much, uptime verifies);
  2. the JavaScript bundle parses and executes without fatal errors;
  3. the page's own API calls succeed — auth, data, actions;
  4. responses arrive fast enough that the user does not give up;
  5. third-party pieces — payments, maps, auth providers — do their part;
  6. all of the above holds in that user's browser, not just in Chrome-latest-on-fibre.

Uptime verifies step 1 of 6. The other five steps fail independently and invisibly — invisible, that is, to any monitoring that stops at step 1. That is the entire mystery of "up but broken", dissolved: the dashboard and the user are answering different questions.

The five residents of the gap

Why users do not tell you

The gap persists because its victims are quiet. A user facing an error they cannot explain assumes their WiFi, retries, and — if it still fails — leaves. Reporting requires effort, a channel, and a belief that reporting helps; a competitor's tab requires none of those. The few reports that do arrive are stripped of everything diagnostic: "the site doesn't work" — no error text, no browser, no timestamp, no route.

So the feedback loop teams implicitly rely on — if it were really broken, we would hear about it — is broken precisely where it is needed most. The gap's failures are experienced individually, reported almost never, and accumulate as churn attributed to pricing, competition, or fate. Waiting for reports means waiting for the least reliable sensor in the system.

Closing the gap, layer by layer

Each resident has a specific monitor:

  1. Browser error collection for frontend failure — errors from real browsers, grouped, judged against the site's own baseline. This single addition typically surprises teams most, because it illuminates the largest dark area.
  2. Per-endpoint checks with assertions for partial failure — the endpoints that map to money, individually, status and content asserted.
  3. Latency baselines for slow-as-broken — percentiles per endpoint against their own history, with deviation treated as seriously as failure. A check that passes in 9 seconds should not count as "fine" when its normal is 400ms.
  4. Vendor status integration for third parties — their feeds consumed automatically, mapped to the services that depend on them, so "broken because Stripe" is a monitoring conclusion rather than a two-hour investigation.
  5. Error telemetry sliced by environment for segment breakage — browser-family context on collected errors turns "works on my machine" into "fails specifically on X", which is a fixable statement.

Teams that add these layers consistently report the same experience: the first week is uncomfortable — the gap was bigger than assumed — and every week after is calmer, because "healthy" finally means what users mean by it.

When the gap is caused by a provider rather than your own code, is it us or them? covers the first ten minutes.

Quick reference

The core mismatchUptime measures server response; users measure whether the product worked in their browser
Steps uptime verifies1 of 6: delivery — not execution, API success, speed, third parties, or per-browser behaviour
The five gap residentsFrontend failure, per-endpoint failure, slow-as-broken, third-party degradation, segment breakage
Why it persistsVictims retry and leave rather than report; the reports that arrive carry no diagnostics
Business signatureGreen dashboards + unexplained churn + occasional vague "it doesn't work" reports
The fixMonitor each layer: browser errors, per-endpoint checks, latency baselines, vendor feeds, per-browser telemetry

Frequently asked questions

How can an application be up but not working?

Because "up" only means the server answers requests. The product can still fail after delivery: JavaScript errors in the browser, specific API endpoints failing behind a loaded page, responses too slow to use, third-party services degrading, or breakage limited to certain browsers. All of these occur on the passing side of an uptime check.

Why do users experience problems my monitoring doesn't show?

Your monitoring is answering a narrower question than your users are. An availability check verifies delivery; users experience execution, per-endpoint behaviour, speed and third-party dependencies. Failures in those layers — which are the majority of user-facing failures — need their own monitors: browser error collection, per-endpoint checks, latency baselines and vendor status feeds.

Is slow performance an outage?

Functionally, often yes. Requests that succeed after many seconds pass every status check while users abandon the task. Treat latency at several times an endpoint's own baseline as an incident-grade signal, because that is how users are treating it.

How do I find problems that only affect some browsers?

Collect frontend errors with browser-family context attached. Segment-specific failures are invisible to server-side monitoring and to testing on the team's own machines; field telemetry is what converts "works for us" into "failing specifically in this browser family since Tuesday's deploy".

What is the fastest way to close the uptime-vs-experience gap?

Add browser error collection first — it illuminates the largest unmonitored layer with a single script tag. Then add individual checks with latency baselines on the handful of endpoints behind login, core data and payment, and subscribe your monitoring to your key vendors' status feeds. Those three steps cover most of the gap for most applications.

Do third-party failures count as my problem?

To your users, yes — they experience your product as broken regardless of whose incident it is. Monitoring vendor status feeds and mapping dependencies lets you respond honestly (status page, in-app notice) and stops your team burning hours debugging code that was never at fault.

How Merik handles it

Merik is built around exactly this gap. Uptime checks cover the front door; the merik.js snippet watches what actually happens in users' browsers — exceptions, rejections, failed requests, grouped per site and judged against that site's own usual hour, with browser-family context for the segment-specific cases. Per-endpoint checks with content assertions and 14-day latency baselines cover the rooms behind the door, and "slow against its own normal" feeds early warnings with the same seriousness as failure.

Vendor status feeds are integrated and mapped per asset, so a payment-provider outage becomes an explained, suppressed incident instead of a mystery — and instead of forty pages. The result is a health picture that answers the user's question rather than the server's: not "did it respond?" but "is it working?" — and when the two diverge, you hear about it from Merik, not from churn.

Create your workspace →

Or talk to us about your team →