Flow Events Tracking
Track the right flow events to gain actionable insights without noise.
Overview#
Event tracking in flows serves two purposes:
- Funnel analysis: Understand where users drop off in multi-step flows
- Behavior insights: Learn what users engage with and what they skip
The key is balance — track enough to understand behavior, but not so much that you drown in noise.
System Events (Automatic)#
These events are tracked automatically by the SDK:
| Event | When | Insight |
|---|---|---|
__started__ | Flow is shown | How many users see the flow |
__completed__ | complete() is called | How many users finish successfully |
__dismissed__ | dismiss() is called | How many users exit early |
With just these three events, you get a basic conversion rate: __completed__ / __started__
Do not trigger __started__, __completed__, or __dismissed__ yourself — they are fired automatically by the SDK when the flow is shown and when you call complete() or dismiss().
What to Track#
✓ Track These#
// ✓ GOOD: Meaningful, actionable events
// Step completion - shows funnel progression
Mobana.trackEvent('step_1_completed');
Mobana.trackEvent('step_2_completed');
Mobana.trackEvent('step_3_completed');
// Key decisions - shows user intent
Mobana.trackEvent('plan_selected'); // User chose a plan
Mobana.trackEvent('feature_enabled'); // User enabled a feature
Mobana.trackEvent('notification_allowed'); // User granted permission
// Engagement signals - shows interest level
Mobana.trackEvent('video_watched'); // Watched explainer video
Mobana.trackEvent('faq_expanded'); // Read FAQ answer
Mobana.trackEvent('learn_more_clicked'); // Wanted more info✗ Avoid These#
// ✗ BAD: Too granular, noise-generating events
// Don't track every micro-interaction
Mobana.trackEvent('button_hovered'); // Not useful
Mobana.trackEvent('text_selected'); // Not useful
Mobana.trackEvent('scroll_started'); // Not useful
// Don't track redundant events
Mobana.trackEvent('step_1_viewed'); // __started__ covers this
Mobana.trackEvent('step_1_button_clicked');
Mobana.trackEvent('step_1_completed'); // Just track completion
// Don't use vague names
Mobana.trackEvent('click'); // Click on what?
Mobana.trackEvent('action'); // What action?
Mobana.trackEvent('event'); // Not descriptiveThe Golden Rule#
"If this event increases, what would I do differently?"
If you can't answer that question, you probably don't need the event.
- step_2_completed increases: "Great, step 2 is working well. Maybe optimize step 3 now."
- video_watched increases: "The video is engaging. Let's make it more prominent."
- button_hovered increases: "...so what?" (Don't track this)
Funnel Tracking Pattern#
For multi-step flows, track completion of each step to identify drop-off points:
// ONBOARDING FLOW - Event Strategy
// These events create a clear funnel in analytics:
// __started__ (automatic) → step_1 → step_2 → step_3 → __completed__
document.getElementById('step-1-continue').addEventListener('click', () => {
Mobana.trackEvent('step_1_completed'); // 1. Track step
Mobana.haptic('light');
showStep(2);
});
document.getElementById('step-2-continue').addEventListener('click', () => {
Mobana.trackEvent('step_2_completed'); // 2. Track step
Mobana.haptic('light');
showStep(3);
});
document.getElementById('step-3-finish').addEventListener('click', () => {
Mobana.trackEvent('step_3_completed'); // 3. Track step
Mobana.haptic('success');
Mobana.complete({ onboardingVersion: '2.0' }); // → triggers __completed__
});
// Track skip/dismiss too - valuable insight
document.getElementById('skip-btn').addEventListener('click', () => {
Mobana.trackEvent('onboarding_skipped');
Mobana.dismiss(); // → triggers __dismissed__
});This creates a funnel in your Dashboard:
Decision Point Tracking#
Track user choices to understand preferences:
// DECISION POINTS - Track user choices
// Plan selection
document.querySelectorAll('input[name="plan"]').forEach(radio => {
radio.addEventListener('change', (e) => {
const plan = e.target.value;
Mobana.trackEvent(`plan_${plan}_selected`);
// Creates: plan_free_selected, plan_pro_selected, plan_team_selected
});
});
// Feature preferences
document.querySelectorAll('.feature-toggle').forEach(toggle => {
toggle.addEventListener('change', (e) => {
const feature = e.target.dataset.feature;
const enabled = e.target.checked;
Mobana.trackEvent(`feature_${feature}_${enabled ? 'enabled' : 'disabled'}`);
});
});
// Permission decisions
document.getElementById('enable-notifications').addEventListener('click', async () => {
Mobana.trackEvent('notification_prompt_accepted');
const granted = await Mobana.requestNotificationPermission();
Mobana.trackEvent(granted ? 'notification_granted' : 'notification_denied');
});
document.getElementById('skip-notifications').addEventListener('click', () => {
Mobana.trackEvent('notification_prompt_skipped');
});Naming Convention#
Consistent naming makes analytics easier to understand:
// NAMING CONVENTION
// Use snake_case
Mobana.trackEvent('step_completed'); // ✓ Good
Mobana.trackEvent('stepCompleted'); // ✗ camelCase
Mobana.trackEvent('StepCompleted'); // ✗ PascalCase
Mobana.trackEvent('step-completed'); // ✗ kebab-case
// Be specific
Mobana.trackEvent('notification_permission_granted'); // ✓ Clear
Mobana.trackEvent('permission_granted'); // ✗ Which permission?
// Use consistent prefixes
Mobana.trackEvent('step_1_completed');
Mobana.trackEvent('step_2_completed');
Mobana.trackEvent('step_3_completed');
// Include context
Mobana.trackEvent('premium_upsell_accepted');
Mobana.trackEvent('premium_upsell_declined');
Mobana.trackEvent('premium_upsell_dismissed');Recommended Events by Flow Type#
Onboarding Flow#
- • step_1_completed, step_2_completed, step_3_completed
- • preference_selected (if collecting preferences)
- • onboarding_skipped (if they skip)
Permission Flow#
- • notification_prompt_accepted / notification_prompt_skipped
- • notification_granted / notification_denied
- • settings_opened (if they need to go to settings)
Upsell/Upgrade Flow#
- • plan_free_selected, plan_pro_selected, plan_team_selected
- • feature_comparison_viewed
- • upgrade_accepted / upgrade_declined
Survey/Feedback Flow#
- • question_1_answered, question_2_answered, etc.
- • rating_submitted (with rating value in completion data)
- • feedback_submitted
Post-Flow Event Tracking#
Track events after the flow closes using the result's trackEvent function:
// In your app
const result = await Mobana.startFlow('pre-purchase');
if (result.completed) {
// User completed the flow, now watch for purchase...
// Later, when purchase happens:
await result.trackEvent?.('purchase_completed', { amount: 49.99 });
// Or use trackConversion with sessionId for attribution
Mobana.trackConversion('purchase', 49.99, result.sessionId);
}