> ## Documentation Index
> Fetch the complete documentation index at: https://launchdarkly-preview.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Detection to Resolution: Real world debugging with rage clicks and session replay

> Learn how to use session replay and rage click detection to diagnose and fix production issues fast through three real-world case studies.

> For the complete documentation index, see [llms.txt](/llms.txt). For the full documentation snapshot, see [llms-full.txt](/llms-full.txt).

<p class="publishedDate">
  <em>Published February 11, 2026</em>
</p>

<img src="https://files.buildwithfern.com/https://launchdarkly.docs.buildwithfern.com/docs/ee16585472bee25f23f4782816ccbbd25044b846b5a0b2596cf1bfaac2f47664/assets/images/authors/alexis-roberson.png" alt="portrait of Alexis Roberson." class="authorAvatar" />

<p class="authorName">
  by Alexis Roberson
</p>

Part 3 of 3: Rage Click Detection with LaunchDarkly

## Overview

In [Part 1](/tutorials/detecting-user-frustration-session-replay), we set up rage click detection using LaunchDarkly's [Session Replay](/home/observability/session-replay). In [Part 2](/tutorials/connecting-rage-clicks-to-guarded-releases), we connected those frustration signals to [guarded releases](/home/releases/guarded-rollouts) for automated rollback protection.

Now it's time to put it all together. In this final installment, we'll walk through real-world debugging scenarios using our WorkLunch app—a cross-platform application built with React Native and Expo where coworkers can swap lunches.

These scenarios demonstrate how the integrated system of feature flags, session replay, and guarded releases can transform the way you diagnose and fix production issues.

