Funnel Analysis: Finding Where Your Users Actually Drop Off
What a funnel actually answers
A funnel measures how many people who completed step N go on to complete step N+1. Its value is not the final conversion number — it is knowing which step is losing people, so you fix the right thing.
"Our signup conversion is 3%" is not actionable. "62% of people who reach the pricing page start signup, but only 31% of those finish the email verification" tells you where to spend the week.
Choosing your steps
Good funnels have three properties:
- Sequential and required. Each step must genuinely precede the next. If users can reach checkout without the pricing page, pricing does not belong as a prior step — you will report a fictional drop-off that is really just an alternate path.
- Few. Three to five steps. A twelve-step funnel splinters into numbers too small to be significant at every level.
- Meaningful. Each step should map to something you could plausibly change.
A workable SaaS funnel:
Visited pricing → Started signup → Verified email → Completed onboarding → Activated
Strict vs loose ordering
This choice changes your numbers substantially, so make it deliberately.
Strict ordering requires steps in exact sequence with nothing in between. Accurate for rigid flows like checkout; too rigid for exploratory products where people wander back to pricing mid-signup.
Loose ordering requires only that step N happened before step N+1, with anything allowed in between. This is the right default for most product funnels.
In SQL, loose ordering means comparing timestamps rather than adjacency:
WITH first_touch AS (
SELECT visitor_id,
min(CASE WHEN event_name = 'pricing_viewed' THEN timestamp END) AS t1,
min(CASE WHEN event_name = 'signup_started' THEN timestamp END) AS t2,
min(CASE WHEN event_name = 'email_verified' THEN timestamp END) AS t3,
min(CASE WHEN event_name = 'onboarding_completed'THEN timestamp END) AS t4
FROM events
WHERE timestamp >= current_date - 30
GROUP BY visitor_id
)
SELECT
count(*) FILTER (WHERE t1 IS NOT NULL) AS step_1,
count(*) FILTER (WHERE t2 > t1) AS step_2,
count(*) FILTER (WHERE t3 > t2 AND t2 > t1) AS step_3,
count(*) FILTER (WHERE t4 > t3 AND t3 > t2 AND t2 > t1) AS step_4
FROM first_touch;The chained conditions are what enforce order. Dropping them — just counting who did each event — is the most common funnel bug, and it always overstates conversion.
The attribution window
Over what period must the whole funnel complete? A checkout funnel might use one session. A B2B trial-to-paid funnel might reasonably use 30 days.
Pick a window that matches your actual sales cycle, and state it on the chart. A funnel with no stated window silently reports "ever," which makes recent cohorts look worse than old ones purely because they have had less time.
Read the conversion between steps, not from the top
Two ways to express the same funnel:
| Step | Users | % of step 1 | % of previous |
|---|---|---|---|
| Pricing viewed | 10,000 | 100% | — |
| Signup started | 3,200 | 32% | 32% |
| Email verified | 2,900 | 29% | 91% |
| Onboarding done | 1,100 | 11% | 38% |
The "% of previous" column is where the answer is. From the top, step 4 looks like the disaster at 11%. Step-over-step reveals that email verification is nearly fine at 91%, and onboarding is losing 62% of the people who already verified their email. Those are people who wanted the product enough to confirm an email address. That is the expensive leak.
Segment the funnel
An aggregate funnel is an average of several different funnels. Split it:
- By source. Paid traffic often converts step 1→2 well and 3→4 badly — this depends on clean UTM tagging.
- By device. Mobile drop-off at a form step usually means the form is the problem.
- By first-time vs returning.
- By cohort week. Did the funnel change after last month's redesign?
SELECT device_type,
count(*) FILTER (WHERE t2 > t1) * 100.0
/ nullif(count(*) FILTER (WHERE t1 IS NOT NULL), 0) AS step_1_to_2_pct
FROM first_touch JOIN sessions USING (visitor_id)
GROUP BY device_type;Traps worth knowing
Survivorship in the denominator. Comparing this week's completed funnels to this week's step-1 entries penalizes recent entries that have not finished yet. Use completed cohorts: only count visitors whose full attribution window has elapsed.
Counting events instead of people. Someone who reloads checkout four times is one person, not four. Deduplicate by visitor before counting.
Optional steps modelled as required. If 40% of users legitimately skip a step, your funnel reports a 40% drop-off that represents nothing.
Small numbers. Below a few hundred entrants per step, week-to-week movement is mostly noise. Widen the window rather than reacting to it.
Frequently asked questions
How many steps should a funnel have?
Three to five. Longer funnels fragment the population until each step's numbers are too small to act on, and they mix genuinely different journeys into one average.
What is the difference between strict and loose ordering?
Strict requires the steps in exact sequence with nothing between; loose allows other events in between. Loose reflects real behaviour better, strict is right when the sequence itself is the thing being tested.
What attribution window should I use?
Slightly longer than the decision naturally takes. A signup funnel might use one session; a B2B trial-to-paid funnel needs weeks. Too short and you discard real conversions, too long and you attribute unrelated ones.
Why read step-to-step conversion rather than from the top?
Because top-of-funnel percentages hide where the loss happens — every step after a big drop looks bad. Step-to-step rates identify the one transition worth fixing.
What is the survivorship trap in funnel analysis?
Concluding things about all users from the ones who reached a late step. People at step four are already self-selected as more motivated, so their behaviour says little about why step two lost everyone else.
Turning drop-off into a fix
Once you have found the leaking step, get specific:
1. Look at the page in a heatmap or a session view. Where do they stop scrolling? What do they click that is not clickable?
2. Check performance on that step, on mobile specifically.
3. Check for errors. A JS error on a form submit produces exactly this signature — high intent, zero completion.
4. Count the required fields. Form length is the most reliable single predictor of form abandonment.
5. Ship one change, then re-measure that step's conversion in isolation.
Funnels tell you where. Heatmaps, error tracking, and performance data tell you why. InsightsTrack ships all four in one place, which matters because the answer is usually in the correlation between them. Related: heatmaps and rage clicks, the SQL behind funnels, and cohort retention.
Try InsightsTrack free
Open-source, self-hosted, privacy-first analytics — explore the live demo, no install required.
Open live dashboard