
Rheo + AppsFlyer: connecting acquisition to in-app funnel performance
Close the loop between AppsFlyer attribution and Rheo step-level funnels so you know which campaigns deliver paying users, not just installs.
Your MMP tells you which campaign drove an install. Your subscription stack tells you who paid. Between those two signals is an onboarding funnel where most users drop off, and until recently that middle was hard to attribute with the same confidence as top-of-funnel spend.
Rheo closes that gap by merging AppsFlyer acquisition context into flow sessions and exposing it in step-level analytics and decision nodes. This post explains the install-not-equal-paid problem, how data moves from AppsFlyer into Rheo, how to segment funnels by campaign, and how to run an optimization loop without replacing your existing MMP setup.
The install is not the customer
Mobile growth teams routinely optimize CPI while finance asks about CAC payback. The mismatch is structural:
- AppsFlyer attributes installs and early events to media sources, campaigns, and creatives.
- RevenueCat (or your billing layer) records trials, conversions, and churn.
- Onboarding between install and purchase is often a black box measured only as a single completion percentage.
A campaign with cheap installs but terrible onboarding completion is not a win. A expensive campaign that brings users who finish setup and start trials may be underfunded. Without connecting acquisition labels to per-screen funnel performance, you cannot reallocate spend intelligently.
What you need is a loop:
- Know which campaign produced the session
- See where that cohort drops in onboarding
- Change the flow for that cohort (or globally)
- Measure lift on trial starts and paid conversion by source
Rheo is designed for steps 2 and 3. AppsFlyer remains your source of truth for step 1.
How data flows from AppsFlyer to Rheo
Rheo does not replace the AppsFlyer SDK or store your MMP secrets server-side. The integration follows the same provider-agnostic pattern as other attribution adapters:
- Your app installs and configures
react-native-appsflyer(or the native SDK on SwiftUI when using the Rheo AppsFlyer adapter). - AppsFlyer emits install conversion and deep link payloads on the device.
- The Rheo SDK normalizes those payloads into
sdkAttributeskeys your flows can read. - Channel resolve advertises whether AppsFlyer is enabled for the app when your workspace plan includes attribution and the integration toggle is on.
- Decision nodes branch on normalized keys such as
acquisition.media_source,acquisition.campaign, and related fields. - Analytics events from the flow include session context so dashboards can break down funnels by acquisition dimensions.
Normalized attribute prefixes include:
| Prefix | Examples |
|---|---|
acquisition.* | Media source, campaign, ad set |
link.* | Deep link path, referral parameters |
attribution.* | Provider metadata, observation timestamps |
Live callbacks override a 24-hour device cache so cold opens without a fresh MMP payload still have reasonable context for experiments, while new data always wins.
Enable the integration in App settings → Integrations → AppsFlyer, then wire decision nodes in the flow builder. Full setup details live in the AppsFlyer developer guide.
Segment funnels by campaign
Step-level analytics change the conversation from "onboarding completion is 62%" to "Meta campaign A completes 71% but drops at the paywall screen; TikTok campaign B completes 48% but converts trials at 2x the rate."
Define cohorts you will actually act on
Start with media source and campaign. Ad set and creative are valuable when spend is concentrated in a few creatives. Avoid slicing so thin that weekly install volume cannot support a decision.
Read the funnel, not just the last step
For each cohort, inspect:
- Advance rate per screen (where narrative or friction fails)
- Permission grant rate when ATT or push sits in the path
- Paywall view to trial start when RevenueCat surfaces are in the flow
- Time on step proxies when available (long stalls often indicate confusion)
Rheo ties revenue outcomes to flow steps when billing events are present, so you can prioritize screens that kill trial starts, not just views.
Pair with AppsFlyer postbacks where needed
Rheo analytics excel inside the journey. For media buying automation, continue sending downstream events (trial, purchase) to AppsFlyer per your existing S2S setup. Think of Rheo as the microscope on onboarding and AppsFlyer as the ledger for UA reporting. They complement each other.
The optimization loop
Once cohorts are visible, run a disciplined loop:
1. Baseline two weeks
Resist changing copy daily. Capture funnel curves by major source with current flow.
2. Hypothesize by cohort pain
If one campaign drops on beat three, inspect that beat for message mismatch with the ad creative. If all sources drop on ATT, test permission placement rather than new ad sets.
3. Ship flow variants remotely
Publish branch rules or alternate channels without an App Store build. Examples:
- Decision node: if
acquisition.media_sourcematches paid social, route to a shorter story sequence - Experiment: global copy change on the paywall handoff screen
- Holdout: 10% on legacy path to guard against false positives
4. Measure revenue, not just completion
A shorter path that reduces trials is a loss. Primary metrics should align with finance: trial start rate, paid conversion, and ARPU by cohort when sample size allows.
5. Feed winners back to UA
When a cohort overperforms, increase budget. When a cohort underperforms after flow fixes, pause or change creative. The loop fails if marketing never sees funnel diagnostics.
Adjust and other MMPs
This guide focuses on AppsFlyer because it is the most common MMP among Rheo customers and ships first-class adapters in React Native and SwiftUI example apps. The architecture is provider-agnostic: attribution snapshots normalize into sdkAttributes, and decision nodes read universal keys.
If you use Adjust or another supported provider, the same funnel segmentation pattern applies once the adapter is enabled for your stack. Check the integrations section in your app settings and the developer docs for current provider coverage on your platform.
Setup overview
High-level checklist for engineering and growth:
- Confirm workspace plan includes attribution (required for resolve to enable AppsFlyer).
- Install and configure AppsFlyer in the host app per their documentation.
- Enable AppsFlyer under Rheo app integrations.
- Integrate the Rheo SDK and run a test resolve; verify normalized keys appear in the dashboard attribution preview where available.
- Add decision nodes or experiments that consume
acquisition.*fields where personalization is justified. - Review step funnels filtered by campaign after meaningful traffic accumulates.
Example apps in the Rheo monorepo (example-expo, example-swiftui, example-flutter) demonstrate bootstrap patterns. Use them as references, not production copies.
Troubleshooting
- Empty acquisition fields: confirm plan entitlements, integration toggle, SDK installed, and that a real device produced a conversion callback (simulators are limited).
- Stale campaign labels: remember the 24-hour cache; force a fresh session when validating new rules.
- iOS privacy: align ATT timing with Apple guidelines; flows that branch on tracking permission should handle denied states explicitly.
Worked example: one campaign, one fix
Imagine a meditation app spending heavily on short-form video ads. AppsFlyer attributes 4,000 installs per week to tiktok_int and 1,200 to facebook_int. Rheo step funnels show:
- TikTok cohort: 78% complete story beat one, 41% complete beat three, 22% reach paywall
- Facebook cohort: 65% complete beat one, 58% complete beat three, 31% reach paywall
The TikTok drop on beat three is the signal. Creative promises "sleep in seven days" but beat three discusses generic mindfulness. A Rheo variant swaps beat three for sleep-specific copy on TikTok only, using a decision node on acquisition.media_source. After two weeks, TikTok paywall reach rises to 29% and trial starts per install climb 18% without changing the paywall itself.
That is the loop: attribute, diagnose at the step, branch or swap copy remotely, measure revenue. No App Store release required for the narrative fix.
Governance between growth and engineering
Clear ownership prevents integration drift:
| Role | Responsibility |
|---|---|
| Engineering | SDK versions, AppsFlyer init, RevenueCat configure |
| Growth | Campaign naming hygiene, flow variants, readouts |
| Product | Hypothesis backlog, activation definitions |
| Analytics | Cohort joins between MMP, warehouse, and Rheo |
Campaign naming conventions matter. If media buyers rename campaigns weekly, historical funnel segments break. Standardize prefixes and document renames in your UA tracker.
What this does not do
Rheo will not:
- Replace AppsFlyer reporting for media buyers
- Attribute revenue in the MMP without your existing S2S events
- Guarantee causal lift from branching alone (you still need experiment discipline)
It does make onboarding diagnostics attributable so growth and product teams stop debating whether a campaign problem is creative, audience, or first-run experience.
Summary
Connecting AppsFlyer to Rheo links acquisition labels to step-level funnel performance. Installs become understandable when you see which screens fail per campaign, and fixes ship over the air as flow changes rather than binary releases.
Enable the integration, baseline funnels by source, and run experiments that respect both completion and revenue. Your MMP keeps reporting installs; Rheo shows what happens next.
Start for free and connect AppsFlyer to your first onboarding flow.