A cookbook for Sentry clustering, bisecting releases, and sizing user impact when crash-free sessions drop after a store rollout or OTA publish. Assumes production is wired per Sentry for React Native and release identity per Observability Basics.
# 1. Confirm spike (Sentry UI or API)# Filter: environment=production, last 1h vs 24h baseline# 2. Segment by native release# Group by: release (e.g. 2.4.0+240012)# 3. Segment by OTA dist within top release# Group by: dist (expo-updates updateId)# 4. Open top issue cluster - note fingerprint + first seen# 5. Correlate with deploy timelineeas update:list --branch production --limit 5# App Store Connect: phased release % / Play: staged rollout %# 6. Contain (parallel with triage)# Pause rollout / eas update:rollback / kill switch# 7. Size impact# crash-free sessions delta × DAU estimate = affected users
When to reach for this:
Sentry alert: crash-free sessions dropped >2% absolute vs 7-day baseline
Support ticket volume for "app closes" correlates with alert window
Release Health shows new issue fingerprint with steep first seen ramp
When to escalate instead of bisecting:
Spike across all releases and OTA ids simultaneously → backend or CDN incident
Native-only SIGABRT with no new OTA → store build rollback path, not channel revert
Unsymbolicated stacks only → fix source map upload first - see EAS Build Basics
Open Issues sorted by event volume in the alert window.
Top cluster: Fingerprint: checkout-screen-null-ref First seen: 2026-07-09 14:02 UTC Events: 4,200 (82% of spike) Releases: 2.4.0+240012 only Dist: abc123-update-group (single OTA id)
| UTC Time | Event ||----------|-------|| 13:45 | Backend deploy v892 - no mobile change || 14:02 | eas update --channel production (group abc123) || 14:05 | Sentry alert fired || 14:08 | iOS phased at 25% - build 240012 |
Bisect decision tree:
Crash only on dist abc123? YES → Suspect OTA. eas update:view abc123. Rollback per OTA Emergency Rollback. NO → Crash on all dist values for release 2.4.0+240012? YES → Suspect native binary. Pause phased release. Hotfix build. NO → Crash on multiple native releases? YES → Backend / shared dependency. Engage API on-call.
// Rough impact estimate for IC / exec commstype ImpactEstimate = { crashFreeDelta: number; // e.g. -0.026 (99.4% → 96.8%) sessionsLastHour: number; // from Sentry Release Health dau: number; // from analytics};function estimateAffectedUsers(e: ImpactEstimate): number { const crashedSessions = e.sessionsLastHour * e.crashFreeDelta; // Scale to DAU if spike is sustained - conservative for exec comms return Math.round(Math.min(crashedSessions, e.dau * e.crashFreeDelta));}
~2.6% session crash rate on production; top cluster affects checkout on OTA abc123.iOS phased at 25% (~40k users). Containment: OTA rollback in progress.
Under-reporting beats exaggerating - give ranges ("tens of thousands") if analytics lags
Payment route crashes use revenue metrics, not just crash-free rate
Issues → sort by Events in time window → open top issue → check First Seen, Releases, and Dist distribution. Use Discover queries to group by dist when the Issues UI is noisy. Same fingerprint = same root cause candidate.
OTA rollback did not fix crashes - now what?
Re-check dist on incoming events - if dist unchanged, clients have not picked up rollback yet (wait or force reload policy). If dist changed but crashes persist, suspect native layer or second bug. Re-cluster from T+0.
What rollback trigger should we use?
Common mobile thresholds: crash-free -2% absolute, payment success -1% absolute, auth errors +3% relative. Define in SLOs for Mobile Apps and Rollback Runbook before launch.