Errors

Frontend errors: why users see problems before your team does

Every uptime check passes. The server logs are clean. And a user just met a button that does nothing. Welcome to the failure class your monitoring cannot see from the server side.

A browser showing errors while the server reports success

Frontend errors are failures that happen in the user's browser after the server has successfully delivered the page — JavaScript exceptions, unhandled promise rejections, failed API calls, and scripts or resources that never load. They are invisible to server-side monitoring by construction: the server did its job, returned a 200, and logged a success. The failure happened afterwards, on a machine you do not control, in one of a thousand browser-extension-network combinations you cannot reproduce. Detecting them requires monitoring in the one place they actually occur: the browser itself.

Key takeaways
  • A frontend error means the server succeeded and the user still failed — which is exactly why server-side monitoring cannot see it.
  • The more logic moves into the browser (SPAs, client-side routing, client-side API calls), the more failures move there with it.
  • Frontend errors are environmental: they often occur only in certain browsers, extensions or network conditions, so "works on my machine" is true and useless.
  • Users report almost none of them — they retry, then leave. The absence of complaints is not the absence of errors.
  • Detection means collecting errors from real browsers, grouping them by signature, and judging the rate against that site's own normal.

The gap between "delivered" and "working"

Server-side monitoring — uptime checks, status codes, server logs — verifies delivery: the request arrived, was processed, and a response went out. For a static document, delivery is the whole job. For a modern web application it is roughly the first half.

After delivery, the browser must parse and execute a JavaScript bundle, hydrate or render the UI, attach event handlers, and begin making its own API calls. Any of those steps can fail — and when one does, the user is left with something that looks like a page: it has a header and a layout and perhaps a spinner, but the button does nothing, the form will not submit, the data never arrives. From the server's perspective, this session was a success.

This is the structural reason users report problems while every dashboard is green: the dashboards watch the half of the work that succeeded.

The four kinds of frontend failure

Why nobody reports them

The comforting assumption is that if something were really broken, users would say so. The data from every team that has ever added frontend error collection says otherwise. Users almost never report errors, for predictable reasons:

So the reporting rate rounds to zero, and the one report you do get — "the page doesn't work" — arrives with no error text, no browser, no reproduction steps. Meanwhile the browser knew the exact exception, file, line and stack the whole time. Frontend monitoring is simply deciding to collect what the browser already knows.

How frontend error monitoring works

The mechanics are straightforward and standard:

  1. A small script in the page registers for the browser's global error events — uncaught exceptions, unhandled rejections, resource failures — and optionally observes failed fetch calls.
  2. Errors are reported to a collection endpoint in small batches, with the message, the source file, and the page path. A sensible reporter caps its queue and never lets its own reporting break the page it watches.
  3. The collector groups them. Ten thousand users hitting the same bug produce ten thousand near-identical messages differing only in IDs and numbers. Normalising those away and hashing the shape — the fingerprint — turns a flood into a short list: this error, this many times, since this hour.
  4. Rates are judged against that site's own baseline. Every real-world site has background errors (extensions, ancient browsers, bots). The signal is never "there are errors"; it is "this hour has 18× the usual errors", which almost always means a deploy just broke something.

Privacy is a design requirement, not a feature. Error messages and URLs love to carry tokens, emails and query strings. A responsible pipeline strips query strings, redacts token-shaped and email-shaped content before storage, sets no cookies, and collects no user identity. This matters doubly if you run other people's websites — you are instrumenting their users.

From error list to action

Collection is only useful if it changes behaviour. Three practices make it operational:

Quick reference

DefinitionFailures occurring in the browser after successful page delivery — exceptions, rejections, failed requests, failed resources
Why server monitoring misses themThe server completed its work and logged a 200; the failure happened afterwards, client-side
Typical user responseRetry, self-blame, leave — reported in only a small minority of cases
Detection methodIn-page reporter → collection endpoint → fingerprint grouping → rate vs the site's own baseline
The alerting signalHourly error count many times the site's usual hour — not the mere presence of errors
Privacy essentialsStrip query strings, redact tokens/emails, no cookies, no user identity
Highest-value correlationError spikes read next to deployment events

Frequently asked questions

What are frontend errors?

Frontend errors are failures that occur in the user's browser after the server has successfully delivered a page: uncaught JavaScript exceptions, unhandled promise rejections, failed API calls made by the page, and scripts, styles or images that fail to load. They break the user's experience even though every server-side signal shows success.

Why doesn't server-side monitoring catch frontend errors?

Because from the server's perspective nothing failed. The request was processed and a valid response was delivered; the error happened later, during JavaScript execution on the user's machine. Only code running in the browser itself can observe that failure and report it.

How do I monitor JavaScript errors in production?

Add a small reporting script to your pages that listens for the browser's global error and unhandledrejection events, plus resource load failures, and sends them in batches to a collection endpoint. The collector should group errors by normalised fingerprint and track each group's hourly rate against the site's own baseline, alerting on strong deviations rather than on individual errors.

Do users report broken pages?

Rarely. Most users blame their own connection, retry, and leave if the retry fails. Many frontend failures — an unhandled rejection that quietly stops a save — are invisible even to the user in the moment. Teams that add frontend error collection consistently discover failures that had been occurring for weeks with zero user reports.

Why are frontend errors so hard to reproduce?

Because they are environmental. They may occur only in one browser version, with a particular extension interfering, on a slow connection where a request times out, or in a race that needs specific timing. The developer's machine — fast, modern, extension-free — is the one environment least likely to reproduce them, which is why collecting the error's actual message, source and page from the field matters.

Is some level of frontend errors normal?

Yes. Real-world sites always show background errors from extensions, outdated browsers and automation. That is why the meaningful signal is deviation — this hour's rate versus the site's usual hour — not the existence of errors. A stable background hum is technical debt to triage; an 18× spike is a regression to act on now.

Can frontend monitoring violate user privacy?

It can if done carelessly, because error messages and URLs often carry query strings, tokens and emails. A responsible pipeline strips query strings at the source, redacts secret-shaped and personal-shaped strings before storage, sets no cookies and collects no user identity. If you operate client websites, this diligence is owed to your clients' users too.

How Merik handles it

Merik's browser SDK is a single script tag — no build step, no dependencies. It reports uncaught exceptions, unhandled rejections, failed requests and failed resources from real browsers, capped and de-duplicated so a runaway error loop cannot flood anything. Privacy is enforced twice: the snippet never reads cookies, form contents or query strings, and the collector redacts token-shaped, email-shaped and card-shaped content again on arrival before anything is stored.

Errors are grouped by fingerprint into hourly counts per site, so "user 4821 not found" and "user 9317 not found" are one bug with a counter, not two thousand rows. Each site's own history sets its normal; when an hour runs many times that normal, it feeds the asset's early warning alongside uptime and latency evidence — and if a deploy landed just before, the warning says so. The failures your uptime checks structurally cannot see, finally on the same screen as the ones they can.

Create your workspace →

Or talk to us about your team →