Funnel Analysis
Intermediate 14 min read Funnel Analysis

Funnel Instrumentation

Step events that measure intention, not server noise

A funnel is only as honest as its steps' events. Instrumentation decisions — what fires, when, dedupe keys, error retries — decide whether the funnel measures user behavior or server behavior.

instrumentationstep eventsdeduperetriesevent timingfunnel definition
Before we start

What you will learn

  • Define funnel steps as events that fire on real user intent
  • Handle retries, auto-refires and double-counting in step events
  • Version funnel definitions safely
In 60 seconds

A funnel step must fire once per user-intention, not per network attempt. Dedupe keys, exact timing (client vs server) and versioning make the funnel honest.

Introduction

What is this?

Funnel instrumentation is the science of defining step events so the funnel measures user behavior faithfully. Each step needs: a single event name with an unambiguous trigger (did the user intend it?), a dedupe rule (retries and auto-refires shouldn't double count), a capture layer (client SDK vs server) matched to the step's meaning, and a versioned definition so the funnel can migrate without rewriting history.

Motivation

Why do you need it?

  • Server-side retries silently inflate step counts — 3 payment attempts become 3 conversions.
  • Client-side 'page view' steps misfire for bots, prerenderers and cached reloads.
  • Confusing 'user reached' (UI) with 'user succeeded' (server confirm) corrupts both.
  • Versioning steps lets you change definitions without breaking trend lines.
Think about it

Mental model

Imagine

Turnstiles that count re-entry as separate visitors

Think of

Un-deduped funnel steps

A museum whose turnstile double-counts people stepping out for air reports phantom attendance. Funnel steps that fire on retries are the same double-count.

Mechanics

How it works

  • Select the genuine-intent event for each step (order_confirmed from the server, not order_clicked from the UI).
  • Add a stable unique key (session_id + step_id or event_id) so dedupe is deterministic.
  • Decide the capture layer by step meaning: intent markers client-side, confirmed outcomes server-side.
  • Set the timing convention (event time vs processed time) and keep it consistent across steps.
  • Version funnel definitions (v1/v2) and run both during migrations for a comparison window.

Instrumented funnel steps.

Cart
Checkout started
Payment submitted
Order confirmed
Real world

In production

  • A checkout funnel uses order_confirmed (server) as the terminal step because order_clicked double-counted on retries by 40%.
  • A mobile app dedupes 'payment_started' by a client-generated attempt UUID, so a failed network retry doesn't inflate the step.
  • An adoption funnel versioned its activation step from v1 to v2 after a UI change and kept both active for a month to compare apples.
Guidelines

Best practices

  • Instrument committed outcomes server-side wherever truth matters (payment, order, signup).
  • Attach a unique attempt/event id to every step event so dedupe is never approximate.
  • Keep a definition comment on each step: trigger, layer, dedupe rule, version.
  • QA the funnel on a staging build with a known script of user actions before launch.
Watch out

Common mistakes

  • Firing a step on every element render (React effects, page visibility) instead of on user intent.
  • Counting server-side the same step the client also emits — the funnel never 'closes' and steps balloon.
  • Retry loops that spam the endpoint: 5 attempts, 5 events, 1 conversion.
  • Deleting the old step event on migration, silently rewriting the funnel's history.
When things break

Debugging tips

  • If a step conversion >100%, compare event sources — one step is client-fired, the other server-fired for the same logical action.
  • Step volume way above UI events? Filter for events without the session/attempt id or with bot user agents.
  • After a deploy, diff step counts day-over-day before analyzing the funnel itself.
  • To validate a step, replay a known user's journey and confirm exactly one event per intended action.
Interviews

Interview checkpoint

Practice

Hands-on lab

Instrument and Dedupe a Checkout Funnel
30 min · intermediate
In progress
Objectives
  • Simulate raw checkout events with retries and duplicate emits
  • Dedupe by attempt id at each step
  • Build an honest funnel from deduped events

Instrument and Dedupe a Checkout Funnel

30 min · intermediate

0/4 steps
0%
sandbox · Linux sandbox
$
Try these commands
Test yourself

Quick quiz

0/2
1

A user's payment call times out and retries three times, succeeding on the third. Correctly instrumented, the 'payment_submitted' step should record:

2

Versioning funnel step definitions lets you change steps without rewriting old data.

Go deeper

Official documentation