# Level Funnels: How to Find the Level Where Players Quit

> Find levels worth investigating with reach counts, completion rates and fail reasons. Learn to compare cohorts and game versions, with report screenshots.

- **Published:** October 8, 2026 (updated October 9, 2026)
- **Author:** Vexil LLC
- **About:** [AnyAnalytics: game, app & website analytics](https://vexil.io/apps/anyanalytics.md)
- **Tags:** game-analytics, game-design, retention
- **Web page:** https://vexil.io/blog/level-funnel-analysis

Every game has a level that eats players. Somewhere between the tutorial and the credits there's a jump that's too long, a boss with too much health, or a timer that's three seconds too tight. Players hit it, sigh, close the app, and never come back. They won't email you about it either.

A **level funnel** helps you find where progression drops. Pair it with attempt completion rates and fail reasons to choose a level to investigate. This guide explains the difference between reach counts and an ordered funnel, how to compare the right players, and what to test once a level stands out.

The screenshots are from [AnyAnalytics](https://vexil.io/apps/anyanalytics) with sample data from our demo game, Space Hopper. The method works in any analytics tool.

## What is a level funnel?

An ordered funnel follows the **same cohort** through a sequence of steps within a chosen conversion window: started level 1, then level 2, then level 3. Its bars get shorter as fewer of those players progress.

A per-level reach report is different: it counts players who reached each level in the selected date range. Returning players can start at higher levels without replaying level 1, so those counts need not decline. Use **Insights → Funnels** when you need a defined sequence and conversion window; use the Game report to inspect level reach and attempt results.

The question is never "do players drop off?" They always do. The question is **where the drop-off is bigger than it should be.**

## Step 1: Send three events

These three events power the Game report. Send a start for each attempt and exactly one completion or failure for its result, with the same `level` value:

```ts
analytics.track("level_start", { level: 12 });
analytics.track("level_complete", { level: 12, duration: 92, score: 3400 });
analytics.track("level_fail", { level: 12, duration: 38, reason: "timeout" });
```

Use the same `level` value on the start and end of an attempt, include `duration` in seconds, and give fails a `reason` from a short, fixed list. If you're in Unity, [here's the five-minute setup](https://vexil.io/blog/unity-game-analytics). For the full list of events worth tracking, see [8 events every mobile game should track](https://vexil.io/blog/game-events-to-track).

## Step 2: Read "players reached"

In AnyAnalytics, the **Game → Players reached** view shows per-level reach from your events. Start by checking the date range and which players it includes. The screenshot below is sample data with 1,000 players at level 1 and 749 at level 12:

![The Players reached view of the AnyAnalytics Levels report: 1,000 players reached Level 1, then 993, 982, 963, 943 and down to 749 at Level 12, or 74.9% of the players who started.](https://vexil.io/blog/level-funnel-analysis/players-reached.jpg "Players reached: 1,000 players started level 1 and 749 made it to level 12.")

[Explore the Game demo](https://anyanalytics.org/demo?view=game&utm_source=vexil.io&utm_medium=llms&utm_campaign=level-funnel-analysis&utm_content=report_demo) to try these views with sample data.

This sample has no sudden cliff. That shape is a useful starting signal, but it does not establish a healthy retention rate on its own. Compare new players with enough time to progress, and separate platform and game version. A recent player who has not reached level 12 may still be playing.

Here's what to look for:

| Shape | What it looks like | What it usually means |
| --- | --- | --- |
| **Gentle slope** | A few points lost per level | No obvious single cliff; compare with your own previous cohorts |
| **Cliff** | One level loses 2-3× more than its neighbors | A difficulty spike, a confusing mechanic or a bug |
| **Early cliff** | Big loss at levels 1-3 | Onboarding problem: controls, tutorial or first impression |
| **Plateau, then cliff** | Flat for a while, then a sudden drop | A paywall, an energy system or a content gate kicking in |

## Step 3: Check fail rates per level

Reach counts suggest where to look. The **Start → finish** view adds evidence by showing how each level's attempts end; it cannot establish the cause by itself:

![The Start to finish view of the AnyAnalytics Levels report: starts, completion rate, fail rate and median time for levels 1 to 12, with completion falling from about 75% to 61%, fail rates rising from 23% to 38%, and Level 56 flagged as the hardest at 52.9% fail.](https://vexil.io/blog/level-funnel-analysis/start-to-finish.jpg "Completion and fail rates per level, with the median time to beat each one.")

Three columns do most of the work:

- **Fail rate.** Fails as a share of starts. A smooth climb is a difficulty curve. A sudden jump is a wall.
- **Median time.** If one level takes three times as long as its neighbors, players might be lost rather than challenged.
- **Hardest level.** AnyAnalytics flags the level with the highest fail rate among levels started at least 10 times, so one unlucky attempt can't crown a level. In this sample it's Level 56, which players fail 52.9% of the time.

> **High fail rate + small drop-off** = hard but fair. Players retry and get through. That's often fine, even fun.
>
> **High fail rate + big drop-off** = a wall. Players try, fail, and leave. Fix this one first.

## Step 4: Find out why they fail

Break `level_fail` down by the `reason` property in a trend chart to test a possible explanation:

![A trends chart of level_fail events over 30 days broken down by reason, with daily bars for timeout, died and quit.](https://vexil.io/blog/level-funnel-analysis/fail-reasons.jpg "level_fail by reason. Add a filter for one level to see how that level kills players.")

Add a filter for `level = 12` and you're looking at how *that* level beats people:

- **Mostly `timeout`:** investigate the timer, route length and instructions. Test a longer timer and compare fail rate and progression.
- **Mostly `died`:** inspect enemy damage, trap spacing and checkpoints. Separate failures by attempt number if you track it.
- **Mostly `quit`:** investigate length and clarity. Only explicit quits you instrument are counted; closing or killing the app may leave an attempt without a result.

The **Where players are** view shows the level each player started most recently in the report's scope. A crowd on one level is a reason to investigate, not proof that those players are currently online or permanently stuck.

## Bonus: the funnel before level 1

Levels aren't the only funnel in your game. You can chain any events in **Insights → Funnels**. This one follows players from opening the game to their first purchase:

![An AnyAnalytics funnel with four steps over 30 days: 1,000 players opened the game, 600 started a level, 599 beat a level and 359 bought something, for 35.9% overall conversion. The biggest drop-offs are 40% between opening the game and starting a level, and 40.1% between beating a level and buying.](https://vexil.io/blog/level-funnel-analysis/funnel.jpg "A four-step funnel from opening the game to a first purchase, with the median time between steps.")

In this sample, **40% of the starting players did not reach the level-start step within the selected funnel window.** For them the main menu *is* level zero, and it's the hardest one in the game. Real games see this too: long loading screens, a sign-in wall or a menu with nowhere obvious to tap. Let new players start playing in one tap.

The median time between steps is worth checking as well. If "opened the game → started a level" takes minutes instead of seconds, something is in the way.

## A worked investigation

Suppose a new-player cohort has a larger drop between levels 11 and 12 than neighboring steps. First confirm that all cohorts had the same time to progress. Then:

1. Filter `level_fail` to `level = 11`, since a drop before reaching level 12 may originate in level 11.
2. Break failures down by `reason` and compare platforms and `app_version`.
3. If `timeout` failures rose after one update, inspect the timer and any level changes in that build. Treat it as a hypothesis.
4. Ship one change, such as more time, and compare equally mature new-player cohorts.
5. Look for both fewer timeouts and more players reaching level 12. A lower fail rate alone is not enough.

This is an example investigation, not a measured result from Space Hopper.

## How to fix a problem level

Once you've found the level, change one thing at a time and watch the numbers:

1. **Ship one fix per version.** Every event carries your `app_version`, so you can filter the report to the new build and compare it with the old one.
2. **Make later attempts easier after repeated failures.** Test more time, a checkpoint or a hint, then compare progression as well as fail rates.
3. **Teach before you test.** If a new mechanic appears in the level players fail, add an easier level that introduces it first.
4. **Move the gate.** If a paywall or energy limit lines up with your cliff, players may be leaving because of the gate, not the level.
5. **Re-check in a week.** You want the fail rate down *and* more players reaching the next level, not just one of the two.

## FAQ

### What is a good level completion rate?

There's no universal number, since it depends on genre and on where the level sits. Compare each level with its neighbors instead. A level that's much harder than the ones around it is the problem, whatever the absolute rate.

### What's the difference between drop-off and fail rate?

Fail rate is about *attempts*: how often a level beats the player. Drop-off is about *people*: how many of the starting cohort did not reach the next level within the conversion window. A level can have a high fail rate and almost no drop-off if players happily retry.

### How many players do I need before the numbers mean anything?

The more the better. A rough guide: wait for at least a few dozen attempts per level before reacting. AnyAnalytics only names a "hardest level" once it's been started at least 10 times.

### Can I build a funnel for my tutorial?

Yes. Send `tutorial_step_completed` with a numeric `step` property, then chain that event in Insights → Funnels with a different step filter on each stage. Choose a conversion window that gives new players enough time to finish.

## Find your level zero

Start by verifying three level events, then let enough players attempt your levels. The Game report gives you reach and attempt results; an ordered funnel lets you follow a cohort through the next steps.

[Start free with AnyAnalytics](https://anyanalytics.org/sign-up?utm_source=vexil.io&utm_medium=llms&utm_campaign=level-funnel-analysis&utm_content=article_closing_signup) (no card required), send the level events, and open the Game report to choose your next investigation.
