Funnel analysis shows you where users drop off in critical workflows. If you can't see how many signups complete onboarding or how many trial users upgrade, you're flying blind. Mixpanel's Funnels report lets you track this in minutes.
Set Up Event Tracking for Funnel Steps
Before you can visualize a funnel, you need to track the events that make it up. Each step in your funnel is a separate event.
Track funnel step events with the Mixpanel SDK
Initialize Mixpanel in your app and call mixpanel.track() for each key event. Give your events clear, descriptive names like Signup Started, Payment Attempted, or Account Created.
import mixpanel from 'mixpanel-browser';
mixpanel.init('YOUR_PROJECT_TOKEN');
mixpanel.track('Signup Started', {
source: 'homepage',
plan_type: 'pro'
});
mixpanel.track('Email Verified', {
verification_method: 'email',
time_to_verify: 120
});
mixpanel.track('Payment Completed', {
amount: 99,
currency: 'USD',
plan: 'pro'
});Attach properties to segment your funnel
Include properties on every event so you can later segment your funnel by plan type, source, region, or any other dimension. Properties help you answer questions like 'Do enterprise users have a higher completion rate?'
mixpanel.track('Onboarding Completed', {
user_id: user.id,
plan_type: user.plan,
days_to_complete: 3,
num_logins: 5,
source: 'api_integration',
region: 'us'
});plan_type in one event and subscription_plan in another, Mixpanel treats them as separate properties and segmentation breaks.Create Your Funnel in the Mixpanel Dashboard
Once events are flowing, go to the Mixpanel UI and build your first funnel.
Navigate to Funnels and add your first step
Log into Mixpanel, go to Analytics > Funnels. Click + New Funnel. In step 1, select the first event in your funnel (e.g., Signup Started) from the dropdown. Mixpanel auto-loads all tracked events.
// Your tracked events become available in Mixpanel immediately
// Example funnel configuration in the UI:
// Step 1: 'Signup Started' (1000 users)
// Step 2: 'Email Verified' (750 users, 75% conversion)
// Step 3: 'Payment Completed' (450 users, 60% conversion)
// Step 4: 'Onboarding Completed' (300 users, 67% conversion)
// Mixpanel calculates conversion rates between each step automaticallyAdd conditions to filter funnel steps
Click + Add step and select your second event. You can optionally add conditions to refine which events count — for example, only count Payment Completed if the amount is greater than $0, or only count Onboarding Completed if num_logins is at least 1.
// In the Mixpanel UI, click "Add condition" on any step
// Example: Event 'Payment Completed' where amount >= 99
// This filters out test transactions under $99
// Track properties that let you apply conditions:
mixpanel.track('Payment Completed', {
amount: 99.00,
is_test_transaction: false,
payment_method: 'card'
});Segment your funnel to understand drop-off
After building the funnel, click Segment by and choose a property. Mixpanel will break out conversion rates by that dimension. For example, segment by plan_type to see if Pro users have higher onboarding completion than Free users.
// Include properties you want to segment on later
mixpanel.track('Signup Started', {
plan_type: 'pro', // Segment by plan
source: 'paid_search', // Or by traffic source
region: 'us', // Or by region
company_size: 'enterprise' // Or by company size
});
// In the UI: click "Segment by plan_type" to see conversion by planUse Funnel Results to Drive Decisions
Once your funnel is live, use the data to identify bottlenecks and run experiments.
Identify where users drop off
Look at the funnel chart. If 90% complete step 1 but only 30% complete step 2, that step is your bottleneck. Drill into that step with additional properties to understand why — is the form too long? Is the verification email going to spam?
// Track failure reasons to debug bottlenecks
mixpanel.track('Email Verification Failed', {
reason: 'invalid_email',
user_id: user.id,
email_provider: 'gmail',
attempt_number: 1
});
mixpanel.track('Email Verification Skipped', {
reason: 'user_clicked_skip',
email_provider: 'yahoo'
});Test variations and measure impact
Run A/B tests on bottleneck steps. Tag events with experiment metadata so you can segment your funnel by variant. Compare conversion rates between control and treatment groups.
// Tag events with experiment info for later segmentation
mixpanel.track('Signup Started', {
experiment: 'shorter_form_v2',
variant: 'variant_a',
form_field_count: 5,
expected_time: '2 minutes'
});
// Later, segment the funnel by 'variant' to compare
// variant_a (5 fields) vs control (10 fields)Common Pitfalls
- Tracking events at different times — if you track 'Signup Started' on the frontend but 'Email Verified' on the backend, clock skew can cause the funnel to misfire. Track all funnel events as close in time as possible to when they actually happen.
- Forgetting to set user identity — use
mixpanel.identify(user_id)before tracking events, or funnel steps won't connect to the same user. Without consistent user tracking, Mixpanel shows 0% conversion. - Using ambiguous event names like 'clicked' or 'loaded' — name events after what actually happened ('Checkout Started', not 'Button Click'). Ambiguous names make funnels hard to interpret and impossible to debug.
- Adding too many steps at once — a 10-step funnel is hard to read and often includes journeys that aren't actual workflows. Start with 3–5 core steps, then add more if needed.
Wrapping Up
You now have a working funnel that shows where users convert and where they drop off. Use these insights to prioritize optimization — fix your biggest bottleneck first. If you want to track this automatically across tools, Product Analyst can help.