Article
React Error Boundary Fallback UI That Reduces Support Tickets
Learn how to design a React error boundary fallback UI that helps users recover, captures support context, and avoids vague SaaS support tickets.
React Error Boundary Fallback UI That Reduces Support Tickets
A React error boundary is often treated like a crash pad:
<ErrorBoundary fallback={<p>Something went wrong.</p>}>
<App />
</ErrorBoundary>
That is better than a blank screen, but it still leaves the user stuck.
For a SaaS product, the fallback UI should do more than catch a render error. It should help the user recover, capture context, and prevent a vague support ticket.
React's official docs describe error boundaries as components that can display fallback UI when a child component throws during rendering, and optionally log the error with componentDidCatch: React Component reference.
The support opportunity is what you do after the error is caught.
The bad fallback pattern
Many apps ship fallback UI like this:
function ErrorFallback() {
return (
<div>
<h1>Something went wrong</h1>
<button onClick={() => window.location.reload()}>Reload</button>
</div>
);
}
This creates three problems:
- The user does not know whether retrying is safe.
- Support receives a vague ticket if the reload fails.
- Engineering loses the route, release, component stack, and user action.
The fallback avoids a white screen, but it still creates a broken-flow experience.
The support-ready fallback pattern
A better React error boundary fallback should answer four questions:
| Question | User-facing answer | Support-facing answer |
|---|---|---|
| What happened? | "This page could not load safely." | Captured error message and component stack |
| What should I do? | "Refresh this page or retry the action." | Suggested recovery path shown to user |
| Is my data safe? | "We stopped before saving changes." | Route, product area, and failed action |
| What if it keeps failing? | "Send this to support." | Event ID, release, browser, user note |
The goal is not to show the stack trace to the user. The goal is to preserve the stack trace for support while showing the user a safe next step.
React boundary placement
Do not wrap every component. Place boundaries around product areas where users can recover independently:
- checkout and billing
- onboarding steps
- dashboards
- file upload surfaces
- settings pages
- integration setup flows
- report builders
React recommends thinking about the granularity of boundaries instead of wrapping every small component. A messaging app, for example, might use boundaries around conversation lists or individual messages, not every avatar.
For SaaS, place boundaries around workflows where failure blocks a job.
A practical fallback UI
Here is the shape:
type RecoveryFallbackProps = {
error: Error;
reset: () => void;
eventId?: string;
};
export function RecoveryFallback({ error, reset, eventId }: RecoveryFallbackProps) {
return (
<section role="alert" aria-live="polite">
<h2>We could not load this step</h2>
<p>
Your work is safe. Try refreshing this section. If it keeps failing,
support can use the event ID below to help faster.
</p>
<button onClick={reset}>Try again</button>
{eventId ? (
<p>Support event: {eventId}</p>
) : null}
<details>
<summary>Technical context for support</summary>
<code>{error.message}</code>
</details>
</section>
);
}
This still needs styling, but the structure is right:
- clear title
- calm explanation
- retry path
- support event ID
- technical details hidden from the default user view
What to capture when the boundary catches an error
Capture enough to make the support handoff useful:
- error message
- component stack
- route
- release or deploy SHA
- project area
- user ID or account ID
- browser and device
- feature flag state, if relevant
- last user action, if safe
Redact sensitive fields before sending logs anywhere.
What error boundaries do not catch
This is important for support automation.
React error boundaries do not catch every failure type. They are designed for render-time failures in child components. You still need other capture paths for:
- failed API responses
- rejected promises outside render
- event handler errors
- network timeouts
- backend validation errors
That is why a support-ready error strategy combines:
- React error boundaries
- global browser error listeners
- failed fetch capture
- backend error events
- support handoff metadata
Copy examples that reduce panic
Weak fallback copy:
Something went wrong.
Better fallback copy:
We could not load your billing plan, so checkout paused before charging you.
Weak recovery step:
Try again later.
Better recovery steps:
- Refresh billing.
- Sign in again.
- Retry checkout.
The better version explains safety and action. Users are more likely to continue because the failure feels bounded.
Support handoff example
When the user clicks "Still need help," support should receive:
{
"eventId": "evt_billing_921",
"route": "/billing/upgrade",
"release": "2026.05.15",
"fingerprint": "checkout-plan-null",
"browser": "Chrome",
"componentStack": "BillingPlanCard > UpgradePage > DashboardLayout",
"userNote": "I tried refresh and sign in again.",
"suggestedFix": "Check null fallback when plan lookup returns empty account state."
}
That ticket is radically different from "checkout is broken."
How to measure the fallback
Track:
- boundary events
- retry clicks
- successful recoveries after retry
- support requests after fallback
- repeated fingerprints
- affected accounts
- releases associated with each fingerprint
If many users click retry and recover, the fallback is deflecting tickets. If many users request support after the same fingerprint, engineering has a product bug to fix.
How Logwise helps
The Logwise React boundary is built around this recovery loop. It catches crashes, shows users recovery steps, lets them mark an issue as solved, and sends support context when help is still needed.
Read the Logwise docs for the current install path.
Bottom line
A React error boundary is not only a technical safety net. It is a customer experience surface.
If the fallback only says "something went wrong," it prevents a crash but still creates a ticket.
If the fallback explains the failure, offers recovery, and preserves support context, it turns a broken screen into self-serve support.
Frequently Asked Questions
What should a React error boundary fallback UI include?
It should include a short explanation, a safe recovery action, a retry option, and a way to contact support with error context already attached.
Do React error boundaries catch every JavaScript error?
No. React error boundaries catch render-time errors in child components, but not every event handler, async callback, server-side render, or error thrown inside the boundary itself.
How can a React error boundary reduce support tickets?
It can reduce tickets by helping users retry or recover before contacting support, and by sending support the route, release, stack, and error fingerprint when escalation is needed.
More From Logwise
Next.js error.tsx: Build a Support Handoff for App Router Errors
Next.js error.tsx can be more than a generic fallback. Use it to let users retry, explain broken flows, and send useful context to support.
How to Reduce Support Tickets Caused by App Errors
Support tickets caused by app errors are usually product failures with missing context. Here is how to turn them into self-serve recovery paths.