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-architectdata-ai
license: Apache-2.0 NOT for unrelated tasks outside this domain.
development
Use when designing caching strategies (cache-aside, write-through, write-behind), implementing distributed locks, building rate limiters, leaderboards, real-time streams (XADD/consumer groups), pub/sub, or tuning eviction policies. Triggers: thundering-herd on cache miss, dogpile on key expiry, Redlock vs SET-NX-PX choice, sliding-window rate limiter, hot-key on a single cluster slot, big-key blowup, MULTI/EXEC across slots, KEYS in production. NOT for Redis Cluster operations/admin (different domain), embedded KV (SQLite, leveldb), in-process LRU caches, or Memcached.
tools
Drawing the `'use client'` boundary correctly in React Server Components apps (Next.js App Router, RSC frameworks) — leaf-pushing, slot composition, serialization rules, and environment poisoning prevention. Grounded in react.dev and Next.js 16 docs.
development
Use when designing rate limiting for an API, choosing between token bucket / sliding window / leaky bucket / fixed window, implementing it in Redis, deciding edge (Cloudflare/Upstash) vs origin enforcement, sizing per-user vs per-IP vs per-endpoint quotas, returning the right 429 response with Retry-After, or fixing the boundary-burst bug in fixed-window limiters. Triggers: 429 too many requests, INCR + EXPIRE, ZADD + ZREMRANGEBYSCORE + ZCARD, X-RateLimit-Remaining header, Cloudflare WAF rate limiting rules, Upstash @upstash/ratelimit, leaky bucket shaping vs policing, distributed rate limiter consistency. NOT for DDoS mitigation specifically (different scale), CAPTCHA / bot management, full WAF design, or per-user quota billing.