What is Funnel Step Definition?
Funnel step definition is the precise, unambiguous specification of each step in a funnel: the event to match, who is counted, in what order, within what time limits, and with which filters. Clear definitions make your funnel metrics trustworthy and reproducible.
Why this matters
- Product decisions: Identify which step blocks users (e.g., Add to Cart vs. Checkout Started).
- Experiment analysis: Ensure A/B results aren’t biased by loose or changing definitions.
- Stakeholder alignment: Avoid debates caused by different interpretations of “conversion.”
- Diagnostics: Pinpoint where drop-offs happen and which cohorts are most affected.
Concept explained simply + Mental model
Think of a funnel like a series of doors. A user must pass each door in order, within a time limit, and with the right badge (filters). A step definition tells the guard at each door exactly who may pass and under what conditions.
- Stream: A user generates a stream of timestamped events.
- Gates: Each step is a gate with rules (event name, properties, filters).
- Clock: A time window controls how long a user has to reach the next step.
- Counter: Decide whether you count unique users, sessions, or orders.
Core components of a step definition
- Event: The specific event name(s) to match.
- Actor identity: user_id, session_id, account_id (state clearly).
- Order: Steps are usually sequential; clarify if out-of-order is allowed or not.
- Time window: Maximum allowed time between steps (e.g., 24 hours after previous step).
- Filters: Event/property filters (platform, country, AB variant, device), user segment filters, exclusion rules (e.g., staff/bot traffic).
- Counting unit: Unique users vs. sessions vs. orders. State one.
- Deduping rule: Use first event after the previous step, or nearest, or last within window.
- Entry rule: Where users can enter the funnel (first step only, or multiple entry points).
- Optional/OR steps: Allow optional steps or alternate paths? Specify clearly.
- Resetting: Does a user re-enter the funnel after completing it (or after timeout)?
Quick checklist for any funnel step
- Did I name the event(s) exactly?
- Did I specify actor identity and counting unit?
- Did I define ordering and time window between steps?
- Did I set filters and exclusions?
- Did I define deduping for repeated events?
- Did I clarify entry and re-entry rules?
- Did I state optional and OR logic explicitly?
Worked examples
Example 1: Signup Activation Funnel
Optional/exclusions: exclude staff=true; Entry at Step 1 only; Re-entry allowed after 14 days if Step 2 not reached.
Why this works
It captures intent (signup_started), confirms account (email_verified), then checks actual activation (first_session) with practical time windows and deduping.
SQL-ish sketch (illustrative)
-- Pseudocode for clarity only
WITH s1 AS (
SELECT user_id, MIN(timestamp) AS t1
FROM events
WHERE event='signup_started' AND platform IN ('web','ios','android') AND staff=false
GROUP BY user_id
), s2 AS (
SELECT e.user_id, MIN(e.timestamp) AS t2
FROM events e JOIN s1 ON e.user_id=s1.user_id
WHERE e.event='email_verified' AND e.timestamp BETWEEN s1.t1 AND s1.t1 + INTERVAL '7 days'
GROUP BY e.user_id
), s3 AS (
SELECT e.user_id, MIN(e.timestamp) AS t3
FROM events e JOIN s2 ON e.user_id=s2.user_id
WHERE e.event='first_session' AND e.timestamp BETWEEN s2.t2 AND s2.t2 + INTERVAL '3 days'
GROUP BY e.user_id
)
SELECT COUNT(DISTINCT user_id) AS activated FROM s3;Example 2: E-commerce Purchase Funnel
Exclude test users; Optional steps: none; Entry at Step 1 only; Re-entry allowed after purchase completion.
Notes
Many add_to_cart events can occur. Deduping to the first instance keeps the path consistent and avoids inflating conversion rates.
Example 3: B2B Trial Activation with OR logic
Entry at Step 1; Optional steps: 2A or 2B OR logic; Exclude internal accounts; Re-entry not allowed during active trial.
Decision rules and edge cases
Out-of-order events
Default: disallow. If allowed, define the window and specify how to backfill earlier steps when later steps appear first.
Multiple qualifying events
Choose deduping: first, nearest to previous step, or last within window. Declare your choice per step.
Cross-device identity
Use a unified user_id if available. If not, define how to stitch anonymous session_ids to user_id after login (or avoid cross-device counting).
Timeouts and re-entry
Specify when a user can re-enter (e.g., after 7 days of inactivity or after conversion) and whether partial progress resets.
Exercises
Do these short exercises. Then open the solutions to self-check.
Define a precise funnel for Mobile Onboarding: App Install → Open App → Complete Tutorial → Create Account. Requirements: start within 7 days of install; each subsequent step within 24h of the previous; actor = user_id; region filter = country in [US, CA]; exclude bots=true; tutorial may repeat (dedupe = first after previous step); Enable Notifications event is optional (if present between tutorial and create account, do not block the path). Write your definition clearly.
Using your Exercise 1 rules, a user does: t0 Install; t0+10m Open App; t0+3h Complete Tutorial; t0+1d2h Create Account; t0+1d3h Complete Tutorial again; t0+1d3h10m Enable Notifications. Do they convert? Why?
Show checklist before checking solutions
- Actor and counting unit stated
- Events named exactly
- Time windows between each step
- Filters and exclusions included
- Deduping rule for repeats declared
- Entry and re-entry policy stated
- Optional step treatment explained
Exercise 1 — Suggested solution
Specification:
- Counting unit: unique user_id; Entry: Step 1 only; Re-entry: not during a 7-day window.
- Step 1: app_install; Filters: country in [US, CA], bots=false.
- Step 2: app_open within 7 days after Step 1; Dedupe: first app_open after Step 1.
- Step 3: tutorial_completed within 24h after Step 2; Dedupe: first tutorial_completed after Step 2.
- Optional: enable_notifications if it occurs between Step 3 and Step 4; it does not gate the next step.
- Step 4: account_created within 24h after Step 3; Dedupe: first account_created after Step 3.
{
"count_by": "user_id",
"entry": "step1_only",
"reentry": "no_within_7d",
"steps": [
{"id":1, "event":"app_install", "filters":{"country":["US","CA"],"bots":false}},
{"id":2, "event":"app_open", "window":"7d_after_prev", "dedupe":"first"},
{"id":3, "event":"tutorial_completed", "window":"24h_after_prev", "dedupe":"first"},
{"id":4, "event":"account_created", "window":"24h_after_prev", "dedupe":"first"}
],
"optional_between": [{"after":3, "before":4, "event":"enable_notifications"}]
}Exercise 2 — Suggested solution
Yes, the user converts.
- Install → Open App: 10 minutes (within 7 days)
- Open App → Tutorial: 3 hours (within 24h)
- Tutorial → Create Account: 23 hours (within 24h)
- Extra tutorial after account and notifications are non-gating and do not invalidate the path.
Common mistakes and how to self-check
- Missing time windows: Leads to inflated conversions. Always state a window between steps.
- Ambiguous actor identity: Mixing session_id and user_id changes rates. Pick one per funnel.
- Ignoring duplicates: Repeats can jump steps or skew attribution. Define deduping.
- Vague entry rule: Allowing mid-funnel entry without saying so produces inconsistent cohorts.
- Changing definitions mid-report: Document version and freeze it during analyses.
- Not excluding test/staff/bots: Pollutes data. Add explicit exclusions.
Self-check prompt
If two analysts implement your funnel independently, will they produce the same counts? If not, which rule is underspecified?
Practical projects
- Project 1: Redefine an existing funnel with precise windows, deduping, and exclusions. Compare conversion rates before vs. after.
- Project 2: Build an OR-branch funnel (e.g., Activation via Invite OR Project Creation). Show how branch logic changes step-through rates.
- Project 3: User vs. Session funnel. Implement both on the same path and explain differences in drop-offs.
Mini challenge
Define a subscription funnel: View Pricing → Start Checkout → Submit Payment → Subscription Active. Constraints: out-of-order events are possible due to delayed webhooks; payment must be within 48h of checkout; subscription_active may arrive up to 24h after payment; count by account_id; exclude currency != USD; allow re-entry only after a cancellation. Write your exact rules.
Show one possible answer
- Actor: account_id; Count: unique account_id
- Step 1: pricing_view (currency=USD)
- Step 2: checkout_started within 24h after Step 1 (dedupe=first)
- Step 3: payment_submitted within 48h after Step 2 (dedupe=nearest_to_step2)
- Step 4: subscription_active within 24h after Step 3
- Out-of-order handling: payment_submitted before checkout_started not allowed; subscription_active before payment_submitted allowed only if a matching payment arrives within 24h prior (then backfill Step 3)
- Re-entry: allowed only after cancellation event
Who this is for
- Product Analysts and Data Analysts working on growth, activation, and revenue
- PMs or Marketers who need consistent conversion metrics
- Engineers defining tracking specs
Prerequisites
- Basic event analytics concepts (events, properties, users/sessions)
- Comfort reading simple SQL or analytics tool filters
- Understanding of your product’s key events and data quality caveats
Learning path
- 1) Learn event schema and naming conventions
- 2) Practice defining steps with windows and filters
- 3) Handle duplicates, optional/OR steps, and re-entry
- 4) Validate with timelines and sample users
- 5) Automate and document funnel definitions
Next steps
- Apply these rules to one live funnel this week
- Document your final definition and freeze it for experiments
- Set a recurring review to catch drift in events or properties
Quick Test
Take the quick test below to check your understanding. Everyone can take it for free; only logged-in users will have their progress saved.