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
What it makes
Real output from this kit
- Sample file1 KB, download to openFunnel stuckFrom the kit's tests
- Sample file809 bytes, download to openFunnelFrom the kit's tests
- Sample file4 KB, download to openFunnelFrom the kit's tests
How this works
- It is a skill: written instructions Claude reads when your request matches what the skill is for. You do not call it by name; just ask for the task.
- While it works, it reads and changes files in the places it lists, nowhere else.
- It runs these commands on your computer: node scripts/funnel.mjs.
- Nothing runs until you choose to use it, and you can remove it any time.
SKILL.md
Activation funnel
Finds 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.
Inputs
- An events CSV in
data/withtimestamp,account_id,user_id,event. - 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. - 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).
- Optional segments: a CSV with
account_idand a column such asplan,channel, orcompany_size.
Steps
- Confirm the step names exist in the file (exact spelling) and the date range.
Run:
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/funnelOptions:
--entity account(an account counts when any of its users does the step),--any-order(steps can happen in any order inside the window),--fromand--to(limit to signups in a date range, for before and after comparisons),--as-of,--include-recent.- Read
out/funnel.mdand 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. - Suggest two or three concrete experiments aimed at the biggest drop, tied to what the step is (for example: a drop into
connected_sourcepoints at setup friction, so try sample data or a guided connector; a drop intoshared_dashboardpoints at no reason to share yet, so try a share prompt right after the first report). out/funnel-stuck.csvlists the IDs that stalled at the biggest drop. Offer it to customer success for outreach; do not contact anyone yourself.- For a before and after view (for example around an onboarding change), run twice with
--fromand--toand compare the two tables.
Output template
**Activation (users, 14 days): 28%** (44 of 158 signups reached shared_dashboard)
Biggest drop: created_report > shared_dashboard, 58% make it. Median 23 h between them.
Business plan converts 40%, free 23%.
| Step | Reached | % of start | % of previous | Median time |
...
Try next: <experiment 1>, <experiment 2>.Guardrails
- Do not change step definitions silently. If a step name is missing from the data, stop and ask.
- Small segments (under 30 starters) are noisy; say so rather than ranking them.
- The stuck list is personal data. Keep it in
out/, share counts in chat, never the IDs.
README.md
Activation funnel
Shows where new users drop off between signup and the moment they get value: reach and conversion for each step inside a time window, median time between steps, the biggest drop, and splits by plan or any segment you have.
Who it is for: product managers, growth teams, and founders working on onboarding or trial conversion.
Example
Input: examples/events.csv (180 signups over three months) and examples/accounts.csv (plan per account).
--steps signed_up,connected_source,created_report,shared_dashboard --window-days 14Output (out/funnel.md):
| Step | Reached | % of start | % of previous | Dropped | Median time from previous |
|---|---|---|---|---|---|
| signed_up | 158 | 100% | 100% | 0 | |
| connected_source | 122 | 77% | 77% | 36 | 4.0 h |
| created_report | 76 | 48% | 62% | 46 | 17.5 h |
| shared_dashboard | 44 | 28% | 58% | 32 | 22.7 h |
Plus the same table per plan, out/funnel.csv, out/funnel.json, and out/funnel-stuck.csv (who stalled at the biggest drop).
What it can access
- Runs
node scripts/funnel.mjs(Node built-ins only). - Reads
data/. Writesout/funnel*. - No network. It never contacts users.
Setup
None. Export events to data/events.csv and ask Claude where new users drop off.
Files
- README.md
- SKILL.md
- examples/accounts.csv
- examples/events.csv
- kit.json
- scripts/funnel.mjs
- scripts/lib.mjs
Did it work?
0worked for them0did not work
Sign in to say whether it worked for you.
Nobody has said yet. Tried it? Tell the next person.
