The acquisition funnel, all channels
Each stage is a share of the one before it, so the drop from signup to trial dominates the drop the revenue team talks about.
How it decided
E-commerce funnel: 120 rows, 11 columns. the four stage columns, summed across cohorts.
120 rows in, 4 out across 2 columns. Each stage is a share of the one before it, so the drop from signup to trial dominates the drop the revenue team talks about.
hbar. Stages of one funnel only ever shrink; drawn as ranked bars in funnel order so the collapse from visitors to purchases is the whole shape.
Palette, spacing, axis titles and legend placement applied. 0 issues found.
The transformation
This is the code, not a description of it — the chart above was drawn from what it returns, and the notebook download runs the same lines against the same file.
stages = ["visitors", "signups", "trials_started", "purchases"]
result = df[stages].sum().rename("people").reset_index()
result = result.rename(columns={"index": "stage"})
result["stage"] = pd.Categorical(
result["stage"], categories=stages, ordered=True
).astype(str)
What it charted
4 rows out of 120, 2 columns. First 4 shown.
| stage | people |
|---|---|
| visitors | 3238800 |
| signups | 242354 |
| trials_started | 98814 |
| purchases | 27743 |