
Product analytics with revenue attribution for subscription apps
Subscription apps need analytics that tie installs and campaigns to trials, paid conversion, and renewals: not vanity install charts.
Product analytics for consumer apps often stops at engagement: sessions, screens, feature adoption. Subscription businesses live and die on revenue per cohort. If your analytics cannot answer which acquisition channel produced paying subscribers: not just which channel produced cheap installs: you are optimizing the wrong funnel.
This post defines what revenue attribution means in a mobile subscription context, why install volume misleads growth teams, how RevenueCat, Superwall, and Stripe fit without being replaced, a worked example with channel-level readouts, and how segments turn insight into action with Rheo Analytics.
Install ≠ revenue
The failure mode is familiar:
- Marketing celebrates a CPI win on a new creative.
- Product analytics shows healthy onboarding completion.
- Finance reports trial-to-paid below plan and CAC payback stretching.
Each dashboard told a true story about a different slice of the user. None connected campaign → journey → payment on one timeline.
| Metric | What it optimizes | Blind spot |
|---|---|---|
| Installs | UA efficiency | Quality of user intent |
| Onboarding completion | UX friction | Whether completers pay |
| Trial starts | Monetization top of funnel | Channel mix and LTV |
| MRR / revenue | Business health | Which acquisition sources fund it |
Revenue attribution closes the loop: attribute subscription outcomes (trial start, first paid period, renewal, refund) to the first-touch or agreed acquisition dimensions captured when the user entered the product.
That is not the same as forwarding purchase events to an MMP alone. MMPs excel at media buying; they are weaker at step-level funnel context and product-led segments. Product analytics tools excel at events; they are weaker at billing truth unless you maintain flawless identity glue.
First-touch fields that actually matter
You do not need fifty UTM parameters. You need a stable, documented set stored on the user profile at first open (or first identified session):
| Field | Example | Used for |
|---|---|---|
media_source | facebook, organic, apple_search_ads | Channel rollups |
campaign | US_iOS_prospecting_q4 | Budget allocation |
ad_set / adgroup | fitness_25_34 | Creative and audience tests |
creative | video_hook_a | Creative iteration |
keyword (ASA) | workout planner | Search intent |
install_time | ISO timestamp | Cohort windows |
Hygiene beats granularity. Renaming campaigns weekly without a mapping table breaks historical segments. Document conventions in a shared runbook marketing and engineering both reference.
Rheo normalizes MMP and deep-link payloads into profile attributes so Analytics funnels and retention charts can break down by campaign without re-querying the attribution SDK on every report.
Billing tools stay in their lane
Revenue attribution does not mean moving subscriptions into your analytics vendor.
| System | Role in attribution |
|---|---|
| RevenueCat | Source of truth for trials, conversions, renewals, refunds, product ids |
| Superwall | Paywall presentation and paywall experiments; purchase outcomes still land in RC or StoreKit |
| Stripe | Web checkout, customer portal, B2B hybrid; revenue events attach to the same Rheo profile when connected |
| MMP | Install and re-engagement labels; optional S2S revenue postbacks for UA dashboards |
Rheo Analytics ingests purchase and subscription lifecycle signals (via SDK and integrations) and joins them to acquisition fields and in-app behavior. It does not process payments or issue entitlements.
For paywall steps inside Rheo flows, see How to use Rheo with RevenueCat. RevenueCat remains authoritative for MRR charts; Rheo is authoritative for which path and channel produced that MRR.
Example: channel table you can act on
Imagine a weekly growth review. You want one table: not three exports.
| Campaign | Installs | Paywall reach % | Trial start % | Paid (30d) % | Est. revenue / install |
|---|---|---|---|---|---|
ASA_brand | 4,200 | 62% | 18% | 9% | $2.40 |
Meta_broad | 28,000 | 41% | 8% | 2% | $0.55 |
Influencer_may | 1,100 | 71% | 22% | 14% | $4.10 |
Organic | 9,800 | 58% | 15% | 11% | : |
Reading the table:
Meta_broaddrives volume but underperforms on paywall reach: onboarding or targeting may be wrong, not the paywall price.ASA_brandconverts trials efficiently; paid % suggests trial experience or pricing follow-through needs work.Influencer_mayis small but high intent; worth scaling if creative fatigue is controlled.
Without revenue per install (or per trial), teams overfund CPI winners and underfund high-LTV niches.
In Rheo Analytics, build this view by:
- Defining funnel steps: first open → key onboarding steps → paywall presented → trial or purchase.
- Breaking down by
campaign(ormedia_source) on the same profile that recorded billing events. - Saving the breakdown as a segment for Convert experiments or Engage campaigns.
Segments: from chart to motion
Attribution tables are useless if they only live in a slide deck. Segments connect analytics to action:
| Segment | Definition | Action |
|---|---|---|
| High-intent drop-off | Campaign in top quartile for paywall reach, bottom quartile for trial | Test shorter path in Convert |
| Trial, no day-2 | trial_started and no session day 2 | Day-2 Engage nudge with value reminder |
| Paid, low D7 | First paid period and retention below baseline | Onboarding variant for that campaign only |
| Refund risk | Trial cancel in first 48h | Survey flow + offer branch |
Segments should use the same identity as funnel analytics. Re-exporting user ids from Mixpanel into a messaging tool every week reintroduces the glue problem the growth platform model avoids.
Instrumentation checklist
Before trusting revenue attribution:
| Check | Pass criteria |
|---|---|
| Identity | Anonymous pre-signup merges to identified user; Rheo userId stable across sessions |
| Purchase deduping | One trial_started per user per product; server and client do not double-fire |
| Campaign persistence | First-touch fields immutable unless you explicitly model re-attribution |
| Flow version on events | flow_variant present during experiments |
| Currency | Revenue events include currency for multi-region apps |
Validate with a test device: install from a tagged link, complete onboarding, start trial, confirm campaign appears on the profile and in Analytics revenue breakdown.
Rheo Analytics in the stack
Rheo Analytics is built for subscription funnels:
- Step-level completion and conversion on Convert flows
- Retention and activation tied to acquisition dimensions
- Revenue milestones joined to the profile that walked the journey
Teams already on Mixpanel or PostHog may keep those tools for general product analytics. Many use Rheo as the subscription growth layer: funnels that end in trial and paid, segments that feed Engage, and experiments that ship OTA.
Related reading:
- How to see which acquisition channel drives subscription revenue: practical walkthrough from UTM to paid.
- Mixpanel + RevenueCat vs one analytics profile: when separate tools still make sense.
Product analytics without revenue attribution trains teams to celebrate installs. Subscription apps need the opposite: fewer vanity metrics, clearer line from campaign → payment.