Respectlytics Respect lytics
Menu
User Flow Analysis Product Analytics Algorithm Technical Deep-Dive

Automated Drop-Off Detection:
The Algorithm Explained

β€’ 10 min read

Automated drop-off detection identifies where users abandon your app by analyzing terminal eventsβ€”the last action before a session ends. Instead of manually checking each funnel step, the algorithm calculates termination rates for every event and surfaces anomalies. An event with 45% termination rate when the baseline is 12% indicates a friction point worth investigating.

Every mobile app has invisible wallsβ€”screens or actions where users give up and leave. Finding these friction points traditionally requires building funnels, waiting for data, and hoping you guessed the right path to analyze.

Automated drop-off detection takes the opposite approach: analyze every event, calculate where sessions tend to end, and surface the anomalies automatically. No funnel configuration. No guesswork.

πŸ“‰ Why Drop-Off Detection Matters

Drop-off points are where potential conversions die. Every user who abandons at a friction point represents:

  • πŸ’Έ Lost revenue β€” Users who almost converted but didn't
  • πŸ“± Wasted acquisition spend β€” You paid to acquire users who churned at a fixable problem
  • ⭐ Negative reviews β€” Frustrated users leave 1-star ratings about "confusing" or "broken" apps
  • πŸ“Š Misleading metrics β€” High install counts mask poor activation and retention

The challenge: you don't know where these walls are until you find them. And traditional analytics makes finding them tedious.

πŸ”§ The Problem with Traditional Approaches

Traditional drop-off analysis requires manual funnel configuration:

The Manual Process

  1. 1 Hypothesize: "I think users drop off at checkout"
  2. 2 Build funnel: Configure steps: Browse β†’ Cart β†’ Checkout β†’ Payment β†’ Purchase
  3. 3 Wait: Collect data for 1-2 weeks
  4. 4 Analyze: See that checkout has 60% drop-off
  5. 5 Miss: Never discover that users also drop off at the permissions prompt, the tutorial, and the settings pageβ€”because you didn't think to check

⚠️ The Core Problem

Manual funnel analysis only finds drop-offs in the paths you think to check. If your biggest friction point is somewhere unexpectedβ€”like the notification permission prompt or the "invite friends" modalβ€”you'll never see it unless you explicitly build a funnel for that flow.

βš™οΈ How the Algorithm Works

Automated drop-off detection inverts the process. Instead of checking specific funnels, it analyzes all events and identifies which ones disproportionately end sessions.

The Core Concept: Terminal Events

A terminal event is the last event in a session before the user leaves. Every session has exactly one terminal event:

# Session A (terminal event: purchase_completed βœ…)
["app_opened", "product_viewed", "add_to_cart", "checkout", "purchase_completed"]

# Session B (terminal event: checkout ❌)
["app_opened", "product_viewed", "add_to_cart", "checkout"]

# Session C (terminal event: permission_prompt ❌)
["app_opened", "onboarding_start", "permission_prompt"]

# Session D (terminal event: home_viewed)
["app_opened", "home_viewed"]

The question we want to answer: Which events are terminal more often than expected?

πŸ“Š Termination Rate Calculation

For each event type, we calculate the termination rateβ€”the percentage of times that event is the last one in a session:

termination_rate = times_event_was_terminal / total_occurrences_of_event

# Example: checkout event
checkout_occurrences = 1,000
checkout_as_terminal = 450
termination_rate = 450 / 1,000 = 45%

A 45% termination rate means: when users reach checkout, 45% of the time that's the last thing they do before leaving.

Baseline Comparison

Raw termination rates aren't enough. Some events should be terminal (like logout or purchase_completed). What matters is how each event compares to the baseline termination rate:

# Calculate baseline: average termination rate across all events
total_sessions = 10,000
total_events = 85,000
baseline_termination_rate = total_sessions / total_events = 11.8%

# Compare each event to baseline
checkout_termination = 45%
deviation_from_baseline = 45% - 11.8% = +33.2% # 🚨 Significant anomaly

🎯 Anomaly Detection: Finding the Outliers

