Use whichever product analytics source is connected — the shape of the analysis is the same, only the call differs. Do not query all three and merge; they define sessions and users differently and the numbers will not reconcile.
Steps
-
Establish the real step sequence. Don't assume it. List the available events first:
- PostHog:
posthog.list_events - Mixpanel:
mixpanel.list_events - Amplitude:
amplitude.list_eventsConfirm the ordered step names with the user if they're ambiguous. A funnel built on guessed event names produces confidently wrong output.
- PostHog:
-
Run the funnel.
- Amplitude:
amplitude.funnel_reportwith the orderedeventsarray and an explicitconversion_window_seconds. - Mixpanel:
mixpanel.list_funnelsfirst, thenmixpanel.funnel_reportwith thefunnel_id. Mixpanel funnels are saved objects — you generally cannot define an ad-hoc one here. - PostHog:
posthog.querywith a HogQL query over the events table, orposthog.list_insightsto find an existing saved funnel.
- Amplitude:
-
Compute step-to-step conversion, not just overall. The largest single drop between adjacent steps is the finding. Overall conversion tells you there's a problem; step-to-step tells you where.
-
Segment the worst step. Re-run split by a meaningful dimension (
group_byon Amplitude,onfor Mixpanel, a GROUP BY in HogQL) — device, plan, signup source, or country. Drop-off is rarely uniform, and a step that's fine on desktop but collapses on mobile is a much sharper finding than the average. -
Report. A step-by-step table: step name, users entering, users continuing, step conversion rate, drop-off count. Call out the worst step, quantify what fixing it to parity would be worth in absolute users, and note the segment where it's worst.
Gotchas
- The conversion window drives the result. A 1-hour window and a 7-day window on the same funnel give very different answers. State the window you used; if the product has a long consideration cycle, a short window manufactures drop-off that isn't real.
- Funnels are ordered. Users completing steps out of order may be excluded entirely depending on the tool's mode. Check whether the funnel is strict or any-order before interpreting.
- Instrumentation gaps look exactly like user drop-off. If a step shows near-total loss, verify the event is actually firing before concluding the UI is broken.
mixpanel.export_eventsis expensive — it streams raw events. Usemixpanel.segmentationor a saved funnel unless raw rows are genuinely required.- Don't compare funnel numbers across tools. If two are connected, pick one, and say which.