Flow Events Tracking

Track the right flow events to gain actionable insights without noise.

Overview#

Event tracking in flows serves two purposes:

  1. Funnel analysis: Understand where users drop off in multi-step flows
  2. 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:

EventWhenInsight
__started__Flow is shownHow many users see the flow
__completed__complete() is calledHow many users finish successfully
__dismissed__dismiss() is calledHow many users exit early

With just these three events, you get a basic conversion rate: __completed__ / __started__

Do not trigger manually

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 descriptive

The Golden Rule#

Ask yourself:

"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.js
// 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:

__started__step_1_completedstep_2_completedstep_3_completed__completed__

Decision Point Tracking#

Track user choices to understand preferences:

flow.js
// 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');

Post-Flow Event Tracking#

Track events after the flow closes using the result's trackEvent function:

app.tsx
// 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);
}