DEV Community

Cover image for Mobile App Analytics in React Native: What to Track (and What to Skip)
Russel Dsouza for RapidNative

Posted on

Mobile App Analytics in React Native: What to Track (and What to Skip)

I have shipped enough React Native apps to see the same pattern every time: on launch day someone wires up fifty analytics events and six months later nobody on the team can explain what any of them are for. This is a working developer's guide to instrumenting a React Native or Expo app so the numbers actually mean something.

The Four Buckets

Every useful mobile app metric fits into one of four categories:

  1. Acquisition: installs, CPI, CAC, install source, store conversion.
  2. Activation: activation rate, time to value, onboarding funnel completion.
  3. Engagement and Retention: DAU, MAU, stickiness (DAU/MAU), session length, D1/D7/D30 retention cohorts, churn.
  4. Monetization: ARPU, conversion rate, LTV, trial-to-paid, renewal rate.

Track a couple from each bucket. Skip the rest until you outgrow them.

Technical Metrics That Are Actually Product Metrics

Performance is not a "nice to have." A slow, crashy app poisons every other metric.

  • Crash-Free Session Rate: target 99.5%+ for consumer, 99.9%+ if you take payment.
  • ANR Rate (Android only): Play Store visibility suffers when this crosses Google's bad-behavior threshold.
  • Cold Start Time: under 500ms good, over 1500ms bad. Hermes bytecode substantially cuts JS parse time vs JSC.
  • API p95 Latency: measured from the client, not the server. The tail is where users feel pain.

The Stack I Actually Use in 2026

Concern Tool
Product analytics PostHog (self-hosted) or Amplitude (free tier)
Errors / performance Sentry
Subscriptions RevenueCat
Attribution SKAdNetwork + Play Install Referrer (free, built-in)

All of these have first-class Expo config plugins in 2026. npx expo install @sentry/react-native posthog-react-native react-native-purchases gets you 80% of the way there.

The One Instrumentation Pattern That Scales

Wrap your SDK. Always. Every screen and component should import track() from a single module, never the SDK directly.

// src/analytics/track.ts
import PostHog from 'posthog-react-native';

type EventName =
  | 'signup_completed'
  | 'paywall_viewed'
  | 'subscription_started'
  | 'workout_logged';

type EventProps = Record<string, string | number | boolean>;

export function track(event: EventName, props: EventProps = {}) {
  PostHog.capture(event, props);
}

export function identify(userId: string, props: EventProps = {}) {
  PostHog.identify(userId, props);
}
Enter fullscreen mode Exit fullscreen mode

Rules I have learned the hard way:

  • Event names are verbs, past tense. paywall_viewed, not paywall.
  • User properties are stable, few, semantic. plan, cohort_week, platform_version. That is enough for 90% of segmentation.
  • No PII in event names or properties. Not even hashed. Just don't.
  • Type the event names. If your event schema is a type, refactoring becomes safe. Untyped strings are how event soup starts.

Metrics I Have Deleted From Every Dashboard

  • Total installs, unless you are showing it next to activated installs.
  • Screen views as a KPI. Useful for debugging nav, useless as a headline.
  • "Engagement" as a single number. It's a portfolio, not a scalar.
  • App Store rating without volume and recency alongside it.

Rule: for every metric, name the decision it drives, the owner of that decision, and the cadence they act on it. Can't do all three? Delete.

Privacy: The 2026 Baseline

  • PrivacyInfo.xcprivacy is mandatory if any of your SDKs touch required-reason APIs. Most analytics SDKs do. Skip this and your App Store submission gets rejected.
  • Consent for EU: non-negotiable for behavioral events. Use Klaro if you want an OSS option.
  • First-party > third-party: server-side event streams from your app to your own backend are increasingly the safe default. PostHog and Amplitude both support this.

Where to Go From Here

If you're starting from scratch, spin up an app with an AI React Native builder like RapidNative. It scaffolds Expo apps with the wrapper pattern above, and event schemas become just another thing you can prompt for. Faster than doing the boilerplate by hand, and consistent across every screen.

If you already have an app, delete half your events tomorrow. You'll be fine.

Which metric have you deleted from a dashboard and never missed? That list is more useful than any tracking plan; drop yours in the comments.

Top comments (1)

Collapse
 
talha_ramzan_3878156fea8c profile image
Talha Ramzan

The "name the decision it drives, the owner, and the cadence" test is the sharpest filter in here, most tracking plans grow because adding an event is free and nobody revisits the cost of a metric nobody's actually acting on. A rule that forces deletion by default unless all three answers exist is a much better discipline than "track everything, prune later," since later never comes.

Wrapping the SDK behind a typed track() function is the one piece of advice here that pays for itself immediately regardless of team size, the moment event names are a type instead of a string, a rename or a schema change becomes a compiler error instead of a silent mismatch between what one screen logs and what a dashboard query expects.

The "screen views as a KPI" callout matches something I've seen with a tools site rather than an app, raw page-views felt like signal for a while until it became obvious a tool with high traffic and near-zero return visits wasn't actually succeeding at anything, just getting looked at once. Same shape of vanity metric, different platform.