Rheo CLI is live. Let your agents be your growth engine.

Learn more
Campaign-specific onboarding personalization workflow
Product

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

SignalGeneric onboardingCampaign-aligned onboarding
Message matchCreative promise fadesContinuity from ad to screen 1
Time to valueLong explainer for everyoneShort path for high-intent cohorts
Paywall timingOne size fits allSooner for discount ads, later for trust ads
Measurable liftBlended metrics hide winsPer-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:

TraitExample valuesBranch use
media_sourcefacebook, google, tiktokPlatform-appropriate copy tone
campaignsummer_fitness_2026Dedicated screen sequence
adsetlookalike_us_25_34Offer emphasis
creativevideo_meal_prep_v3Hero image match
af_status / equivalentOrganic vs non-organicSkip paid-only urgency
localede-DELanguage 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:

PatternWhen to use
Default flow, swap on trait updateAttribution usually within 2 seconds
Short splash while traits resolveStrict campaign match required
Hold branch until campaign non-emptyPrevent 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 sizeRecommended pattern
Small growth teamC with 2-3 overrides
Active paid spend across many linesB for top spenders
Early product-market fitA until campaigns stabilize

Worked example: fitness campaign

Campaign creative: "Track macros in 30 seconds."

Onboarding path:

  1. Hero: meal photo + "Track macros in 30 seconds" (matches ad)
  2. Single choice: primary goal (cut / maintain / bulk)
  3. Two-screen product demo (logging flow only)
  4. ATT prompt (after value, not before)
  5. RevenueCat paywall with trial (paywall UI in RC, not Rheo)

Default path for organic users:

  1. Generic value prop
  2. Broader feature tour (4 screens)
  3. Signup earlier in sequence
  4. 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 typeJourney (Rheo)Paywall (RC/Superwall)
Discount adShorter path, urgency copy on screen 2Promotional offering
Brand story adLonger narrativeStandard offering
Retargeting"Welcome back" beatWin-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

DayMarketingGrowth / product
-7Brief new campaign, share creative assetsClone flow template
-3Finalize tracking linksWire trait mapping in staging
-1QA install on test devicesVerify branch + funnel events
0Launch spendMonitor step funnel hourly
+3Read CPI vs activationIterate copy on worst drop step
+14Scale or kill campaignArchive 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):

EventUse
flow_startedDenominator per campaign
step_completedStep drop-off
flow_completedOnboarding done
paywall_presentedFrom RC + Rheo edge
trial_startedRevenueCat

Join campaign trait on every event. Dashboard questions you should answer:

  • Which campaign has best step 3 completion?
  • Where does tiktok traffic fall off vs facebook?
  • Does shortened path increase trial starts without hurting week-4 retention?

Experiments within campaigns

Once baseline campaign flow exists, test inside the cohort:

TestExample
Path length3 vs 5 screens for same campaign
ATT timingBefore vs after demo
Social proofWith vs without testimonial screen
Paywall entryDirect vs after signup

Hold campaign trait constant. Change only one flow variable per experiment.

Common failures

FailureFix
Traits never reach SDKDebug attribution → Rheo callback chain
Every campaign gets defaultNormalize campaign string matching
Creative mismatch persistsUpdate manifest hero, not just ads
Paywall shows wrong priceSync 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 campaign dimension
  • 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.