How to find where players quit a Roblox experience
The Glitchless team · November 6, 2026 · Roblox experiences, with Luau for server Scripts
New players decide quickly whether a Roblox experience is worth staying in, and the Creator Hub's retention numbers tell you how many came back, not where the rest stopped. To find where, mark the steps of a first session (spawned, finished the tutorial, started the first round, won it) and count how many players reach each one. AnalyticsService does that on Roblox's side, and the Creator Hub draws the funnel.
A funnel shows the step where players stop. It doesn't say why. So the second half of this guide puts what happened in those sessions next to the step: did the game lag there, did the server's heartbeat drop, did a script error? That's the part a coding agent can act on.
The short answer
- Onboarding funnel: call
AnalyticsService:LogOnboardingFunnelStepEvent(player, step, stepName)from a server Script as a new player reaches each step of their first session. It counts once per player. - Recurring funnels: for flows players go through many times (the shop, a stage, a race),
LogFunnelStepEventwith a funnel name and an ID for each attempt. An experience can chart up to ten funnels. - Stages: Roblox's progression events don't show in any Roblox chart yet, so to see which stage loses players on the Creator Hub, give the stage a funnel of its own.
- Read it: the Funnel page of the experience's analytics on the Creator Hub, about a day later. Events only count from published games, never from Studio.
- Why they left: the step tells you where. Look at the same sessions' frame rate, server heartbeat and errors to find what went wrong there, then change one thing and compare the next version.
Write down the steps of a first session
Before any code, list what a player should do in their first five minutes, in order, as things that happen in the game rather than screens. For a racing game that might be:
- Joined
- Picked a car
- Started the first race
- Finished the first race
- Started a second race
Keep it to five to eight steps, each one something every new player should reach. The biggest drop between two steps is where to look first.
Log the onboarding funnel
Call LogOnboardingFunnelStepEvent from a server Script when a player reaches each step, with the step's number (from 1) and a name. It's a one-time funnel: each player counts once, a repeated step only counts the first time, and logging step 3 counts steps 1 and 2 as done. To start the funnel as soon as a player joins, log step 1 on PlayerAdded.
ServerScriptService/Onboarding.server.luau
local AnalyticsService = game:GetService("AnalyticsService")
local Players = game:GetService("Players")
local STEPS = { "Joined", "Picked a car", "Started first race", "Finished first race", "Started second race" }
local function reached(player, step)
AnalyticsService:LogOnboardingFunnelStepEvent(player, step, STEPS[step])
end
Players.PlayerAdded:Connect(function(player)
reached(player, 1)
end)
-- Then, wherever your game decides it:
-- reached(player, 2) when they pick a car, reached(player, 3) when their first race starts, and so on.
Call it from the server, where your game already decides what happened. Roblox only takes these events from servers, and only in published games: a play test in Studio sends nothing, so publish to a test place to try it.
Recurring funnels: the shop, a round
Some flows happen many times a session: opening the shop, choosing an item, buying it. LogFunnelStepEvent takes a funnel name and an ID for each attempt, so two trips through the shop count separately. Roblox suggests a GUID as that ID, and keeps the 10 most recent IDs per player for each funnel.
A shop funnel
local AnalyticsService = game:GetService("AnalyticsService")
local HttpService = game:GetService("HttpService")
local visits = {} -- player -> this shop visit's ID
local function shopOpened(player)
visits[player] = HttpService:GenerateGUID(false)
AnalyticsService:LogFunnelStepEvent(player, "Shop", visits[player], 1, "Opened shop")
end
local function itemViewed(player)
AnalyticsService:LogFunnelStepEvent(player, "Shop", visits[player], 2, "Viewed item")
end
local function itemBought(player)
AnalyticsService:LogFunnelStepEvent(player, "Shop", visits[player], 3, "Bought item")
end
Which stage loses players
AnalyticsService has progression events for this (LogProgressionStartEvent, LogProgressionCompleteEvent, LogProgressionFailEvent), but Roblox's reference says they don't show in any Roblox-provided chart yet. Until they do, give the stage you're worried about a funnel of its own: started, reached the halfway point, finished, with an ID for each attempt. The funnel page then shows how many attempts got how far.
A stage as a funnel
local AnalyticsService = game:GetService("AnalyticsService")
local HttpService = game:GetService("HttpService")
local attempts = {} -- player -> this attempt's ID
local function stageStarted(player)
attempts[player] = HttpService:GenerateGUID(false)
AnalyticsService:LogFunnelStepEvent(player, "Desert loop", attempts[player], 1, "Started")
end
local function reachedHalfway(player)
AnalyticsService:LogFunnelStepEvent(player, "Desert loop", attempts[player], 2, "Halfway")
end
local function stageFinished(player)
AnalyticsService:LogFunnelStepEvent(player, "Desert loop", attempts[player], 3, "Finished")
end
With ten funnels per experience, save them for the stages that matter: the first one, and any that players complain about. A player who leaves in the middle of a stage simply stops at their last step, which is often the most telling number.
Read it on the Creator Hub
The funnels are on the Funnel page of the experience's analytics on the Creator Hub. Events are added up daily, so charts can take up to 24 hours to show; the View Events tool lists the most recent events in near real time, to check they arrive. Filters such as device apply to the first step, so a funnel is counted on the device a player started it on.
Read it as players: of 1,000 new players, how many reached each step? The step with the biggest fall is where to look first, and comparing it before and after an update tells you whether a change helped.
Why players left at that step
Say the funnel shows 40% of new players never finish the first race. It can't say whether the race was too hard, the track loaded slowly on phones, the server lagged when it filled, or a script errored at the starting line. For that you need what happened in the sessions that stopped there, next to the ones that carried on:
- Frame rate on their devices during that step, by device kind. A phone at 20 fps on the starting grid is a reason to leave.
- The server's heartbeat while the step ran, by how many players were in it.
- Errors that happened at that step, and whether the sessions that hit one left soon after.
- How long they waited to load before the first step, and whether the slow joiners left first.
- Deaths and fails at that step: where players die over and over is where they give up.
Then change one thing, publish, and compare the new version's funnel and its lag and errors with the old one's. If the drop didn't move, the change wasn't the cause.
The funnel and the reason, in one place
The Glitchless module for Roblox keeps the funnel and the evidence together. Your game marks levels (a race, a round, a stage) as they start, finish, fail or get left halfway, and every session also carries its frame times, stutters with their causes, its server's heartbeat, errors and loading time. So the step where players quit comes with what went wrong there, in players: how many reached it, how many left, and how many of those had lagged or hit an error first.
Your coding agent reads it over MCP. glitchless_player_funnel lists levels with starts, completions, fails and quits, and with hotspots shows where players die on one. glitchless_triage ranks problems by how many players they hit, and glitchless_compare_versions checks the next version with real players.
Ask your coding agent
Use Glitchless to find where new players quit my Roblox experience. Read the level funnel with glitchless_player_funnel and find the level that loses the most players. For that level, check whether those sessions lagged (glitchless_performance by device, glitchless_servers for the server's heartbeat) or hit errors (glitchless_triage) before they left. Tell me the likeliest reason, fix it, and after I publish, compare the new version with glitchless_compare_versions.
Frequently asked questions
Can I send AnalyticsService events from a LocalScript or from Studio?
No. Roblox only takes them from servers, in published games. Call them from a server Script where your game decides a step happened, and publish to a test place to check they arrive.
What's the difference between an onboarding funnel and a recurring funnel?
An onboarding funnel follows a player's first session and counts each player once. A recurring funnel, LogFunnelStepEvent, is for flows a player can go through many times, like the shop, so each attempt gets its own ID.
Do progression events show on the Creator Hub?
Not yet: Roblox's reference says progression events don't display in any Roblox-provided chart. Use a recurring funnel for the stages you need to see.
Can I see why players left at a step?
Not from the funnel alone. Put the same sessions' frame rate, server heartbeat, errors and loading time next to it: if the players who left had lagged or hit an error first, that's your lead.
Sources
- Roblox: AnalyticsService (engine reference)
- Roblox: Funnel events
- Roblox: Event types and limits
- Roblox: Custom events
Something wrong or out of date? Email support@glitchless.gg and we'll fix it. Glitchless isn't affiliated with Roblox Corporation; product names are their owners' trademarks.