All code for this blog post can be found [here](https://github.com/arober39/worklunch).

## The Debugging Workflow: An Observability Loop

Before diving into scenarios, let's understand the complete workflow we've built:

<Frame caption="The Debugging Workflow using rage click detection, session replay, and guarded releases.">
  ![Flowchart showing detect, alert, investigate, fix, verify cycle](https://files.buildwithfern.com/https://launchdarkly.docs.buildwithfern.com/docs/460ab8cdd81a0901179ddf3b88ae434e6b4599e55cf705196bf50d4e0e3b5410/assets/images/tutorials/detection-to-resolution-rage-clicks/the_observability_loop.png)
</Frame>

This workflow enables you to:

* **Detect** frustration signals automatically as they happen.
* **Alert** when thresholds are breached during rollouts.
* **Investigate** with full session context, not just error logs.
* **Fix** with confidence knowing the exact user experience.
* **Verify** the fix works by monitoring the new rollout.

<Frame caption="Feature Flag Snapshot.">
  ![Feature Flag Snapshot](https://files.buildwithfern.com/https://launchdarkly.docs.buildwithfern.com/docs/a9108d587a41d37836be8727c1136f6e0d5308d70bed49f2948cf710808bf012/assets/images/tutorials/detection-to-resolution-rage-clicks/snapshot_list_feature_flags.png)
</Frame>

When a guarded release detects a spike in rage clicks, it automatically correlates the frustration with specific flag variations:

<Frame caption="Example of join-community-redesign flag variation.">
  ![Example of join-community-redesign flag variation](https://files.buildwithfern.com/https://launchdarkly.docs.buildwithfern.com/docs/7dd1a578a6fb2717dbbbe7cb6ac6aac22e71cc6c2c6a82cab40424dddfa978ac/assets/images/tutorials/detection-to-resolution-rage-clicks/variations_users_rageclicks_rate.png)
</Frame>

The alert tells you exactly which feature caused the problem: "Rage clicks increased 10x for users on `join-community-redesign: true`" It’s important to note that rage clicks aren’t the only measure for frustration signals around user experience.

When items are out of place, confusing or navigation is not consistent across mobile and web, it can cause users to rage scroll. Unlike rage clicks that can be measured and tracked, rage scrolls are a little more nuanced, which will result in relying heavily on session replay and drops and traffic to diagnose.

Just as llm observability tools monitor model outputs for hallucinations or drift, rage click detection monitors the human layer, catching UX failures that no server-side metric would reveal.

Using feature flags, session replay and guarded releases, let’s take a closer look at both scenarios to debug in a real-world worklunch app.

## Scenario 1: Form Validation Frustration

### The Setup

Your team ships a new "Create Community" button redesign and places the feature behind a feature flag called (`inline-form-validation`).

<Frame caption="Feature flag for Inline-Form-Validation breaking change.">
  ![Feature flag for Inline-Form-Validation breaking change](https://files.buildwithfern.com/https://launchdarkly.docs.buildwithfern.com/docs/d6017e0181e4da23005e080931b0de3761a39f0bb8d801db3340b3d2b04305c2/assets/images/tutorials/detection-to-resolution-rage-clicks/scenario1_feature_flag.png)
</Frame>

After the feature flag is toggled on, you notice users on this form are rage clicking the Create Community button. Your metrics show community creation conversions dropped 15 percent since enabling the flag, but there are no errors in the logs.

<Frame caption="How the feature flag status impacts the app UI.">
  ![How the feature flag status impacts the app UI](https://files.buildwithfern.com/https://launchdarkly.docs.buildwithfern.com/docs/2a80b566d74ff95c11f95541f2d4a371e7fdda57717a5c5d99a84258ea6923c2/assets/images/tutorials/detection-to-resolution-rage-clicks/Scenario1_flag_on_flag_off.png)
</Frame>

Thankfully, you connected your feature flag with a Guarded Release and can use it to debug the issue.

### Investigation Steps

Step 1: Search for sessions with rage clicks

Since we attached a Guarded Rollout to your feature flag using a metric for detecting rage clicks, we can navigate to the LaunchDarkly’s Session page and filter for those specific sessions.

In the LaunchDarkly Sessions tab search bar, apply this filter:

```
has_rage_clicks=true featureflag.key=inline-form-validation
```

This query filters for sessions with rage clicks and where the inline-form-validation flag is enabled.

Step 2: Watch for user behavior patterns

<iframe width="620" height="400" src="https://www.youtube.com/embed/ZQBY8rR-2ck" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen />

In the session replay, you see:

1. User fills out the form completely.
2. User clicks Create Community.
3. User sees a loading spinner and nothing else.
4. User clicks button repeatedly.
5. User abandon forms altogether.

Step 3:  Identify the UX failure
The community was being created successfully meaning the API returned a 200 and the new community existed. The new feature was intended to simply change the button color (baby blue → purple), but it **broke the code that allows the success card to be shown**.

### The Root Cause

When the flag is off, the code does the right thing after a successful create:

1. Success → Set `createdSpace` → Show verification card (name, join code, "Back to community list")
2. User taps Back → Return to community list

When the flag is on, the success path was missing:

1. Success → Nothing. The `if (!useInlineValidation)` block runs only for the old flow, so when the flag is on, `setCreatedSpace` is never called.
2. The user stays on the form with no confirmation, no join code, and no way to know the create worked.

```typescript theme={null}
// Only the control (flag OFF) got success UI; the treatment (flag ON) did not
if (!useInlineValidation) {
  setCreatedSpace({ name: space.name, join_code: space.join_code });
}
```

### The Fix

To fix the issue, you can either rollback to previous working code or fix the issue and toggle flag back on.

Option A – Roll back the flag: Set `inline-form-validation` to off in LaunchDarkly. Users are no longer on the new feature; they get the existing, working code path and see the verification card after Create Community.

Option B – Fix the new feature so it no longer breaks the success card: The new feature (flag on) breaks the code that shows the success card. Fix it by adding the success handling to the flag-on path. Also, when the flag is on, also call `setCreatedSpace` after a successful create so the success card is shown again.

### Resolution

With the root cause identified from Session Replay, you update the code and resolve the rollout:

1. Roll back `inline-form-validation` to `false` so users get the verification card and can return to the list (instant, no deployment needed).
2. Fix the flag-on success path so it shows the verification card (or redirects) after create.
3. Deploy and re-enable the flag with the guarded rollout (rage click metrics) still attached, then monitor to confirm rage clicks return to baseline.

Time to resolution: 30 minutes to an hour (compared to potentially days of user complaints and support tickets).

## Scenario 2: The Infinite Scroll Frustration

### The Setup

Your team ships a feature flag (`new-filter-location`) that moves the existing Category and Sort controls on the "Lunches for Swap" feed from the top of the list to the bottom.

<Frame caption="Feature flag for changing the position of the sort and filter options.">
  ![Feature flag for changing the position of the sort and filter options](https://files.buildwithfern.com/https://launchdarkly.docs.buildwithfern.com/docs/6de5fdfcdfa7f646c6b465d905a83edc125b0c0560ef8878101a48513be84c79/assets/images/tutorials/detection-to-resolution-rage-clicks/scenario2_feature_flag.png)
</Frame>

Everything works fine until you notice a drop in traffic.

<Frame caption="How the feature flag status impacts the app UI for the filter options.">
  ![How the feature flag status impacts the app UI for the filter options](https://files.buildwithfern.com/https://launchdarkly.docs.buildwithfern.com/docs/e251cb5712cad7f827631df194593c42d6c0a297344a08b509ffc4f062edb978/assets/images/tutorials/detection-to-resolution-rage-clicks/scenario2_flag_on_flag_off.png)
</Frame>

Since you see no uptick in rage clicks for your Guarded Release, you know it must be another user signal you’re missing that could indicate user frustration. So you decide to investigate further by placing yourself in the user's shoes using session replay.

### Investigation Steps

Step 1: Filter by flag variation

```
feature_flag.key=new-filter-location feature_flag.result.value=true
```

This query will filter for sessions where the feature flag `new-filter-location` is set to true.

Step 2: Watch for user behavior patterns

<iframe width="620" height="400" src="https://www.youtube.com/embed/KdtErT995bE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen />

In session replay, you see:

1. users scroll down the feed, then back up, then down again.
2. Minimal item taps.
3. Constantly moving through the list without making selections.
4. User navigates to a different page.

The pattern suggests they're looking for something rather than browsing items.

Step 3: Identify UX Failure
Replay shows the issue: “Category” and “Sort” are not at the top where users expect them. With the flag on, the controls were moved to below every post in the feed.

### The Root Cause

The feature flag moves the existing filter bar from the top to the bottom of the list (`ListFooterComponent` when the flag is on). Same controls, different position.

```typescript theme={null}
// Flag ON: same filter bar rendered as ListFooterComponent — breaks user expectation
ListFooterComponent={
  useFiltersAtBottom ? (
    <View style={styles.filterBar}>...</View>
  ) : null
}
```

### The Fix

Step 1 – Roll back the flag: Set `new-filter-location` to `false`. Filters return to the top (original position); rage scrolls drop.

Step 2 – Fix the experiment: Don't move the filters to the bottom. Keep the filter bar at the top regardless of the flag, or remove the flag and leave filters in their original place.

```typescript theme={null}
// Fix: always show filter bar at top (original place)
{/* Filters always above the list */}
<View style={styles.filterBar}>
  <TouchableOpacity style={styles.filterButton} onPress={openCategoryFilter}>
    <Text style={styles.filterButtonText}>Category: {categoryLabel}</Text>
  </TouchableOpacity>
  <TouchableOpacity style={styles.filterButton} onPress={openSortMenu}>
    <Text style={styles.filterButtonText}>Sort: {sortOrder === 'newest' ? 'Newest' : 'Oldest'}</Text>
  </TouchableOpacity>
</View>
<FlatList ... ListFooterComponent={null} />
```

### Resolution

1. Roll back `new-filter-location` to `false` so filters are at the top again
2. Fix keep the filter bar at the top.
3. Deploy and re-enable the flag with monitoring.

## Building your debugging playbook

Based on these scenarios, here's a systematic approach to rage click debugging:

Step 1: Triage with Filters

\| What to look for

| Search query |
| - |

\| ----------------------------------------------------- |
\| All frustrated users

\| `has_rage_clicks=true`                                |
\| Specific page issues

\| `has_rage_clicks=true visited-url="*/spaces/create*"` |
\| Browser-specific

\| `has_rage_clicks=true browser_name=Chrome`            |
\| High frustration

\| `has_rage_clicks=true active_length>180s`             |

Step 2: Identify the Pattern
When reviewing session replays, look for:

* Visual feedback gaps (Did the UI acknowledge the click?)
* Loading states (Is there a spinner? Does it ever resolve?)
* Error visibility (If there's an error, can the user see it?)
* Touch target issues (On mobile, are elements too small or overlapping?)
* Timing problems (Does the click happen before the element is ready?)

Step 3: Correlate with Technical Data
Session replay shows you the user's experience. Pair it with:

* Network tab (API response codes and payloads.)
* Console errors (JavaScript exceptions.)
* Feature flag state (Which variation was the user seeing?)
* Timing (When in the session did frustration peak?)

Step 4: Fix and Verify

1. Roll back using your feature flag (instant, no deployment needed).
2. Fix the root cause in code.
3. Re-deploy with the guarded rollout active.
4. Monitor rage click metrics to confirm the fix worked.

Whether you're shipping traditional features or AI-powered experiences, this playbook reflects a devops for ai mindset: continuous monitoring, fast rollback, and data-driven debugging that closes the gap between deployment and user impact.

## Bringing it all together

The combination of rage click detection, session replay, and guarded releases creates something powerful: **observability that starts with the human experience**.

Traditional monitoring asks: "Is the system healthy?"

This approach asks: "Are users successful?"

When you can detect frustration in real-time, watch exactly what users experienced, and roll back problematic features instantly, you fundamentally change how fast you can ship with confidence.

This workflow fits into the broader ai deployment lifecycle, treating user frustration signals as first-class deployment metrics, just like error rates or latency. By embedding rage click detection into your ai lifecycle management strategy, every release becomes a feedback loop that improves both the product and the process.

### Series recap

<Frame caption="The three-part rage click detection series recap.">
  ![Image of the three-part rage click detection series recap.](https://files.buildwithfern.com/https://launchdarkly.docs.buildwithfern.com/docs/4987448d9c7c20028b7af77902a6921bd82c32f5386c404ce97f38d966a6b30c/assets/images/tutorials/detection-to-resolution-rage-clicks/blog_series_recap.png)
</Frame>

The next time your users are frustrated, you'll know exactly what went wrong, which users were affected, and why. And the best part is you'll fix it before most users even notice.

## Additional Resources

* [Session replay documentation](/home/observability/session-replay)
* [Guarded releases documentation](/home/releases/guarded-rollouts)
* [Observability SDK reference](/sdk/observability)
* [Part 1: Detecting user frustration](/tutorials/detecting-user-frustration-session-replay)
* [Part 2: Connecting to guarded releases](/tutorials/connecting-rage-clicks-to-guarded-releases)
