Game analytics
Players, playtime, concurrent players, join sources, retention, Robux revenue, economy and funnels for your Roblox game — live, including today so far — and exactly how each number is counted.
Game analytics is the page you open after every update: how many people are playing, how long they stay, where they came from, whether they come back and what they spend. It works as soon as the RoChart module runs in your game. There's nothing to set up.
Today so far
Roblox's Creator Dashboard shows a day once it's processed, usually a day or two later. RoChart counts events as your servers send them, so today is on the page while it's happening: players who joined this morning, playtime up to now, Robux spent since midnight.
- "Today" runs from midnight in your project timezone until now.
- Today is compared with yesterday up to the same time, not with all of yesterday, so a half-finished day never looks like a drop. In charts it's drawn hatched.
- Events arrive within seconds of a server sending its batch. Open sessions count up to now (see Session).
The page
- Live strip, always at the top: players in game now, running servers, concurrent players over the last hour, and today so far against yesterday at the same time.
- Engagement: active players (new vs returning), playtime per player, session time, sessions, monthly active players and peak concurrent players.
- Acquisition: new players by join source, campaign, country, platform and locale, and how good each source is: D1/D7 retention, playtime and revenue per new player.
- Retention: D1, D7 and D30 retention per day of first play, stickiness, and the cohort table.
- Monetization: Robux revenue, purchases, paying players, payer conversion, ARPDAU (revenue per daily active player), ARPPU (revenue per paying player) and top developer products and game passes.
- Economy: your in-game currencies: gained vs spent, net flow, median balance, per-player averages, transaction types and top items. See Economy.
- Funnels: onboarding, progression and shop funnels, step by step, with drop-off and time between steps. See Funnels.
Every tab follows the date range at the top right. Filter or break down by platform, country, locale, join source, campaign, new vs returning, Premium or server type, each taken from the session's $session_start.
Definitions
| Metric | How it's counted |
|---|---|
| Session | One $session_start to its $session_end. A session with no end yet is still open: it ends at the earlier of now and its server's last heartbeat + 60 seconds, so a crashed server doesn't play forever. Sessions are capped at 12 hours. |
| Playtime | Session time that overlaps the bucket. A session from 23:30 to 00:30 adds 30 minutes to each day. |
| Active player (DAU) | A player with a session overlapping the day. WAU and MAU are the same over 7 and 30 days. |
| New player | A player whose first $session_start ever seen is on that day. |
| Concurrent players (CCU) | Per 5-minute bucket, the sum over servers of the highest $players each reported. Now is the latest heartbeat of every server seen in the last 2 minutes. |
| D1 / D7 / D30 retention | Of the new players on day c, the share who played on day c + 1, c + 7 or c + 30. |
| Stickiness | DAU ÷ MAU, where MAU is unique players over the trailing 30 days. |
| Revenue | Sum of $robux on $purchase events. |
RoChart starts counting when you install it
RoChart only knows players from the day the module first ran. In the first weeks, players who had played before show up as "new", and D30 retention needs 30 days of data before it has a value.
Join sources
Each session gets one join source, from player:GetJoinData() and player.FollowUserId. The first matching rule wins:
| Source | When |
|---|---|
| link | The join carried launch data: share links, deep links, invites with data |
| referral | Another player referred them (ReferredByPlayerId) |
| friend | They followed a friend into the game |
| teleport | They came from another place |
| discovery | None of the above |
Discovery covers the home page, search, charts and sponsored ads together. Roblox doesn't tell the game which of these it was, so RoChart can't split them.
Campaigns
To compare your own channels, put a campaign in the launch data of the links you share:
https://www.roblox.com/games/start?placeId=123456&launchData=campaign%3DtiktokIf the launch data is JSON or a query string with campaign, utm_campaign, rc or source, its value becomes the session's $campaign, here tiktok. A player's first campaign is also kept on their profile as first_campaign.
Revenue
Revenue is the Robux players spent in your game, as reported by the purchase: developer products through processReceipt and game passes bought in-game. It's what players paid, before Roblox's share, and it doesn't include passes bought outside the game, such as on its page on the Roblox website. So it won't match your payouts exactly. Use it to see what changed, and when.
Economy
Log every time a player gains or spends an in-game currency, from a server script. The fields are the same as Roblox's AnalyticsService:LogEconomyEvent:
RoChart.economy(player, {
flow = "source", -- "source" (gained) or "sink" (spent)
currency = "Gold",
amount = 50,
balance = 1200, -- optional: the balance after this
transactionType = "Gameplay", -- IAP, Shop, Gameplay, ContextualPurchase, TimedReward, Onboarding or your own
itemSku = "match_reward", -- optional
})The Economy tab shows one currency at a time (switch at the top when you have several):
| Number | How it's counted |
|---|---|
| Gained / spent | Sum of amount on sources / sinks in the period. |
| Net flow | Gained − spent. Positive for a long time means currency piles up. |
| Median balance | Each player's last reported balance in the period, then the median over players. Only events that send a balance count. |
| Per player | Gained or spent ÷ players with at least one economy event for that currency. |
Below are sources vs sinks per day (or hour), net flow, the split by transaction type, and the top items by itemSku. The cards compare with the previous period up to the same point in time.
Funnels
Log each step of a funnel with its number, starting at 1:
RoChart.funnelStep(player, "onboarding", 1, "Joined")
RoChart.funnelStep(player, "onboarding", 2, "Picked country")A player counts at step N if they reached it after step N − 1, within the selected period. The steps are the step numbers seen in the period, in order. For each step the Funnels tab shows players, conversion from the start and from the previous step, players lost, and the median time from the previous step.
For funnels a player can go through many times, such as a shop visit, pass a fifth argument, a funnel session id (one per pass). Each pass then counts on its own, so the funnel counts funnel sessions instead of players:
local visit = HttpService:GenerateGUID(false)
RoChart.funnelStep(player, "shop", 1, "Opened shop", visit)
RoChart.funnelStep(player, "shop", 2, "Bought item", visit)The page's filters apply to both tabs: an economy event or funnel step counts when the session it happened in matches.
Where the numbers come from
Everything on this page is computed from a handful of events the module sends from your servers: $session_start, $session_end, $server_heartbeat, $server_shutdown, $purchase, and $economy / $funnel_step when you log them. Platform comes from a small client script, country from LocalizationService, locale from player.LocaleId. Roblox doesn't share age or gender with games, so there's no breakdown by them.
The same events are available everywhere else in RoChart. Use insights for anything this page doesn't show, such as a funnel from $session_start to your own tutorial_completed, or retention of players who bought something. Agents read game analytics with the game_* queries, for example "How did D1 retention change after Friday's update, on phones vs computers?".
Account security
Your profile, password, passkeys, two-factor authentication and active sessions.
Updates
Every update you publish, found automatically from game.PlaceVersion and compared with the one before it — playtime, session length, D1, errors, crash rate and Robux per player — plus how many players are still on old servers.