The algorithm flags events as drop-off anomalies when their termination rate significantly exceeds the baseline. Here's a typical output:

Event                      Occurrences  Term.Rate  Baseline  Deviation  Flag
──────────────────────────────────────────────────────────────────────────────
permission_prompt          2,340        52%        12%       +40%       🚨 Critical
checkout_payment           1,450        45%        12%       +33%       🚨 Critical
create_account_prompt      3,200        38%        12%       +26%       ⚠️ Warning
invite_friends_modal       890         35%        12%       +23%       ⚠️ Warning
tutorial_step_3            4,100        28%        12%       +16%       ⚠️ Warning
product_viewed             12,500       14%        12%       +2%        βœ“ Normal
home_viewed                9,800        10%        12%       -2%        βœ“ Normal
purchase_completed         1,200        85%        12%       +73%       βœ“ Expected

πŸ’‘ Key Insight from This Data

The permission_prompt event has a 52% termination rateβ€”over 4x the baseline. This is a massive friction point: half of users who see this prompt leave immediately. This insight would never appear in a checkout funnel because it happens before users even browse products.

Excluding Expected Terminals

Some events should have high termination rates. The algorithm can exclude or flag these:

  • βœ“ Conversion events: purchase_completed, subscription_started
  • βœ“ Intentional exits: logout, delete_account
  • βœ“ Task completion events: goal_achieved, share_completed

⚑ Why Session-Based Analytics Excels Here

Drop-off detection is particularly well-suited to session-based analytics. Here's why:

🎯 Clear Boundaries

Sessions have unambiguous start and end points. You know exactly when a user left, making terminal event identification straightforward.

πŸ”’ No Identity Required

You're analyzing session patterns, not individual users. Each session is an independent data pointβ€”no need for persistent identifiers.

πŸ“Š Immediate Context

Session-based drop-off shows immediate friction. The user saw the permission prompt and left right nowβ€”not "eventually over 30 days."

πŸ”„ Rotation-Friendly

Session IDs that rotate (every 2 hours or on app restart) don't affect drop-off analysis. Each session window is self-contained.

πŸ› οΈ Implementation Guide

Here's how to implement automated drop-off detection:

Step 1: Define Session Boundaries

Determine when a session ends. Common approaches:

  • β€’ App backgrounded: Session ends when app moves to background
  • β€’ Inactivity timeout: Session ends after N minutes of no events (typically 30 minutes)
  • β€’ Session ID rotation: New session ID = new session (used by Respectlytics)

Step 2: The Algorithm

Python Implementation

from collections import Counter, defaultdict

def detect_drop_offs(sessions, expected_terminals=None, min_occurrences=100):
    """
    Detect events with abnormally high termination rates.
    
    Args:
        sessions: List of sessions, each with events list
        expected_terminals: Set of events that should be terminal (optional)
        min_occurrences: Minimum event occurrences for analysis
    
    Returns:
        List of (event, termination_rate, deviation, flag) tuples
    """
    expected_terminals = expected_terminals or set()
    
    # Count total occurrences and terminal occurrences
    total_counts = Counter()
    terminal_counts = Counter()
    
    for session in sessions:
        events = session['events']
        if not events:
            continue
            
        # Count all event occurrences
        for event in events:
            total_counts[event['event_name']] += 1
        
        # Mark the last event as terminal
        terminal_event = events[-1]['event_name']
        terminal_counts[terminal_event] += 1
    
    # Calculate baseline termination rate
    total_sessions = len(sessions)
    total_events = sum(total_counts.values())
    baseline_rate = total_sessions / total_events if total_events else 0
    
    # Analyze each event
    results = []
    for event_name, total in total_counts.items():
        if total < min_occurrences:
            continue  # Skip low-frequency events
            
        terminal = terminal_counts.get(event_name, 0)
        term_rate = terminal / total
        deviation = term_rate - baseline_rate
        
        # Determine flag
        if event_name in expected_terminals:
            flag = "expected"
        elif deviation > 0.25:  # 25% above baseline
            flag = "critical"
        elif deviation > 0.15:  # 15% above baseline
            flag = "warning"
        else:
            flag = "normal"
        
        results.append({
            'event': event_name,
            'occurrences': total,
            'termination_rate': term_rate,
            'baseline': baseline_rate,
            'deviation': deviation,
            'flag': flag
        })
    
    # Sort by deviation (highest first)
    results.sort(key=lambda x: x['deviation'], reverse=True)
    return results

