
How to personalize mobile onboarding by campaign without rebuilding the app
Attribute-based onboarding paths for paid campaigns without new app builds.
Paid install campaigns fail quietly when every user sees the same generic onboarding. Your Meta creative promises meal planning; screen two talks about generic productivity. CPI looks fine while activation tanks. Engineering's fix is often "we'll add a build flag for the fitness campaign," which ships two weeks after the ad spend is gone.
Personalize onboarding by campaign without rebuilding the app by combining attribution traits, remote flow branches, and fast publish cycles. Rheo resolves a flow manifest per user based on attributes (campaign, media source, creative, locale) and renders native screens. No new binary. No navigator refactor per campaign.
This guide covers attribute design, branch rules, operational workflow, and how paywall timing fits when billing UI stays in RevenueCat or Superwall.
Why campaign-specific onboarding matters
| Signal | Generic onboarding | Campaign-aligned onboarding |
|---|---|---|
| Message match | Creative promise fades | Continuity from ad to screen 1 |
| Time to value | Long explainer for everyone | Short path for high-intent cohorts |
| Paywall timing | One size fits all | Sooner for discount ads, later for trust ads |
| Measurable lift | Blended metrics hide wins | Per-campaign funnels |
Attribution tools (AppsFlyer, Adjust, Branch, SKAN postbacks summarized in your data warehouse) tell you which campaign drove the install. They do not author UI. The gap between attribution data and onboarding experience is where remote flows live.
Architecture overview
Install → Attribution SDK → Traits on Rheo resolve
↓
API returns manifest for channel + traits
↓
Native onboarding screens
↓
Optional: RevenueCat paywall node
↓
Activation events → analytics
Your app integrates once:
- Rheo SDK at first open (or deferred entry point)
- Attribution SDK (AppsFlyer, etc.)
- Pass campaign fields as traits on resolve
Growth operates continuously:
- Author flows per campaign or campaign group
- Publish without App Store review
- Run experiments within a campaign cohort
Traits that actually drive branches
Avoid fifty traits on day one. Start with fields your attribution stack reliably sends:
| Trait | Example values | Branch use |
|---|---|---|
media_source | facebook, google, tiktok | Platform-appropriate copy tone |
campaign | summer_fitness_2026 | Dedicated screen sequence |
adset | lookalike_us_25_34 | Offer emphasis |
creative | video_meal_prep_v3 | Hero image match |
af_status / equivalent | Organic vs non-organic | Skip paid-only urgency |
locale | de-DE | Language and compliance |
Normalize naming in a spreadsheet before you build twelve flows. summer_fitness and Summer_Fitness_2026 should not be two branches by accident.
Trait freshness
Attribution callbacks can arrive after first paint. Patterns:
| Pattern | When to use |
|---|---|
| Default flow, swap on trait update | Attribution usually within 2 seconds |
| Short splash while traits resolve | Strict campaign match required |
Hold branch until campaign non-empty | Prevent mis-assignment to default |
Document your app's behavior so growth knows if first screen can change mid-session.
Branch design patterns
Pattern A: One flow, conditional screens
Single canvas with branches: if campaign contains fitness → fitness benefit screens, else → default.
Pros: One experiment framework, easier maintenance
Cons: Canvas complexity grows
Pattern B: Separate channels per campaign group
Channels: first_open_fitness, first_open_finance, first_open_default. Resolver picks channel from traits.
Pros: Clean analytics per channel, simpler canvases
Cons: More channels to maintain
Pattern C: Hybrid
Default channel with top 3 campaigns as overrides. Everything else falls through.
Pros: Balances ops and clarity
Cons: Requires governance (when to promote campaign to dedicated channel)
| Team size | Recommended pattern |
|---|---|
| Small growth team | C with 2-3 overrides |
| Active paid spend across many lines | B for top spenders |
| Early product-market fit | A until campaigns stabilize |
Worked example: fitness campaign
Campaign creative: "Track macros in 30 seconds."
Onboarding path:
- Hero: meal photo + "Track macros in 30 seconds" (matches ad)
- Single choice: primary goal (cut / maintain / bulk)
- Two-screen product demo (logging flow only)
- ATT prompt (after value, not before)
- RevenueCat paywall with trial (paywall UI in RC, not Rheo)
Default path for organic users:
- Generic value prop
- Broader feature tour (4 screens)
- Signup earlier in sequence
- Paywall after signup
Same app binary. Different manifests. Publish new creative match the same day marketing swaps ad assets (hero image URL in manifest).
Personalization without paywall ownership
Rheo does not manage paywall templates. For campaign-specific pricing or trial length, pass offering identifiers to RevenueCat or Superwall based on the same traits:
| Campaign type | Journey (Rheo) | Paywall (RC/Superwall) |
|---|---|---|
| Discount ad | Shorter path, urgency copy on screen 2 | Promotional offering |
| Brand story ad | Longer narrative | Standard offering |
| Retargeting | "Welcome back" beat | Win-back offering if entitled |
Journey and paywall experiments should not run on the same users without a design doc. Sequence: nail campaign onboarding in Rheo, then test offering in RC for that cohort.
Operational workflow
| Day | Marketing | Growth / product |
|---|---|---|
| -7 | Brief new campaign, share creative assets | Clone flow template |
| -3 | Finalize tracking links | Wire trait mapping in staging |
| -1 | QA install on test devices | Verify branch + funnel events |
| 0 | Launch spend | Monitor step funnel hourly |
| +3 | Read CPI vs activation | Iterate copy on worst drop step |
| +14 | Scale or kill campaign | Archive or promote channel |
Publish cadence: Copy and image swaps are minutes. New branch arms are hours, not sprint weeks.
Analytics: per-campaign funnels
Required events (conceptual):
| Event | Use |
|---|---|
flow_started | Denominator per campaign |
step_completed | Step drop-off |
flow_completed | Onboarding done |
paywall_presented | From RC + Rheo edge |
trial_started | RevenueCat |
Join campaign trait on every event. Dashboard questions you should answer:
- Which campaign has best step 3 completion?
- Where does
tiktoktraffic fall off vsfacebook? - Does shortened path increase trial starts without hurting week-4 retention?
Experiments within campaigns
Once baseline campaign flow exists, test inside the cohort:
| Test | Example |
|---|---|
| Path length | 3 vs 5 screens for same campaign |
| ATT timing | Before vs after demo |
| Social proof | With vs without testimonial screen |
| Paywall entry | Direct vs after signup |
Hold campaign trait constant. Change only one flow variable per experiment.
Common failures
| Failure | Fix |
|---|---|
| Traits never reach SDK | Debug attribution → Rheo callback chain |
| Every campaign gets default | Normalize campaign string matching |
| Creative mismatch persists | Update manifest hero, not just ads |
| Paywall shows wrong price | Sync offering ID mapping table |
| Ops overload (50 flows) | Consolidate to campaign groups |
Compliance and store policy notes
Personalization must not deceive users about what the app does. Campaign-specific onboarding should reinforce the real product, not promise features you lack. Regional rules (GDPR consent timing, kids apps) may require locale branches independent of campaign.
Integration checklist
- Attribution SDK sends campaign fields to Rheo traits on resolve
- Default flow exists for organic and missing attribution
- Top campaigns have mapped flows or branches
- Paywall offering IDs documented per campaign group
- Step funnels visible per
campaigndimension - Publish process owned by growth (not release train)
Summary
Personalize onboarding by campaign by passing attribution traits into remote flow resolution, branching native screens without app rebuilds, and keeping paywall UI in RevenueCat or Superwall. Match ad promise to screen one, shorten paths for high-intent cohorts, and measure step funnels per campaign instead of blended activation.
Start for free and publish campaign-specific onboarding flows from the dashboard.