skills/mobile-analytics-crash-reporting-expert/SKILL.md
Mobile analytics and crash reporting expert for Firebase, Sentry, Mixpanel, custom events, and crash symbolication. Activate on: mobile analytics, crash reporting, Firebase Analytics, Sentry mobile, Mixpanel, event tracking, crash symbolication, dSYM upload, ProGuard mapping, session replay. NOT for: server-side logging (use log-aggregation-architect), web analytics (use frontend-architect), A/B testing (use environment-config-manager).
npx skillsauth add curiositech/windags-skills mobile-analytics-crash-reporting-expertInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Expert in mobile analytics instrumentation, crash reporting with symbolication, and actionable event tracking across iOS and Android.
High crash volume (>1000/day) OR complex error debugging needed?
├─ YES: Choose Sentry
│ ├─ Need user sessions? → Add Sentry Session Replay
│ └─ Enterprise budget? → Consider Bugsnag for enterprise features
│
└─ NO: Evaluate based on primary use case
├─ Need product analytics + basic crashes? → Firebase (free tier generous)
├─ Advanced funnel analysis required? → Mixpanel + Crashlytics
└─ Real-time user behavior insights? → Amplitude + Sentry
Budget considerations:
├─ <$50/month: Firebase Analytics + Crashlytics
├─ $50-500/month: Sentry Team + basic product analytics
└─ $500+/month: Full stack (Sentry + Mixpanel/Amplitude)
Production traffic volume:
├─ <1K daily sessions:
│ ├─ Crash sampling: 100%
│ ├─ Transaction tracing: 50%
│ └─ Session replay: 25%
│
├─ 1K-10K daily sessions:
│ ├─ Crash sampling: 100%
│ ├─ Transaction tracing: 20%
│ └─ Session replay: 10%
│
└─ >10K daily sessions:
├─ Crash sampling: 100% (never sample crashes)
├─ Transaction tracing: 5-10%
└─ Session replay: 1-5%
Cost optimization triggers:
├─ Monthly bill >$200 → Reduce transaction sampling by 50%
├─ Storage quota exceeded → Lower session replay rate
└─ Performance impact detected → Disable replay in low-memory scenarios
Incoming crash rate assessment:
├─ <0.1% of sessions → Normal monitoring, weekly review
├─ 0.1-1% of sessions → Daily triage, investigate top 3 crashes
├─ 1-5% of sessions → Emergency mode: stop releases, hotfix priority
└─ >5% of sessions → App store removal risk, immediate rollback
Symbolication status check:
├─ Symbolicated within 5 minutes → Continue normal flow
├─ Pending 5-30 minutes → Check CI upload job status
└─ Missing after 30 minutes → Manual dSYM/mapping upload required
Detection: Stack traces show memory addresses (0x1a2b3c4d) instead of function names Diagnosis: dSYM/ProGuard mapping upload failed or incomplete Fix:
sentry-cli upload-dif --org X --project Y ./dSYMs/sentry-cli releases files <version> listDetection: Analytics events contain email addresses, phone numbers, or names in Sentry dashboard Diagnosis: Missing or broken data scrubbing rules Fix:
beforeSend hook to strip sensitive fieldsDetection: Sentry shows crashes from simulator/emulator or local dev builds Diagnosis: Analytics initialized in development environment Fix:
if (!__DEV__) Sentry.init(...)Detection: No alerts triggered despite user complaints about app crashes Diagnosis: Missing crash-free rate monitoring or misconfigured thresholds Fix:
Detection: Analytics bill spikes unexpectedly or performance degrades Diagnosis: Sample rates too high for actual traffic volume Fix:
Scenario: iOS app crash-free rate drops from 99.6% to 97.2% over 24 hours
Step 1 - Rapid Assessment:
Check Sentry dashboard:
- 847 new crashes in last 24h (was 45 average)
- Top crash: EXC_BAD_ACCESS in PaymentViewController
- Affected: iOS 17.1+ users (67% of crash volume)
- Release: v2.1.4 (deployed 18 hours ago)
Step 2 - Decision Tree Navigation:
Step 3 - Root Cause Analysis:
Stack trace shows:
PaymentViewController.processPayment()
└─ crashes on line 142: cardNumber.formatWithSpaces()
Git blame reveals: v2.1.4 added cardNumber nil check removal
"Optimization" introduced force unwrapping
Step 4 - Immediate Actions:
Expert vs. Novice:
Scenario: React Native Android app showing obfuscated crash traces after R8 enabled
Problem Detection:
Sentry crash report shows:
com.example.a.b.c.a() (Unknown Source)
com.example.d.e.f.b() (Unknown Source)
Instead of readable class/method names
Decision Process:
Recovery Steps:
# 1. Locate mapping file in build artifacts
find ./android/app/build -name "mapping.txt"
# 2. Upload mapping for specific release
sentry-cli upload-proguard \
--org mycompany \
--project mobile-app \
--release 2.1.5 \
./android/app/build/outputs/mapping/release/mapping.txt
# 3. Verify upload
sentry-cli releases files 2.1.5 list | grep mapping.txt
# 4. Reprocess existing crashes
sentry-cli issues reprocess --query "release:2.1.5"
Prevention Setup:
Analytics Implementation Validation:
This skill handles: Mobile app analytics, crash reporting, symbolication, session tracking, conversion funnels
Delegate elsewhere:
log-aggregation-architectfrontend-architectenvironment-config-managerapp-store-submission-automatorlogging-observabilitydatabase-architectcloud-cost-optimizerBoundary cases:
log-aggregation-architectfrontend-architecttools
Building resilient distributed systems with circuit breakers, retries with full-jitter exponential backoff, retry budgets (per-request 3-attempt + per-client 10% ratio per Google SRE), deadline propagation, and the cascading-failure math (4 layers × 3 retries = 64x amplification). Grounded in Resilience4j, Microsoft Cloud Patterns, AWS Architecture Blog (Marc Brooker), and Google SRE Book.
testing
Designing HTTP cache headers that work correctly across browsers, CDNs, and shared proxies — `Cache-Control` directives per RFC 9111, `stale-while-revalidate` and `stale-if-error` per RFC 5861, the Vary header for varying responses, and surrogate keys for tag-based purging. Grounded in IETF RFCs and Cloudflare/Fastly docs.
development
Use when designing or fixing a Content Security Policy on a real site, choosing between nonce-based and hash-based CSP, adding strict-dynamic, debugging "Refused to execute inline script" errors, deploying CSP in report-only mode first, configuring report-to / report-uri, or auditing an existing policy for unsafe-inline / unsafe-eval / wildcards. Triggers: "CSP blocks legitimate inline script", strict-dynamic, nonce-{RANDOM}, sha256-{HASH}, object-src none, base-uri none, frame-ancestors, Trusted Types, X-Content-Security-Policy obsolete, report-only vs enforced. NOT for general HTTP security headers (HSTS, COOP/COEP), Trusted Types deep dive, CORS configuration, or building a WAF.
tools
Choosing and operating an HTTP API versioning strategy that doesn't break clients — Stripe's date-based pinned versions, the Deprecation/Sunset header pair (RFC 9745 + RFC 8594), URI vs header vs media-type approaches, and the version-transformer pattern. Grounded in Stripe's published architecture and IETF RFCs.