Features · Analyse
Build a funnel from pages and events in a few clicks. Step N only counts when it happened AFTER step N−1 in the same session — which sounds obvious and is exactly what most tools get wrong.
Unordered counting ("this session touched both /pricing and signup") is easier and wrong: someone who signs up and later browses pricing would count as converted, and your funnel inflates.
Each step matches the FIRST occurrence after the previous step, so viewing /pricing twice does not advance the funnel twice.
Per-step conversion, total conversion against step one, and the step with the largest loss identified for you.
Every vertical ships with a sensible default funnel, so you see one before configuring anything. A "define a funnel first" screen is where most analytics tools get abandoned.
The evidence
WITH s0 AS (SELECT session_id, MIN(ts) AS t FROM events
WHERE site_id = ? AND ts >= ? AND ts < ? AND bot_kind = ''
AND type = 'pageview' AND path = ?
GROUP BY session_id),
s1 AS (SELECT e.session_id, MIN(e.ts) AS t FROM events e
JOIN s0 p ON p.session_id = e.session_id AND e.ts >= p.t
WHERE e.site_id = ? AND e.ts >= ? AND e.ts < ? AND e.bot_kind = ''
AND e.type = 'event' AND e.name = ?
GROUP BY e.session_id)
SELECT (SELECT COUNT(*) FROM s0) AS step0, (SELECT COUNT(*) FROM s1) AS step1
e.ts >= p.t is the ordering. The dashboard shows you this query for your own funnel, with your own parameters.
A funnel is scoped to one session. Someone who reads your pricing page today and signs up tomorrow does not complete the funnel, and a journey that starts on a phone and ends on a laptop counts as two people. Both follow from having no persistent identifier — the same decision that removes your consent banner. For multi-day journeys, identify your users and use retention instead.