A checkout page that silently drops users on the final “Place Order” button is a nightmare. One evening, my team stared at a spike in abandonment, yet every console.log we added returned null. The root cause? A race condition that only appeared for a handful of Safari users, and we had no visibility into the exact user flow that triggered it. After wiring up Sentry and LogRocket, the same bug appeared as a grouped error with a linked replay—fixing it took minutes instead of days.
- Combine Sentry’s error intelligence with LogRocket’s session replay for full‑stack visibility.
- Understand SDK architecture, sampling strategies, and performance impact.
- Use build‑time plugins or lazy‑load scripts to keep bundle size low.
- Define frontend error budgets and SLOs to keep MTTR in check.
- Correlate errors with user sessions to reproduce Heisenbugs instantly.
Before you start: Node ≥ 18, a modern React/Vue/Next.js app, Sentry SDK v8.x, LogRocket SDK v3.x, and access to a CI pipeline for environment variables.
Frontend monitoring stack for production debugging
A comprehensive frontend monitoring stack combines error tracking (like Sentry) for aggregated issue intelligence and session replay (like LogRocket) for user‑level context. Sentry excels at grouping errors, performance monitoring, and release health, while LogRocket records user sessions to reproduce bugs visually. For complex applications, integrating both provides a complete view from error alert to root cause.
Why console.log fails in production
Developers love console.log for its immediacy, but in the wild it suffers from three fatal flaws:
- Noise overload – production traffic generates millions of logs; useful signals drown.
- No correlation – each log line lives in isolation, making it impossible to stitch together a user journey.
- Security risk – accidental exposure of secrets or PII can slip into browser consoles.
A robust observability stack replaces ad‑hoc logs with structured, searchable events that respect privacy and performance budgets.
The three pillars of frontend observability
| Pillar | What it solves | Typical tool |
|---|---|---|
| Error tracking | Automatic capture, grouping, and alerting of exceptions | Sentry |
| Session replay | Visual reconstruction of user interactions | LogRocket |
| Performance monitoring | Real‑user metrics, slow‑load detection, and resource waterfalls | Sentry Performance, RUM |
Together, they give you what happened, who experienced it, and why it mattered.
Sentry: Deep dive into error intelligence
Sentry started as a simple exception logger, but today it offers a full APM suite for the browser.
Architecture: from client SDK to issue grouping
graph LR
A[Browser] --> B[Sentry SDK]
B --> C[Transport (fetch/XHR)]
C --> D[Sentry Cloud]
D --> E[Issue Grouping Engine]
E --> F[Alerting & Dashboard]
- The client SDK (e.g.,
@sentry/react@8.19.0) wraps global error handlers, intercepts unhandled promise rejections, and instrumentsfetch/XMLHttpRequest. - Events travel through a transport layer that respects
sampleRateandtracePropagationTargets. - On the server side, Sentry deduplicates events using fingerprinting (stack trace, error message, and source maps). Groups become issues you can assign, label, and triage.
SDK load strategy
| Strategy | When to use | Impact |
|---|---|---|
Eager import (import * as Sentry from '@sentry/react') | Small apps, low traffic | Adds ~30 KB gzipped |
| Lazy‑load via dynamic import | Large bundles, high traffic | Splits SDK, loads only after first error or performance entry |
Webpack plugin (@sentry/webpack-plugin) | Need source‑map upload at build time | Automates release creation, negligible runtime cost |
Advanced features: performance monitoring, session replay, release health
- Performance monitoring tracks spans (e.g., page load, React render) and reports
tpm(transactions per minute). UsetracesSampleRateto limit overhead. - Session replay (beta in Sentry 8) records DOM snapshots and input events. It’s lighter than LogRocket but lacks full network logs.
- Release health aggregates crash‑free sessions and users per deployment, enabling error budgets.
Implementation: code examples
Below are minimal, production‑ready snippets for three popular frameworks. Each example includes error handling and a fallback for SDK load failures.
React (v18, Sentry 8.19.0)
// src/sentry.ts
// @ts-ignore: Sentry v8
import * as Sentry from '@sentry/react';
import { BrowserTracing } from '@sentry/tracing';
if (process.env.NODE_ENV === 'production') {
try {
Sentry.init({
dsn: process.env.REACT_APP_SENTRY_DSN,
integrations: [new BrowserTracing()],
tracesSampleRate: 0.2, // 20 % of transactions
release: `my-app@${process.env.REACT_APP_VERSION}`,
environment: process.env.REACT_APP_ENV,
});
} catch (e) {
console.error('Sentry init failed', e);
}
}
export default Sentry;
// src/index.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import './sentry';
const root = ReactDOM.createRoot(document.getElementById('root')!);
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
Vue 3 (v3.4, Sentry 8.19.0)
// src/plugins/sentry.js
import * as Sentry from '@sentry/vue';
import { BrowserTracing } from '@sentry/tracing';
import { createApp } from 'vue';
import App from '../App.vue';
export default async function initSentry(app) {
if (import.meta.env.PROD) {
try {
await Sentry.init({
app,
dsn: import.meta.env.VITE_SENTRY_DSN,
integrations: [new BrowserTracing()],
tracesSampleRate: 0.1,
release: `my-vue-app@${import.meta.env.VITE_APP_VERSION}`,
});
} catch (e) {
console.error('Failed to init Sentry', e);
}
}
}
// main.js
import { createApp } from 'vue';
import App from './App.vue';
import initSentry from './plugins/sentry';
const app = createApp(App);
initSentry(app);
app.mount('#app');
Next.js (v14, Sentry 8.19.0)
// pages/_app.tsx
import type { AppProps } from 'next/app';
import * as Sentry from '@sentry/nextjs';
if (process.env.NODE_ENV === 'production') {
Sentry.init({
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
tracesSampleRate: 0.15,
debug: false,
// automatic source‑map upload via @sentry/nextjs
});
}
export default function MyApp({ Component, pageProps }: AppProps) {
return <Component {...pageProps} />;
}
These snippets illustrate fail‑fast loading: if the SDK cannot initialise (network issues, mis‑configured DSN), the app continues unhindered.
LogRocket: The session‑replay powerhouse
LogRocket captures everything a user does in the browser, then ships it to a secure cloud for on‑demand playback.
How LogRocket captures DOM mutations and network logs
flowchart TD
A[User Browser] --> B[LogRocket SDK]
B --> C[DOM Mutation Observer]
B --> D[Network Interceptor (fetch/XHR)]
C & D --> E[Encrypted Buffer]
E --> F[LogRocket Cloud]
F --> G[Replay UI]
- A MutationObserver records each DOM change, throttled to 10 ms intervals to keep payload size low.
- A network layer hooks into
fetchandXMLHttpRequest, logging request/response headers, bodies (excluding PII when configured), and timing details. - All data is encrypted client‑side before being sent over HTTPS, ensuring compliance with GDPR and CCPA.
Use cases: reproducing Heisenbugs and UX analysis
- Heisenbug hunting – a rare crash that appears only under flaky network conditions. LogRocket shows the exact request that timed out, the UI state before the crash, and the user’s subsequent clicks.
- UX research – playback reveals where users hesitate, enabling data‑driven redesigns.
- Regression testing – compare sessions from a previous release with the current one to verify that a bug truly disappeared.
Privacy & performance considerations
| Concern | Recommended setting |
|---|---|
| PII leakage | Enable maskAllInputs: true and whitelist only non‑sensitive fields. |
| Bandwidth | Set networkCaptureThrottle: 500 ms and maxEventSize: 150KB. |
| CPU impact | Lazy‑load SDK after DOMContentLoaded; monitor overhead via Sentry’s own performance tool. |
“According to a 2023 report, frontend errors can account for up to 40 % of user‑reported issues, yet often lack the context of backend logs.” – Industry analytics
Head‑to‑head: Sentry vs. LogRocket
Both tools solve overlapping problems but approach them differently.
Architectural trade‑offs: sampling vs. full capture
| Aspect | Sentry | LogRocket |
|---|---|---|
| Data model | Event‑based, aggregated, fingerprinted | Session‑based, raw, chronological |
| Sampling | Adjustable sampleRate (0‑1) | Generally records every session (optionally filtered) |
| Storage | Cloud‑native time‑series, searchable | Cloud video‑like storage, searchable by tags |
| Retention | 90 days default (configurable) | 30 days default (extendable) |
Sentry’s sampling keeps costs predictable, while LogRocket’s full capture guarantees you never miss the “one‑off” user path that caused a crash.
Pricing implications for high‑traffic applications
- Sentry charges per event volume (e.g., 1 M events ≈ $120). With a
tracesSampleRateof 0.2, a 5 M events/month site may pay ≈ $240. - LogRocket bills per session minute (e.g., $0.0008 /min). A site with 2 M sessions × 5 min averages $8 000/month. However, aggressive session trimming (e.g., only error‑linked sessions) can cut that dramatically.
When traffic scales, a hybrid approach—sample most events in Sentry and only forward critical sessions to LogRocket—optimizes spend.
When to use one, the other, or both
| Scenario | Recommended tool(s) |
|---|---|
| Simple SPA needing just error alerts | Sentry only |
| Complex checkout flow with rare UI bugs | Sentry + LogRocket (link errors to replays) |
| Compliance‑heavy fintech | Sentry (full control over data) plus masked LogRocket sessions |
| Budget‑constrained startup | Start with Sentry, add LogRocket on-demand for high‑value releases |
Engineering a unified monitoring pipeline
Bringing both services under a single workflow saves time and reduces duplication.
Integrating Sentry and LogRocket: a code walkthrough
// src/monitoring.ts
import * as Sentry from '@sentry/react';
import LogRocket from 'logrocket';
// Initialise LogRocket first to capture early page load
if (process.env.NODE_ENV === 'production') {
LogRocket.init('your-org/your-app', {
network: { requestSanitizer: (req) => ({ ...req, body: '[REDACTED]' }) },
dom: { maskAllInputs: true },
// Lazy‑load after first paint
// See https://docs.logrocket.com/docs/lazy-loading
});
// Bridge LogRocket session ID into Sentry context
LogRocket.getSessionURL((sessionURL) => {
Sentry.setTag('logrocket_session', sessionURL);
});
}
// Then initialise Sentry (see earlier snippet) – it will now include LogRocket tag
This pattern guarantees that every Sentry error carries a logrocket_session tag, enabling one‑click navigation from the Sentry issue page to the exact replay.
Setting up alerting and triage workflows
- Create a Sentry alert rule – trigger on
error.level: errorandissue.frequency > 5 per 10 min. - Add a webhook – send payload to your Slack
#frontend-alertschannel. - Enrich with LogRocket link – the webhook pulls the
logrocket_sessiontag and appends the URL. - Triage board – use GitHub Projects to auto‑create an issue tagged
frontend‑bugwith the Sentry issue ID.
This end‑to‑end flow is illustrated below.
graph TD
A[Sentry Alert] --> B[Slack Webhook]
B --> C[Enrich with LogRocket URL]
C --> D[GitHub Issue]
D --> E[Triage & Fix]
Correlating errors with user sessions
When an error lands in Sentry, open the issue and locate the logrocket_session tag. Clicking it opens a pre‑filtered replay, already positioned at the moment of exception. You can then:
- Inspect network payloads that preceded the failure.
- Replay the exact mouse clicks and scroll positions.
- Export the session as a video for bug‑reporting tools.
Case studies & real‑world data
Netflix’s approach to frontend error budgets
Netflix treats frontend stability like a Service Level Objective (SLO). They aim for 99.9 % crash‑free sessions per release. By feeding Sentry’s crashFreeSessions metric into their internal dashboard, they automatically roll back any deployment that breaches the budget.
How Vercel reduces MTTR with session replay
Vercel integrated LogRocket into every preview deployment. When a UI regression surfaced, engineers jumped straight to the offending session, reproducing the bug in seconds. The reported Mean Time To Resolve fell from 3 hours to under 30 minutes.
“Engineering Case Study: A major e‑commerce platform reduced time‑to‑diagnose (TTD) for checkout errors by 70 % after correlating Sentry errors with LogRocket session replays.”
Stats: the cost of unhandled frontend exceptions
- Average revenue loss per broken checkout: $2.5 M/year (source: Shopify 2022).
- 40 % of users abandon after an uncaught error (per the 2023 report quoted earlier).
- Investing $500/month in observability can cut lost revenue by up to 35 %.
Common Errors & Fixes
| Symptom | Why it happens | Fix |
|---|---|---|
| “Sentry SDK failed to initialize” | Environment variables missing or DSN typo | Verify process.env.SENTRY_DSN is set in CI; add a fallback console.error as shown in the init snippets. |
| LogRocket replay stalls at 0 % | SDK loaded after window.onload and missed early DOM mutations | Move LogRocket.init to the top of the entry file or use the defer attribute with a small bootstrap script. |
| Elevated Core Web Vitals after adding SDKs | Uncompressed SDK bundle adds 40 KB; network payload grows | Enable gzip/ brotli, lazy‑load the SDK, and set tracesSampleRate to ≤ 0.2. For further guidance, see How to optimize Webpack bundle size for large‑scale React applications in 2026. |
| PII appearing in LogRocket sessions | Default input capture not masked | Set maskAllInputs: true and provide a custom inputSanitizer to strip credit‑card numbers. |
| Duplicate error groups in Sentry | Inconsistent source maps across builds | Use @sentry/webpack-plugin to upload source maps matching the exact build hash. |
Frequently asked questions
Does using Sentry and LogRocket together significantly impact my site’s performance?
When implemented correctly with sampling and lazy-loading, the performance impact is minimal (<3 % Core Web Vitals impact). The key is to avoid double‑instrumenting and to use Sentry's performance monitoring to track the overhead itself.
Can I use LogRocket’s session replay without sending data to their servers?
No, LogRocket’s core functionality requires sending session data to its cloud for processing and storage. For fully on‑premise session replay, you would need to explore open‑source alternatives or custom‑built solutions, which involve significant engineering overhead.
How do I set an error budget for a frontend SPA?
Start with a target crash‑free session rate (e.g., 99.95 %). Use Sentry’s `crashFreeSessions` metric to monitor weekly. If the metric dips below the threshold, trigger a rollback or a hot‑fix pipeline.
My take
Integrating Sentry and LogRocket feels like adding both a doctor’s diagnosis and a patient’s video to your health‑check workflow. One tells you what went wrong; the other shows you how it unfolded. Skipping either leaves you guessing, which is why I now make this combo a non‑negotiable part of every production release.
—
If you found this guide useful, drop a comment with your own monitoring stories or questions. Sharing it with teammates helps raise the overall reliability of the web ecosystem—let’s debug together!