Skip to content
Log in

Theory

Funnels: conversion window, step order and who counts

How a funnel conversion rate is computed, and why the conversion window, the step order and who enters give different numbers on the same users.

~10 min read · 9 exercises · 250 points

Before you start

Where do new users get stuck?

You're on the product team at Halves, a bill-splitting app for flatmates, couples and trips, with a paid plan, Halves Plus. This module asks where new users get stuck on the way to the app's value. You'll build funnels that mean one thing, read them without being fooled by time, find the early action that predicts staying, and finish with a case on fixing the onboarding funnel.

This first lesson shows what a funnel is and the three choices that change its number: who enters, the step order and the conversion window.

What a funnel is, and what it depends on

A funnel is a sequence of steps with the share of users who reach each one: sign-up → group created → member invited → first expense. It answers "where do people drop off on the way to value?"

A line of doorways along a hallway; fewer people pass through each next door.
A funnel: a row of steps and the share of people who reach each one.

Its result depends on three choices: who enters, the order of the steps (each strictly after the previous one, or any order) and the conversion window (how long people have).

Each step's rate can be read two ways. Step conversion divides by the previous step and shows where people drop; conversion from the top divides by everyone who entered and shows how many get this far. Always say which.

Theo's dashboard says 58% of new users create a group. Recount it on 12 users who signed up last Monday: everyone enters, and 7 have a value in group_created_h. 7 ÷ 12 = 0.583 ≈ 58.3%. The arithmetic is right, and for this first step both readings coincide.

Dataset · 12 rows

12 new Halves users: hours to each onboarding step

Empty cell: the user never did that step.

user_idjoined_via_invitegroup_created_hmember_invited_hfirst_expense_hexpense_after_invite_h
f01false0.10.311
f02false0.223030
f03false0.51000.6
f04false35200200
f05false0.1500.3

First 5 of 12 rows

Download CSV

But before reacting to any funnel number, ask "58% of whom, in what order, within how long?" Change any of the three and the same users give a different number.

  • Do
    “58.3% of all 12 sign-ups created a group, any time, any order.”
  • Don't
    “42% of new users leave in the first minute.”

    Reads a drop-off story into a number before checking who entered.

Who enters: only users for whom every step applies

Look at who didn't create a group in Theo's 58%: f06, plus all four users with joined_via_invite = true. Those four accepted a friend's invite and landed straight in an existing group. There was nothing for them to create.

They aren't dropping out; they skipped a step that was never theirs. Counting them as failures makes onboarding look worse than it is. Without them, 7 of the 8 self-signups created a group: 87.5%, not 58.3%.

Newcomers walk up to a front door, while invited guests step straight through a side door into a room where friends already share a receipt.
Invitees skip a step that was never theirs, so they need their own path.

Dataset: 12 new Halves users: hours to each onboarding step · shown above

The rule: a funnel only includes people for whom every step applies. Users who arrive by a different path get their own funnel with their own steps. For invitees, something like "joined → first expense" fits.

Two tempting fixes are wrong:

  • crediting them with the step ("they're in a group, so count it") hides what really happened;
  • deleting them as noise throws away some of your best users, who arrive into a group that already works.

Write the entry rule into the funnel's definition: "self-signups only (joined_via_invite = false)".

  • Do
    Self-signups: 7 of 8 created a group (87.5%). Invitees: own funnel, joined → first expense.
  • Don't
    Count invitees as having created a group, since they're in one.

    Credits a step nobody took.

The conversion window

The conversion window is the time a user has to complete a step, measured from entering the funnel, here from sign-up. It answers Maya's "how long do we wait before we call someone lost?"

With the 8 self-signups:

  • 24-hour window: f01, f02, f03, f04, f05 and f08 created a group within a day; f07 did it at 26 hours, f06 never. 6 ÷ 8 = 75%.
  • 7-day window: f07 now counts too. 7 ÷ 8 = 87.5%.
An hourglass beside a door; one person reaches it while sand still runs, another arrives after it has emptied.
How long you wait before calling someone lost changes the number.

Dataset: 12 new Halves users: hours to each onboarding step · shown above

Measure every step from the same starting point, the funnel entry, not from the previous step. Otherwise the window quietly grows with every step.

How to choose a window:

  • match the natural usage rhythm, how often a satisfied user needs the product (DAU, WAU, MAU and stickiness): a weekly product like Halves needs at least a few days, or it cuts off slow but real users like f07;
  • match the decision: a very long window means waiting weeks before you can read a cohort's result.

Whatever you choose, write it in the definition: "group within 24 hours" and "group within 7 days" are different metrics.

  • Do
    “Group within 24 h of sign-up: 6 of 8 (75%); within 7 days: 7 of 8 (87.5%).”
  • Don't
    Count f07 as converted in a 24-hour funnel because the group came only 2 hours late.

    A window is a rule, not a suggestion.

Two windows, two correct numbers

When two windows give two numbers, the natural question is "which is more accurate?" It's the wrong question.

For a group of users whose windows have fully passed, a longer window can only count the same people or more: anyone who converted within 24 hours also converted within 7 days. So 87.5% being higher than 75% says nothing about accuracy. It says that one more person, f07, converted between hour 24 and day 7.

Both numbers are correct answers to different questions:

  • "How many create a group within a day?" tells you how smooth the first session is.
  • "How many create a group within a week?" tells you how many get there at all, at the product's natural pace.

