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.
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.
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.
undefined, calling a method that does not exist on some browser, a null that slipped through. Depending on where it lands, it can kill one interaction or the entire application shell..catch is missing, and the flow that depended on it silently never completes. Nothing crashes; something just never happens.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.
The mechanics are straightforward and standard:
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.
Collection is only useful if it changes behaviour. Three practices make it operational:
POST /api/orders reports from browsers is often the first visible sign of a backend problem — before the API's own checks confirm it, because users generate far more traffic than probes do.| Definition | Failures occurring in the browser after successful page delivery — exceptions, rejections, failed requests, failed resources |
|---|---|
| Why server monitoring misses them | The server completed its work and logged a 200; the failure happened afterwards, client-side |
| Typical user response | Retry, self-blame, leave — reported in only a small minority of cases |
| Detection method | In-page reporter → collection endpoint → fingerprint grouping → rate vs the site's own baseline |
| The alerting signal | Hourly error count many times the site's usual hour — not the mere presence of errors |
| Privacy essentials | Strip query strings, redact tokens/emails, no cookies, no user identity |
| Highest-value correlation | Error spikes read next to deployment events |
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.
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.
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.
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.
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.
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.
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.
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.