Instrument the full mobile growth funnel — install → activate → trial → convert → retain → refer — with the right events, cohort analysis, and the 2026 RevenueCat benchmarks to beat. Use when the user says 'what should I track', 'analytics events', 'growth metrics', 'funnel tracking', 'cohort analysis', 'instrumentation', 'KPI dashboard', or 'how do I measure my app'.
Installs into .claude/skills of the current project.
Are you the author of Instrument Growth Funnel?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/khadinakbarlabs-instrument-growth-funnel)
---
name: "instrument-growth-funnel"
description: "Instrument the full mobile growth funnel — install → activate → trial → convert → retain → refer — with the right events, cohort analysis, and the 2026 RevenueCat benchmarks to beat. Use when the user says 'what should I track', 'analytics events', 'growth metrics', 'funnel tracking', 'cohort analysis', 'instrumentation', 'KPI dashboard', or 'how do I measure my app'."
---
# Instrument the growth funnel
Decide *what to measure* before *how*. This skill defines the canonical mobile growth funnel, the events for each stage, the cohort discipline, and the 2026 benchmarks to beat. It pairs with `add-posthog-rn` (which installs the SDK) and the monetization skills — those tell you *what* the events mean.
## The canonical funnel
```text
install → activate → trial-start → trial-convert → retain → refer
```
Every metric you care about is a rate between two of these stages. If you instrument nothing else, instrument these conversions.
## The metrics (with 2026 RevenueCat medians to beat)
| Metric | What | 2026 median | Top decile |
|---|---|---|---|
| **Activation rate** | % of installs reaching the "aha" event | varies by app | — |
| **Trial-start rate** | downloads → trial started (D30) | 6.2% | 20.3% (p90) |
| **Trial-to-paid** | trial → converted | 25.5% (short trial) | 42.5% (long trial) |
| **Paywall conversion (hard paywall)** | paywall view → purchase | 10.7% | 38.7% |
| **Paywall conversion (freemium)** | paywall view → purchase | 2.1% | — |
| **Day-35 download→paid** | the ultimate funnel metric | hard: 12.1%, freemium: 2.2% | — |
| **D1 retention** | % back day after install | 26% avg | 30–40%+ good |
| **D7 retention** | | 13% avg | 15–20%+ |
| **D30 retention** | | 7% avg | 7–10%+ |
| **Stickiness (DAU/MAU)** | | — | >20% target |
| **12-mo RLTV** | revenue per payer | Health $35, Business $35, Gaming $11 | — |
Sources: [RevenueCat State of Subscription Apps 2025](https://www.revenuecat.com/state-of-subscription-apps-2025/), [Adapty State of In-App Subscriptions 2026](https://adapty.io/state-of-in-app-subscriptions/). **82% of trial starts happen on Day 0** — the onboarding window *is* the funnel.
## The event vocabulary (stable, low-cardinality)
Use these names verbatim. Low cardinality = don't put free-text user input in event properties; it explodes your bill and adds no analytic value.
```text
// Acquisition
install {source, campaign, medium} // from MMP (Branch/AppsFlyer) where allowed
activate {activation_type} // the "aha" event for THIS app
// Onboarding
onboarding_started
onboarding_step_viewed {step_id, step_index, job}
onboarding_step_completed {step_id, step_index}
onboarding_abandoned {last_step_id}
permission_pre_prompt_viewed {permission}
permission_result {permission, result}
// Monetization
paywall_viewed {placement} // onboarding_end, feature_gate, sale, winback
paywall_dismissed {placement}
trial_started {plan, trial_length}
trial_converted {plan}
purchase_completed {plan}
purchase_refunded {plan}
subscription_canceled {reason} // from cancel survey
subscription_expired // genuine lapse
// Retention
session_start // for DAU/MAU
core_action_completed {action} // the habit action
streak_updated {count}
push_received / push_opened {campaign}
message_sent / message_opened {channel, campaign}
// Referral / virality
share_card_shown {trigger}
share_card_shared {surface}
invite_sent {channel}
referred_install // deferred attribution
// Neutral review eligibility; feedback is independent of ratings
review_eligibility_checked {milestone, eligible, reason}
review_prompt_requested {platform, milestone}
feedback_opened {surface}
// A request is not proof the native UI appeared or a rating was submitted.
```
**Never** send free-form answers, health details, or other sensitive values as analytics properties by default. Use a documented consent and data-minimization contract; hashing a sensitive value does not make it anonymous.
## Cohort analysis (mandatory, not optional)
Blended metrics lie. Always group users by:
- **Install date cohort** — track each cohort's D1/D7/D30 independently. A strong old cohort can mask a deteriorating new-cohort experience.
- **Acquisition source** — paid vs organic behave completely differently; never blend. Paid cohorts often convert faster but retain worse.
- **Onboarding variant** — if you're A/B testing onboarding (see `set-up-ab-testing`), cohorts per variant.
- **Plan / trial length** — subscription retention differs by plan.
## The stack (RN/Expo)
| Tool | Role | Notes |
|---|---|---|
| **PostHog** | Product analytics + feature flags + A/B + session replay | **Recommended default.** Open source, 1M events/mo free, privacy-friendly (no cross-app tracking → **no ATT trigger**), official RN SDK with Expo Go support. ([r/reactnative](https://www.reddit.com/r/reactnative/comments/1jp1edu/analytics_for_a_react_native_app/)) |
| **RevenueCat** | Subscription analytics (MRR, churn, trial conv, LTV by cohort) | Native to the subscription stack; free tier; "Rico" AI agent. |
| Mixpanel / Amplitude | Alternative product analytics | Cloud-only; solid but PostHog's all-in-one + privacy story wins for indie. |
| Firebase Analytics | Free, unlimited events | Heavy SDK; **including the Ads SDK triggers ATT** — a frequent RN rejection. Use PostHog unless you need the Google ecosystem. |
| AppsFlyer / Branch / Adjust | Attribution (MMP) | Install attribution, deferred deep links. iOS attribution is foggy outside Apple Ads (SKAdNetwork/AdAttributionKit). |
**The ATT trap** (research-validated, the most common RN-specific rejection): including Firebase Analytics with Google Ads/AdMob features, or any tracking SDK, triggers App Tracking Transparency. If denied, IDFA zeros out and you must gate ALL the SDK's data collection behind consent — not just the prompt. PostHog sidesteps this because it doesn't do cross-app tracking. ([r/reactnative ATT rejection](https://www.reddit.com/r/reactnative/comments/1j42fr0/apple_keeps_rejecting_app_due_to_app_tracking/))
## The dashboard (what to look at weekly)
1. **Funnel conversion** week-over-week: install → activate → trial → paid. Where is the leak?
2. **Cohort retention curves** for recent install cohorts. Is D1 dropping?
3. **Paywall conversion by placement** (onboarding_end, feature_gate, winback). See `set-up-ab-testing`.
4. **Subscription health** (RevenueCat): MRR, churn %, trial-to-paid, by plan.
5. **Message performance**: open rate, conversion, and `uninstall_after_send` per campaign (the spam canary).
6. **Acquisition mix**: paid vs organic split, and each cohort's downstream quality.
## Pair with
- `add-posthog-rn` — the SDK install this instruments through.
- `set-up-ab-testing` — experimentation on top of this instrumentation.
- `design-onboarding-funnel` / `design-onboarding-quiz` — the onboarding events.
- `integrate-revenuecat-rn` — subscription analytics.
- `build-review-routing`, `design-retention-loop`, `build-win-back-flow` — they all emit the events defined here.