Use case · Onboarding · Activation

Find the onboarding that actually activates

How many steps, in what order, asking what — and how the flow should adapt to what the user just told you. Today each of those questions costs a frontend rebuild, so most teams answer them once a year.

signup surface = medium riskcompletion rate guarded per phase

The problem

Onboarding is where drop-off compounds, and where iteration is slowest.

Every step in a signup flow loses people. That makes onboarding the highest-leverage funnel in the product — and the one teams touch least, because changing the order of two screens means rewiring a state machine, updating validation, and shipping through review on three platforms.

So instead of ten small experiments, teams do one big redesign a year. The redesign moves several things at once, activation shifts by a few points, and nobody can say which of the twelve changes did it.

Personalization makes it worse. "Show the team-invite step only to users who said they work with others" starts as a reasonable if, and ends up as a thicket of branches nobody can measure — because each branch is code, not configuration.

onboarding/flow.ts
// before — a rebuild per experiment
const STEPS = [
  'account', 'company', 'role',
  'invite_team', 'connect_data',
  'pick_template', 'tour',
];

if (answers.role === 'solo') {
  // one more branch nobody measures
  STEPS.splice(3, 1);
}

// after — order and inclusion are values,
// resolved per user from one parameter set

What you put under control

The flow becomes data. Declared once, then governed centrally.

Parameters
ParameterTypeDefault
onboarding.step_orderjson7 steps
onboarding.required_stepsjson4 of 7
onboarding.ask_role_firstbooleanfalse
onboarding.defer_data_connectbooleanfalse
Surfaces that consume them
SurfaceKindRole
Signup webfrontendrender
Mobile onboardingfrontendrender
Flow orchestratorbackenddecision

Those bindings are what compute the risk class — medium: backend surface · decision binding.

Variants are parameter value sets
Variantstep_orderask_role_first
control7 stepsfalse
short-path5 stepsfalse
role-first5 stepstrue

One change moves the order and the length together, so you are testing a coherent flow rather than an isolated screen.

Risk class: medium

A person approves the measurement plan before traffic, and again before the winning flow becomes the default. Signup is the one funnel you cannot quietly break.

Adapt to what the user just told you

Answers from step two are context for step three — and context is measurable.

The context you already pass to the SDK — plan, referral source, company size, and the answers collected so far — is what the flow adapts on. Because that context is an input to resolution rather than a branch in your code, each adaptation is a policy you can measure and roll back.

Start with targeted overrides where you already have a hypothesis. Move to a contextual bandit when you would rather have the system learn which sequence suits which kind of user, within the guardrails you set.

The important part is that "solo users skip the invite step" stops being an assumption buried in a component. It becomes a policy with an effect size attached.

No new branches in the client
Contextual policy / onboarding-personalization adaptive
Context signalLearned sequenceLift
role = soloshort-path, no invite+8.4%
role = team leadrole-first, invite early+5.1%
company > 200defer data connect+3.7%
referral = partnercontrolno effect

Segments you did not think to test

A bandit surfaces where the effect actually lives. "Partner referrals behave like the control" is a finding worth having — it stops you personalizing something that does not need it.

How it runs

The mechanism is configuration. The application code is already done.

Canary → Experiment → Rollout
Then a contextual policy once the shape is proven.

Onboarding has a long feedback loop: the thing you care about is activation a week later, not whether someone clicked "next". The experiment phase runs to a sample sized on the real outcome, and measurement progress tells you how far off a verdict you are.

Users are assigned once and stay assigned. Someone who begins signup in the short-path arm finishes in it, even if they abandon and return the next day on a different device.

Phases live
Setup
Canary
Experiment
Rollout
Complete
Guardrails on every phase
signup_completion_rate
must not decrease > 1%
blocking
form_error_rate
must not increase > 0.5%
blocking
time_to_first_action
must not increase > 20%
warning
onboarding_support_tickets
must not increase > 10%
warning

What you get back

A verdict on activation, not on click-through.

onboarding-step-reduction / measurement live
Short-path wins — ready to promote
Activation at 7 days is up and the interval has cleared zero. All guardrails passing. Awaiting human approval to make it the default.
primary metric
+6.8%
activation_rate_7d · reached first key action
measurement progress
100%
sample reached, interval cleared zero
guardrails
4 / 4
passing, none near threshold
activation_rate_7d primary
short-path +6.8% · role-first +2.1% · both vs 7-step control
+6.8%
signup_completion_rate guardrail
up on both arms — fewer steps, more finishers
passing
time_to_first_action guardrail
down 31% on short-path
passing
day_30_retention secondary
flat — the shorter flow did not cost long-term engagement
no change

The secondary metric is the one that matters politically. Someone will argue a shorter onboarding produces less committed users — here the 30-day retention number answers it directly, and it was in the plan before the change ran rather than requested afterwards.

On completion the winning step order becomes the parameter default, and the whole record is retained: what was asked, which sequences were tried, the interval at the moment of the call, and who approved it.

Retained after this change

5 steps beat 7 on activation by 6.8% with retention flat. A later attempt at 3 steps regressed activation — the floor is 5. Do not re-run without a new hypothesis.

Searchable by parameter, surface, or metric

Keep reading

The mechanics behind this page.

Make the flow a value, not a rebuild

Parameterize the step order this week. The first measured change usually pays for the integration.