Step 3: Impact Scoring

High termination rate isn't the only factor. An event with 50% termination but only 20 occurrences matters less than one with 30% termination and 5,000 occurrences. Calculate impact:

# Impact = sessions lost due to this drop-off point
impact_score = occurrences Γ— deviation_from_baseline

# Example
permission_prompt: 2,340 Γ— 0.40 = 936 # High impact
rare_settings_page: 150 Γ— 0.45 = 68  # Low impact (few users affected)

πŸ” Interpreting Results

Drop-off detection tells you where users leave, not why. High termination rates warrant investigation:

Permission Prompts (52% termination)

Possible causes:

  • β€’ Asking for permissions too early (before establishing value)
  • β€’ Unclear why the permission is needed
  • β€’ Asking for too many permissions at once

Checkout Payment (45% termination)

Possible causes:

  • β€’ Unexpected fees or shipping costs
  • β€’ Limited payment options
  • β€’ Complex payment form
  • β€’ Trust/security concerns

Tutorial Step 3 (28% termination)

Possible causes:

  • β€’ Tutorial is too long
  • β€’ Step 3 is confusing or requires unexpected action
  • β€’ Users want to skip ahead but can't

⚠️ Correlation, Not Causation

Drop-off detection shows where users leave. The cause might be the event itself, or something before it. A high drop-off at checkout_payment might actually be caused by price shock on the previous screen. Use drop-off data to focus your investigation, not to jump to conclusions.

❓ Frequently Asked Questions

Q: How is this different from funnel drop-off analysis?

Funnel analysis shows drop-off within a predefined sequence. Automated detection analyzes all events regardless of path. You discover friction points in flows you never configuredβ€”like the permission prompt that kills onboarding before users even reach your funnel.

Q: What's a "normal" termination rate?

It depends on your app's event density. If users average 8 events per session, baseline termination rate is ~12.5% (1/8). If they average 20 events, baseline is ~5%. Calculate your specific baseline before flagging anomalies.

Q: Should I track "app_backgrounded" as an event?

Noβ€”that would make app_backgrounded the terminal event for every session, adding noise without insight. Instead, use backgrounding to define session end, and analyze the event before backgrounding.

Q: How do I handle events that appear multiple times in a session?

Count each occurrence. If product_viewed appears 5 times in a session and is terminal once, that's 5 occurrences with 1 terminal. The termination rate reflects how often the event leads to exit per occurrence.

Q: How often should I run drop-off detection?

After every significant releaseβ€”new features, UI changes, or flow modifications. Also run it periodically (weekly or monthly) to catch gradual shifts. A termination rate that slowly creeps up might indicate a degrading experience.

πŸ’‘ Key Takeaways

  • β†’ Automated detection finds friction points you'd never think to checkβ€”no manual funnel configuration required
  • β†’ Termination rate = times event was last Γ· total occurrencesβ€”compare to baseline to find anomalies
  • β†’ Session-based analytics is idealβ€”clear boundaries, no identity required, immediate context
  • β†’ Prioritize by impact, not just termination rateβ€”high-frequency events with moderate drop-off often matter more
  • β†’ Drop-off shows where, not whyβ€”use it to focus investigation, not to jump to conclusions

Technical Note

The algorithms and examples in this post are illustrative. Production implementations may require additional considerations for statistical significance, handling of edge cases, and filtering of system events. Actual drop-off detection in Respectlytics includes confidence intervals, minimum sample thresholds, and trend analysis over time.

Related Reading

Ready to find your app's hidden friction points?

Stop guessing where users drop off. Let automated detection surface the problems.