A production error page has just asked your customer to open developer tools. That is useful to the developer, not to the person who was trying to sign in or pay. The page does not identify the cause; the first browser error and the release that served it often narrow the problem quickly. Capture both before another deploy replaces the evidence.
Every platform claim below was checked against Next.js and Vercel documentation on 2026-10-07. App Rescue Desk is independent and is not affiliated with either company.
TL;DR
Application error: a client-side exception has occurredmeans uncaught browser code stopped the page. It does not name the broken line or service.- Save the exact URL, action, time, first Console error, first failed Network request and deployment ID before you reload or redeploy.
- If a private window works and the old tab requests a missing
/_next/static/file, stale browser files or version skew are strongly supported. - If several browsers fail on the same action, investigate the shared production code, response data and release instead of clearing every customer’s cache.
- Add an error boundary for a useful fallback, but fix the exception that triggered it.
What does “a client-side exception has occurred” mean?
Next.js can show this production message:
Application error: a client-side exception has occurred
(see the browser console for more information).
Next.js documents the client-side exception as a browser error that an error boundary did not catch. The visible page is a fallback. The useful error remains in the browser Console.
This distinction matters because the message does not say whether the release contains broken JavaScript, the browser loaded files from two releases, or the page crashed while handling an unexpected API response. Treat the message as a location: the failure reached browser code. It is not a root cause.
A server or function can still be involved. For example, a failed request can return a response shape the page does not handle. The browser then throws while rendering that response. In that sequence, the client-side exception is real, but repairing only the fallback leaves the failed request unresolved.
What should you save before reloading the page?
Use the affected browser if it is still open. Do not sign out, clear site data or deploy first.
- Copy the exact page URL.
- Record the action that triggered the error.
- Record the timestamp and timezone.
- Open the browser Console.
- Copy the first relevant error and stack trace.
- Open the Network panel.
- Record the first failed application request.
- Record the deployment ID or commit SHA.
- Remove tokens and customer data before sharing the record.
The first error matters. Later errors often describe components that failed after the original exception had already interrupted the page.
For the failed request, keep the URL path, method, status, resource type and request ID. Do not copy cookies, Authorization headers, access tokens or full customer responses. The production access and evidence policy explains what to leave out of an incident report.
Use a short incident record:
CLIENT-SIDE EXCEPTION RECORD
1. Exact URL:
2. Action before the error:
3. Timestamp and timezone:
4. Affected browser and device:
5. First Console error and stack:
6. First failed application request and status:
7. Private-window result:
8. Second-browser result:
9. Deployment ID or commit SHA:
10. Last known successful release or time:
Can you fix this client-side exception yourself?
One useful self-service case is a failure limited to an old browser tab.
First, preserve the record above. Then open the same URL in a private window. Repeat the same action. If the private window works, return to the original tab and reload it once.
Now compare the evidence. A failed JavaScript request under /_next/static/ in the old tab, combined with a successful private-window test, strongly supports stale browser files or version skew. It does not prove that every affected user has the same state.
Next.js defines version skew as an older client using JavaScript, CSS or data from a different application version after a deploy. Vercel’s Skew Protection documentation explains how deployment IDs can keep framework-managed assets and requests on one deployment. It also states that custom fetch requests are not pinned automatically.
If one reload restores the exact flow and no request fails, record the result and watch for another report. Do not tell all customers to clear every browser cache. That destroys useful state and hides whether the deployment still serves incompatible files.
Stop the self-service test when the error reproduces in a private window or another browser. A shared failure points away from one local browser profile. It needs a code, data or deployment investigation.
Which evidence separates the likely causes?
Read each observation as support, not a verdict.
| Observation | What it supports | What it does not prove |
|---|---|---|
| A private window works; the original tab fails | Browser storage, an extension or stale files are involved | Which browser condition caused the failure |
An old tab gets 404 for /_next/static/... after a deploy |
The tab and current deployment expect different files | That every client-side exception is version skew |
| The same first error appears in several browsers | Shared production code or response data is involved | The exact faulty line without a readable stack |
| The Console reports a hydration mismatch | The server and browser produced different initial output | Why the output differs |
An API request returns 401, 500 or 502 before the exception |
A failed response reached the browser before the crash | Whether the client or server owns the first defect |
| A rollback restores the complete flow | The replaced release is involved | That the rollback removed every resulting data problem |
This table prevents a common mistake: promoting one correlation into the diagnosis. A private-window success deserves investigation. It does not justify closing a checkout incident without testing the checkout.
Is the error broken JavaScript or a failed request?
Start with the first Console entry and the Network activity at the same time.
A JavaScript exception appears first
An error such as TypeError: Cannot read properties of undefined shows that code used a value that did not match its assumption. The property name can help locate the failing path, but the text does not explain why the value was missing.
Compare the failing input and account state with a successful case. Then compare the first failing release with the last known good release. Avoid changing dependencies, data and deployment settings together; one change should test one explanation.
Production stack traces can contain minified file names and line numbers. Next.js disables browser source maps in production by default. Its production browser source-map documentation warns that enabling them exposes source code to the browser and increases build time and memory use. Do not enable public source maps during an incident without reviewing that exposure. Use the application’s existing error-reporting and source-map process when one exists.
A request fails before the exception
Open the failed request. Keep its status, response type and request ID. A page that expects JSON can crash after an authentication, function or gateway request returns something else.
If the request returned 502, follow the 502 Bad Gateway diagnosis for a live web app. That process traces the request through the gateway and application logs. If the request returned successfully but the page received no rows, the Supabase empty result and RLS diagnosis separates an ordinary no-match result from an access-policy problem.
Vercel Runtime Logs cover Functions and Routing Middleware, not every exception thrown in a visitor’s browser (Vercel Runtime Logs). A clean server log therefore does not clear the client code. Match server logs to the failed Network request, then use the Console for the browser exception.
The value is missing only in production
Check whether the client value belongs in the deployed build and whether the correct environment supplied it. Do not paste secret values into the Console or an incident ticket.
For build-time configuration, use the environment variable changed but production did not update checklist. It explains why changing a dashboard value does not rewrite a release that has already been built.
Could this be a hydration error?
Hydration is React’s process for attaching event handlers to server-rendered HTML. A hydration error means the initial browser render did not match the server output.
Next.js lists documented hydration causes, including invalid HTML nesting, browser-only APIs during rendering, time-dependent values, browser extensions and systems that modify the HTML response. The hydration message narrows the mechanism. It does not identify which component created the difference.
Check the component named in the first stack or component trace. Compare its initial server output with its first browser render. Move browser-only work to a client-side effect when the value is not required for the initial render. Fix invalid element nesting where the Console identifies it.
Do not add suppressHydrationWarning across the page to silence the evidence. Next.js describes it as an escape hatch that works one level deep. It does not reconcile mismatched text.
Does an error boundary fix the application error?
An error boundary keeps one uncaught render error from replacing a larger part of the interface. It can show a useful fallback and report the error. It does not repair the failed request, missing value or incompatible release.
For the Next.js App Router, an error.tsx file creates a boundary for a route segment. Next.js documents that errors move to the nearest parent boundary. It also states that error boundaries do not catch errors inside event handlers or ordinary asynchronous code (Next.js error handling).
A good boundary gives the customer a safe action and gives the development team a traceable event. It should not display a stack trace, token or customer data. Test the fallback in the same production flow that failed.
If the current symptom is an empty page rather than the Next.js message, use the broader blank screen in production diagnosis. That guide also covers build configuration and successful requests that return no visible data.
When does the error need a production bug-fix investigation?
Get help when the exception affects sign-in, checkout, saved work or another customer path and the evidence does not isolate one reversible change. The same applies when several browsers fail, the stack is unreadable, the failed request crosses several services, or a rollback could affect data created after the release.
A useful investigation should answer these questions:
- Which user action reproduces the exception?
- Which release first contains it?
- What is the first browser error?
- Did a failed request precede the error?
- What test proves the complete customer flow works?
The production web app bug-fixing service for client-side and deployment failures covers a focused diagnosis, one agreed repair and verification of the affected flow. It is not ongoing maintenance, a redesign or a feature build.
The desk currently works on React, Next.js, TypeScript, Node.js, Supabase, PostgreSQL, Stripe, authentication and deployment around those systems. WordPress and other CMS platforms, PHP/Laravel, Rails, native mobile apps, new application builds, penetration testing and live breach response remain outside scope.
An error boundary can make the next failure safer. It cannot substitute for finding the first exception and testing the flow that customers use.
Need the live customer flow restored?
If the steps above leave more than one credible cause, send the redacted incident record and start a client-side exception bug-fix request →.
The work begins with scope and price agreed before anything in production changes.