ActivationPal

Mobile app onboarding: design and measure

A good mobile app onboarding flow asks one goal question, delivers first value before any account wall, requests each permission when the feature needs it, and shows the paywall after value. Make each screen one measured step so you can see which one loses people.

Design the app onboarding flow

Start with a goal question

One question about what the user wants gives you something to personalize and something to measure. Record the choice as the answer on that step. The ActivationPal dashboard splits the answers under the step, so you see which goals new users pick.

Show value before you ask for anything

Put the first useful moment ahead of the account wall, the permission prompts and the paywall. A user who has seen what the app does has a reason to say yes to the next request.

Time the permission prompts

Ask for a permission when the user is about to use the feature that needs it, with one line saying why. On iOS the system prompt is shown once, so a denial can only be reversed in Settings.

If you add a screen that explains notifications before the system prompt, give it its own step id, such as notifications. Then the opt-in screen has its own row in the funnel.

Place the paywall

Show the paywall after the user has seen value, and make it a step you can read. paywallShown("onboarding") separates this placement from a paywall opened in settings. Compare plan selected with purchased to see whether people choose a plan and then stop at the purchase sheet.

Onboarding carousel or interactive screens

A carousel works for three or four short screens with a visible skip button. Give each swipe page its own step id. A long carousel shows up in the funnel as a steady loss on every page, which is the sign to cut it or replace it with a screen where the user does something.

Map every onboarding screen to a step

Decide the screens first, then give every screen one call. With the ActivationPal Swift SDK that is onboardingStep: one call per screen, in order, index from 0, an id, and an answer on screens where the user makes a choice.

// One call per screen, in order. Index starts at 0.
ActivationPal.onboardingStep(0, id: "goal", answer: "lose_weight")
ActivationPal.onboardingStep(1, id: "notifications")
ActivationPal.onboardingCompleted()

// The paywall, if onboarding ends with one.
ActivationPal.paywallShown("onboarding")
ActivationPal.paywallPlanSelected("yearly")
ActivationPal.paywallPurchased("yearly")
ActivationPal.paywallDismissed()

Call onboardingStep when the screen appears, and onboardingCompleted on the last screen. The funnel row for a screen is keyed by its index, rows are ordered by index, and the row is labelled with the id. Keep each screen's index and id the same across releases, so a screen stays one row. Setup is in the quickstart and every call is listed in the events reference.

Onboarding UX checklist

  • One primary action per screen.
  • Progress is visible, so the user knows how much is left.
  • Optional steps can be skipped.
  • Text stays readable at large text sizes.
  • The flow works on the smallest iPhone you support.

Measure onboarding drop-off

The dashboard shows one funnel: installed, each of your onboarding steps in index order, completed, then paywall shown, plan selected and purchased. Hover a stage to see its conversion from the stage before and how many users were lost there. Under question steps, the answers are split by choice.

Find the biggest loss between two neighbouring stages, change that one screen, and compare the next install cohort. Change one thing per release, so a difference between cohorts has a cause. A sensible order:

  1. The screen with the biggest loss.
  2. The position of the permission prompts.
  3. The paywall placement.

To try the arithmetic on your own step counts, use the funnel calculator. The onboarding funnel guide covers building the funnel, and onboarding completion rate covers how to read the completed stage.

Frequently asked questions

What is a good onboarding flow for an iOS app?

A short one: a goal question, a first taste of value, permission prompts at the moment they matter and, if the app is paid, a paywall after value. Make each of those a step with its own onboardingStep call, so you can see which one loses people.

How many screens should onboarding have?

As few as it takes to reach the first value. The funnel shows how many installs reach each screen, so a screen with a large loss and little purpose is the first one to cut.

When should an app ask for notification permission?

When the user is about to benefit from notifications, with a line explaining why. Because the iOS system prompt cannot be shown again after a denial, a context-free ask on launch spends your only chance. Give the notifications screen its own step id to see how many users reach it.

How do I track onboarding drop-off in my app?

Call ActivationPal.onboardingStep(index, id:) on every onboarding screen and ActivationPal.onboardingCompleted() on the last one. The dashboard funnel then shows the count at each step and the users lost between them. The quickstart has the setup.

Can I build a custom onboarding funnel?

No. The funnel is fixed: installed, your onboarding steps, completed, then paywall shown, plan selected and purchased. Custom events appear in the Events card with counts and unique devices.