Conversion rate is the number that matters most, but manually piecing it together wastes time. Mixpanel funnels show exactly where users drop off and which properties (campaign source, plan tier, device) affect conversion.
Track Conversion Events
Before you can analyze conversion, you need to track each step in your flow.
Map and Track Each Funnel Step
Identify your conversion flow—usually something like signup → payment info → subscription confirmed. Track each step as a distinct event using mixpanel.track() with properties that let you segment later (campaign source, plan tier, etc.).
// Track top-of-funnel
mixpanel.track('Signup Started', {
'source': 'homepage',
'utm_campaign': 'q1_growth'
});
// Track mid-funnel
mixpanel.track('Payment Info Entered', {
'plan': 'pro'
});
// Track conversion
mixpanel.track('Subscription Created', {
'plan': 'pro',
'mrr': 99
});Identify Users and Set Persistent Properties
Call mixpanel.identify() to connect events to a user ID, then set user properties with mixpanel.people.set(). This ensures Mixpanel counts unique users converting, not unique sessions.
// Identify the user
mixpanel.identify(userId);
// Set user properties that persist
mixpanel.people.set({
'email': userEmail,
'account_tier': 'free',
'signup_date': new Date().toISOString()
});
// Set super properties that attach to every event
mixpanel.register({
'app_version': '2.1.0',
'environment': 'production'
});Build and Segment Your Funnel
Once events are flowing, create a funnel in Mixpanel to see drop-off and segment by user properties.
Create a Funnel in the Mixpanel UI
Navigate to Funnels in the sidebar and click Create New. Add your events in order (Signup Started → Payment Info Entered → Subscription Created). Mixpanel shows conversion rate between steps and total completion rate.
// Fetch funnel data programmatically
const funnelId = 'your_funnel_id';
const response = await fetch(
`https://mixpanel.com/api/2.0/funnels/${funnelId}/data?from_date=2024-01-01&to_date=2024-01-31`,
{
headers: {
'Authorization': 'Bearer YOUR_SERVICE_ACCOUNT_TOKEN'
}
}
);
const funnel = await response.json();
console.log('Conversion by step:', funnel.data[0].steps);Segment Conversion by Campaign or Cohort
In your funnel, click Segment and pick a property like 'utm_source' or 'account_tier'. Mixpanel breaks down conversion for each value, so you see if paid traffic or enterprise users convert better.
// Use JQL to query conversion breakdown by property
const jql = `
tracing({
from_step(event: "Signup Started")
to_step(event: "Subscription Created")
})
.groupby(
[properties["utm_source"]],
function(traces) {
return {
utm_source: traces[0]["properties"]["utm_source"],
conversion_rate: traces.length,
percent_converted: 100.0 * traces.length / this._count
}
}
)
`;
// Submit via Mixpanel API to executeMonitor Conversion Over Time
Track conversion trends and alert when it drops.
Build a Conversion Dashboard
Create a dashboard in Dashboards and add a Funnels card. Set the date range to Last 30 days and include segments by campaign or product tier. Refresh this dashboard weekly to catch regressions early.
// Fetch daily conversion rates
const today = new Date();
const sevenDaysAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);
const toDate = today.toISOString().split('T')[0];
const fromDate = sevenDaysAgo.toISOString().split('T')[0];
const response = await fetch(
`https://mixpanel.com/api/2.0/funnels/YOUR_FUNNEL_ID/data?from_date=${fromDate}&to_date=${toDate}&unit=day`,
{
headers: { 'Authorization': 'Bearer YOUR_SERVICE_ACCOUNT_TOKEN' }
}
);
const daily = await response.json();
const rates = daily.data.map(d => d.conversion);
console.log('Daily conversion rates:', rates);Set Up Alerts for Conversion Drops
In your Funnels view, scroll down and click Create Alert. Set a threshold like 'conversion rate below 5%' or 'daily signups below 100'. Mixpanel emails you when breached.
// Manual alert if conversion drops more than 20% week-over-week
const threshold = 0.20;
const currentConversion = rates[rates.length - 1];
const previousConversion = rates[0];
const dropPercent = (previousConversion - currentConversion) / previousConversion;
if (dropPercent > threshold) {
console.error(
`🚨 Conversion dropped ${(dropPercent * 100).toFixed(1)}% in 7 days`
);
// Trigger alert to Slack, PagerDuty, etc.
}Common Pitfalls
- Forgetting
mixpanel.identify()before tracking events—Mixpanel treats each session as a different user without it, making your conversion rates meaningless. - Using inconsistent event names across your codebase ('Signup' vs 'signup_completed' vs 'SignUp')—Mixpanel is case-sensitive and treats these as separate events, fragmenting your data.
- Tracking conversion events from only one channel (web only, not mobile app)—your funnel will show artificially low conversion and hide which channels actually work.
- Building funnels with steps that don't happen in strict order—Mixpanel requires sequential completion, so if users complete step 3 before step 2, they're not counted as conversions.
Wrapping Up
You now have visibility into drop-off rates, which channels convert best, and how conversion changes week to week. Monitor this weekly—it's usually the first signal that product changes or campaigns are working. If you want to track this automatically across tools, Product Analyst can help.