Pulse
v4.2 · React 19 + RN 0.79

See the bug. Not the stack trace.

Pulse records the 14 seconds before every error: clicks, network calls, console output, redux state. Open the session, scrub the timeline, ship the fix in one sitting.

$ pnpm add @pulse-io/web
session · 8f2a1c…b418 · checkout-flow
error: 14:02:11 chromium 124 · macOS
acme.app/checkout
Confirm your order
3 items · billed to •••• 4128
Pro Plan · 1 yr$348.00
Seats × 4$96.00
Tax (CA)$36.40
total
$480.40
TypeError Cannot read properties of undefined (reading 'refund')
00:14.31
00:20.04
Breadcrumbs · 12 latest
14:01:54
page → /checkout
14:01:58
click "Add seat"
14:02:02
fetch GET /api/cart 200
14:02:07
click "Confirm"
14:02:08
fetch POST /api/refund 500
14:02:11
error TypeError stripe.refund
14:02:13
console.error "retrying"
14:02:14
fetch POST /api/refund 500
prod · last 24h
live
Sessions captured
3,184,402
+8.4% vs Tue
Errors caught
12,408
+3.2% vs Tue
MTTR P50
14 m
−38% vs Tue
Replay open rate
84.1 %
team avg
Errors per minute peak 184/m
ingest: 4 regions SDK 9.2 KB gz
Debugging production at
Drift FOLIO RECEIPTS Northwind Cassette lattice/ Folio Press Halcyon Studio Drift FOLIO RECEIPTS Northwind Cassette lattice/ Folio Press Halcyon Studio
Capabilities

Everything a frontend engineer needs at 2am.

Sessions, breadcrumbs, errors, performance, and the network waterfall — all stitched to the same timeline. No tab-hopping.

Issue timeline

When the spike happened. Who got hit.

Stacked by issue, colored by severity. Hover any cell for the impacted session count and top-3 user agents.

last 72h · UTC 1-10 10-100 100-1k 1k+
−72h−48h−24hnow
Source-mapped trace

The minified line. The original file. Side by side.

Sourcemaps uploaded at build time, with retention until you delete the release.

// CheckoutConfirm.tsx · line 142
async function handleRefund(orderId) {
  const client = useStripeClient();
  await client.refund(orderId);  // undefined here
  toast("Refund queued");
}
Console

Captured. Even from production.

console.log, console.warn, console.error, with the originating React component.

14:02:11error[stripe] refund() not on client
14:02:13warnretrying once · attempt 1/3
14:02:14log[react-query] invalidate(['orders'])
Issue grouping

12,408 errors → 38 issues.

We cluster by stack frame, browser, and user cohort so the same bug doesn't page you twice.

TypeError · stripe.refund4,212
NetworkError · /api/cart2,841
HydrationMismatch · <Cart/>1,408
Alert routing

The right channel. The right human.

Rules: spike rate, new-in-release, customer-tier impact, and a regex on the error message. Send to Slack on noisy, PagerDuty on revenue-impacting.

Slack #fe-on-call PagerDuty · sev-2 Linear · auto-issue Webhook Discord
checkout-flow
Error rate
0.094%
↗ +0.018pp / 24h
Web vitals · LCP P95
1.84 s
−0.41s / 7d
Replays opened
1,408
31 reviewers
Network waterfall · session 8f2a1c 2.04 s
document /
182ms
_app.js
128ms
/api/cart
71ms
stripe.js
214ms
/api/refund
500
/api/refund (retry)
500
Replay-first debugging

Less guessing. More watching.

Replays are stitched to errors, breadcrumbs, network calls, and your Redux/Zustand state. You can scrub to any tick and see what the DOM, the network, and the store all looked like together.

  • 14s pre-roll buffer per session — extended to 2 minutes on capture trigger.
  • Auto-redact [data-private] elements and any password field.
  • Share a replay with one URL — public-link or org-scoped, your call.
  • SDK is 9.2 KB gzipped. No layout-shift, no main-thread tax beyond a 4ms init.
Read the replay guide
Pricing

Per session. Replays included.

Sessions include errors, breadcrumbs, console, network, performance, and the replay video. No tiered features hiding behind add-ons.

Solo

free forever
$0
/ month

For one-person projects and side hustles.

  • 5,000 sessions / mo
  • 30-day replay retention
  • Web + React Native SDK
  • Community Slack
Start free
Most popular

Team

per seat
$39
/ seat · month · annual

For teams chasing real customer impact.

  • 100,000 sessions / mo · pooled
  • 90-day replay retention
  • Issue grouping + alert routing
  • Source maps · unlimited
  • Linear + PagerDuty + Slack
Start 14-day trial

Org

BYOC
$249
/ month base · usage on top

For regulated industries and 500-engineer orgs.

  • Self-hosted ingest in your VPC
  • SAML SSO + SCIM + audit log
  • SOC 2 + HIPAA · DPA on request
  • Solution architect · 1h SLA
Talk to sales
Customers

For engineers who shipped the bug and now have to find it.

"MTTR went from 4 hours to 14 minutes. The replay tells me what the user did before I ask them, and our support load on bug-reports dropped 38%."
PA
Priya Anand
Staff Engineer · Linnea
"We replaced two error trackers and a session-replay vendor with Pulse. SDK is 9.2KB, doesn't move our LCP, and the masking story is the cleanest I've seen."
MT
Marcus Tobin
Founding Engineer · Forecast
"The issue grouping just works. 12,408 errors landed last week and they collapsed into 38 tickets, with a clear top-1 that we fixed in two hours."
IC
Ines Calderón
Head of Engineering · Brightwave
FAQ

Frequently asked, honestly answered.

Have a privacy question we haven't covered? Email [email protected] and we'll write back within a working day.

How do you mask sensitive form fields during replay?+

Three layers. (1) Inputs with type="password", autocomplete="cc-*", and any element tagged data-private are replaced with grey blocks before they leave the browser. (2) Heuristic regexes for emails, IPs, and 16-digit numbers run in the SDK. (3) A server-side scan re-checks every event against a customizable allow-list before persistence.

What's your storage retention for video?+

Solo: 30 days. Team: 90 days. Org: configurable up to 14 months. Replays are stored as JSON event streams, not video — about 18KB per session second on a typical SPA. You can pin specific sessions to "permanent" if they're attached to a customer report.

Does it work with React Native?+

Yes — @pulse-io/react-native records component tree snapshots, gestures, and network calls. We currently support RN 0.72+ on iOS 15+ and Android 9+. Replay rendering happens server-side because RN doesn't ship a browser DOM; the result plays back as an interactive timeline rather than pixel-for-pixel video.

How is bundle size impacted by the SDK?+

The base SDK is 9.2 KB gzipped and loads after the page is interactive. Replay capture is a 14 KB chunk fetched lazily after first input or after 8 seconds, whichever comes first. We have a strict zero-blocking-resource policy: nothing we ship can show up on your LCP critical path.

Can I export sessions to my own S3?+

On the Team plan you can stream events to a customer-owned S3 bucket via signed PUTs. On Org you can configure us to write directly and never persist on our side. Schemas are stable and documented at pulse.io/docs/export.

SDK 9.2 KB · LCP-safe

Watch your next bug. Ship the fix.

5,000 sessions a month, forever free. Add the SDK and the first replay lands in your inbox within a minute.