How to Reduce Your App Crash Rate Below 0.1%
A 1% crash rate sounds small. It isn't. For an app with 50,000 daily active users, 1% means 500 people hitting a crash every single day. That's 500 negative reviews waiting to be written. App Store quality guidelines flag apps with crash rates above 2%, and Google Play can deprioritize apps with poor stability signals.
The industry benchmark for a stable app is under 0.1% crash-free session rate degradation — meaning 99.9% of sessions complete without a fatal crash. Here's how to get there.
Step 1: Measure Before You Fix
You can't reduce what you don't measure. Before anything else, establish a baseline.
A crash-free session rate is the percentage of sessions that complete without a fatal crash. If you have 10,000 sessions per day and 50 end in a crash, your crash-free rate is 99.5%.
Track crash rate by:
- App version (did a recent release make things worse?)
- Platform (iOS vs Android)
- OS version (is it specific to Android 10?)
- Device model (is it a Samsung-specific issue?)
// Tag your sessions for better segmentation
BugsPulse.setTag('app_version', '2.4.1');
BugsPulse.setTag('build_number', '241');Step 2: Triage by User Impact, Not Count
Crash count alone is misleading. A crash that happens 500 times to 2 users (an automated test account hitting a bug) is less urgent than a crash happening 50 times across 50 different users.
Sort your crash groups by unique users affected over the last 7 days. The top 5 by this metric are your first targets.
Step 3: Fix Crashes in Priority Order
Work your crash backlog by impact tier:
Tier 1 (fix this week): Any crash affecting >1% of your daily active users. These are almost certainly caused by common flows — checkout, login, app launch.
Tier 2 (fix this sprint): Crashes affecting 0.1–1% of users. Real but not emergency.
Tier 3 (fix when you touch that code): Crashes affecting <0.1% of users, often device-specific or rare-flow issues.
Step 4: Address the Top Crash Categories
Most React Native and Flutter crash backlogs cluster into a small number of root causes:
Null/undefined access (React Native)
// 90% of these are fixed with optional chaining
const name = user?.profile?.name ?? 'Unknown';
const price = cart?.items?.[0]?.price ?? 0;Null check operator on null (Flutter)
// Replace ! with null-safe alternatives
final name = user?.name ?? 'Unknown';
final price = cart?.items.firstOrNull?.price ?? 0.0;setState after dispose (Flutter)
Future<void> _load() async {
final data = await api.fetch();
if (!mounted) return; // always check
setState(() => _data = data);
}Unhandled async errors (React Native)
// Wrap all top-level async operations
async function init() {
try {
await Promise.all([loadUser(), loadConfig(), loadFeatureFlags()]);
} catch (error) {
BugsPulse.captureException(error as Error);
showErrorScreen();
}
}Step 5: Add a Canary Release Process
Don't ship fixes to 100% of users immediately. Use a staged rollout:
1. Ship to 5% of users
2. Monitor crash rate for 24–48 hours
3. If crash rate is flat or improved, expand to 25% → 100%
4. If crash rate gets worse, pause and investigate
Both Google Play and Apple TestFlight support phased rollouts.
Step 6: Prevent Regressions
A crash fixed is only valuable if it stays fixed. Add these to your workflow:
Track crash rate per release — Set an alert if crash rate in a new version exceeds the previous version by >0.1% within 24 hours of rollout.
Write regression tests for your top crashes — Each top crash should have a unit or integration test that would have caught it.
Add an ErrorBoundary (React Native) or runZonedGuarded (Flutter) — Ensure all unhandled errors are captured before they reach the OS crash reporter.
The 0.1% Roadmap
| Week | Target | Action |
|---|---|---|
| 1 | Baseline measured | Add crash reporting, establish current rate |
| 2–3 | Fix top 3 crashes | Address highest user-impact issues |
| 4 | Deploy + monitor | Staged rollout, verify improvement |
| 5–8 | Fix next 5 crashes | Work through Tier 2 backlog |
| Ongoing | <0.1% maintained | Canary releases, alerts, regression tests |
The compounding effect is real: fixing the top 3 crashes often cuts your crash rate by 50–70% because a small number of bugs cause the majority of crashes. After that, each subsequent fix has diminishing returns — which is why the last 0.1% requires process (canary releases, monitoring) rather than just code fixes.