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 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:
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. For the full list of events worth tracking, see 8 events every mobile game should 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:
Explore the Game 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:
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:
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:
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:
- Filter
level_failtolevel = 11, since a drop before reaching level 12 may originate in level 11. - Break failures down by
reasonand compare platforms andapp_version. - If
timeoutfailures rose after one update, inspect the timer and any level changes in that build. Treat it as a hypothesis. - Ship one change, such as more time, and compare equally mature new-player cohorts.
- 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:
- 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. - Make later attempts easier after repeated failures. Test more time, a checkpoint or a hint, then compare progression as well as fail rates.
- Teach before you test. If a new mechanic appears in the level players fail, add an easier level that introduces it first.
- 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.
- 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 (no card required), send the level events, and open the Game report to choose your next investigation.



