Activation funnel
@usagemetrics/activation-funnel
Measure an activation funnel from an events CSV: how many users or accounts reach each step within a time window, conversion step to step, median time between steps, the biggest drop, and splits by plan or any segment. Writes markdown, CSV, JSON, and a list of who got stuck.
- Activity
- New: be the first to try it
- Installs
- 0 installs
- Likes
- 0 likes
- Clones
- 0 clones
- 1---
- 2name: activation-funnel
- 3description: Measure a new-user or new-account activation funnel from a product events export. Shows how many reach each step within a time window, step-to-step conversion, median time between steps, the biggest drop, splits by plan or segment, and a list of who got stuck. Use when the user asks "where do new users drop off", "what is our activation rate", "onboarding funnel", "time to value", "trial conversion steps", or wants to improve onboarding.
- 4license: MIT
- 5---
- 7# Activation funnel
- 9Finds where new users stall between signing up and getting value. Steps are counted in order and inside a time window, and users who signed up too recently to finish are left out, so the funnel is not dragged down by people still in the middle of it.
- 11## Inputs
- 131. An events CSV in `data/` with `timestamp`, `account_id`, `user_id`, `event`.
- 142. **The steps, in order.** Ask the user for 3 to 5 events from signup to the moment of value. A good funnel for most B2B tools: `signed_up` > a setup step (`connected_source`, `invited_teammate`) > first core action (`created_report`) > a habit or sharing signal (`shared_dashboard`). If they are unsure, list the 20 most common events in the file and propose a funnel.
- 153. **The window:** how long a new user has to finish (default 14 days; 7 for self-serve tools, 30 for products with a sales-led setup).
- 164. Optional **segments:** a CSV with `account_id` and a column such as `plan`, `channel`, or `company_size`.
- 18## Steps
- 201. Confirm the step names exist in the file (exact spelling) and the date range.
- 212. Run:
- 23 ```bash
- 24 node scripts/funnel.mjs data/events.csv --steps signed_up,connected_source,created_report,shared_dashboard --window-days 14 --segments data/accounts.csv --segment-column plan --out out/funnel
- 25 ```
- 27 Options: `--entity account` (an account counts when any of its users does the step), `--any-order` (steps can happen in any order inside the window), `--from` and `--to` (limit to signups in a date range, for before and after comparisons), `--as-of`, `--include-recent`.
- 283. Read `out/funnel.md` and report: overall conversion, the biggest drop with its step-to-step rate, the slowest step (median time), and any segment that is 10+ points better or worse than the rest.
- 294. Suggest two or three concrete experiments aimed at the biggest drop, tied to what the step is (for example: a drop into `connected_source` points at setup friction, so try sample data or a guided connector; a drop into `shared_dashboard` points at no reason to share yet, so try a share prompt right after the first report).
- 305. `out/funnel-stuck.csv` lists the IDs that stalled at the biggest drop. Offer it to customer success for outreach; do not contact anyone yourself.
- 316. For a before and after view (for example around an onboarding change), run twice with `--from` and `--to` and compare the two tables.
- 33## Output template
- 35```markdown
- 36**Activation (users, 14 days): 28%** (44 of 158 signups reached shared_dashboard)
- 37Biggest drop: created_report > shared_dashboard, 58% make it. Median 23 h between them.
- 38Business plan converts 40%, free 23%.
- 39| Step | Reached | % of start | % of previous | Median time |
- 40...
- 41Try next: <experiment 1>, <experiment 2>.
- 42```
- 44## Guardrails
- 46- Do not change step definitions silently. If a step name is missing from the data, stop and ask.
- 47- Small segments (under 30 starters) are noisy; say so rather than ranking them.
- 48- The stuck list is personal data. Keep it in `out/`, share counts in chat, never the IDs.