Pick the window that serves the decision. If the onboarding team is redesigning the first screen, the 24-hour number is the sharper signal. If the question is whether new users reach value at all, the 7-day number fits better.

Then keep it. Switching windows to get a nicer number is the funnel version of a quiet definition change.

  • Do
    “For the first-screen redesign we track group within 24 h; for reach, within 7 days.”
  • Don't
    “Let's report the 7-day number: it's higher, so it must be the real one.”

    A longer window is always at least as high; that's not accuracy.

Strict order funnels

In a strict order funnel, a step counts only if it happens after the previous one. For Maya's funnel, group created → member invited → expense, the expense must come after the invite. That's what expense_after_invite_h records.

With 8 self-signups and a 7-day window (168 hours from sign-up for every step):

  • pass: f01 (0.1 → 0.3 → 1 h), f02 (0.2 → 2 → 30 h), f07 (26 → 27 → 28 h);
  • fail: f03 and f05 added no expense after their invite; f04's expense came at 200 hours, outside the window; f08 never invited anyone; f06 did nothing.

Dataset: 12 new Halves users: hours to each onboarding step · shown above

3 ÷ 8 = 37.5%.

Work through such a funnel person by person, step by step, and write down the reason each failure fails. The reasons matter as much as the rate: "no expense after the invite" and "expense too late" point at different fixes.

Also note f04: in order, but late. Remove the window and strict order gives 4 of 8, 50%. So both the order rule and the window move the number, separately.

  • Do
    f02: group 0.2 h → invite 2 h → expense after invite 30 h, all ≤ 168 h: passes.
  • Don't
    f03 passes strict order: it has a group, an invite and an expense.

    f03's expense (0.6 h) came before the invite (100 h).

Any order, and what the gap tells you

Drop the order rule and require only that all three steps happen within 168 hours, using first_expense_h. Now 5 of 8 pass, 62.5%, instead of 3 of 8.

The two extra users are f03 (expense at 0.6 h, invite at 100 h) and f05 (expense at 0.3 h, invite at 50 h). They did everything within the week, just in a different sequence: they added an expense first and invited people later. Maybe they wanted to show friends a balance before asking them in.

Dataset: 12 new Halves users: hours to each onboarding step · shown above

The others don't change: f07 already passed in order; f04's expense at 200 hours is outside the window either way; f08 never invited anyone.

The lesson isn't "any order is better". It's that a step order is a belief about the right path, and the data can prove it wrong. If many users take another path and still reach value, question the funnel before blaming the users. Strict order is still the right choice when the order is the point, for example when an expense only makes sense once someone else is in the group to share it.

  • Do
    “f03 and f05 add an expense first and invite later: our assumed order may be wrong.”
  • Don't
    “f03 and f05 failed onboarding: they didn't follow the steps.”

    Blames users for not matching a path the team assumed.

A separate funnel for a separate path

A separate path needs its own funnel, built with all three choices: who enters, the steps and their order, and the window. Taking invitees out of the self-signup funnel isn't the end of the job.

  • Who enters: users with joined_via_invite = true.
  • Steps: they're already in a group, so the first step that shows value is their first expense: joined → first expense.
  • Window: the same 168 hours from sign-up, so the two funnels can be read side by side.

In the sample of 12: f09 added an expense at 0.5 h, f10 at 6 h, f12 at 3 h, and f11 did nothing. 3 ÷ 4 = 75%.

Dataset: 12 new Halves users: hours to each onboarding step · shown above

Two cautions. First, with four people, each one is 25 percentage points; a tiny funnel is a sketch of the method, not a benchmark. Real funnels need hundreds of users per step before small differences mean anything. Second, don't compare the 75% directly with a three-step self-signup funnel: different steps, different question. Compare each funnel with itself over time, and compare paths only on a shared step, such as "first expense within 7 days".

  • Do
    Invitee funnel: joined → first expense ≤ 168 h: 3 of 4 (75%), small sample.
  • Don't
    “Invitees convert at 75% vs 37.5% for self-signups, so invites are twice as good.”

    Compares funnels with different steps, on four and eight people.

Write the funnel's definition next to it

The same 8 users gave three different "onboarding conversions":

  • strict order, 7-day window: 37.5%;
  • strict order, no window: 50%;
  • any order, 7-day window: 62.5%.

None is wrong. Each is a different metric, and "which one is our onboarding conversion?" has one honest answer: whichever we define and keep.

So a funnel's caption has four parts, written next to the chart:

  1. who enters: self-signups only, joined_via_invite = false;
  2. the steps: group created → member invited → expense;
  3. the order rule: strict or any order;
  4. the window: all steps within 7 days of sign-up.

With the caption, 62.5% means one thing and next month's number can be compared with it. Without it, someone rebuilds the funnel with another setting and starts an argument about whether onboarding got worse.

How it fits together: who enters, the order and the window each move the number, so a funnel is a definition, not a fact. Next, Reading a funnel: right censoring and date ranges shows how time and date ranges mislead even a well-defined funnel.

  • Do
    “Self-signups; group → invite → expense; any order; ≤ 7 days from sign-up: 62.5%.”
  • Don't
    “Onboarding conversion: 62.5%.”

    Could be any of three setups that give 37.5%, 50% or 62.5%.

Ready to practise?

Answer the lesson's exercises and earn 250 points the first time you finish it.

Start the exercises