Roblox Pulse
← back to dashboard

Methodology

Roblox Pulse infers engagement signals from public, keyless Roblox endpoints. Both headline metrics are proxies, not ground-truth retention or session length. Treat them as smell tests, not as substitutes for in-game telemetry.

Retention proxy (v2)
retentionProxy =
    (upVotes / (upVotes + downVotes))
  × log10(favoritedCount + 1)
  × log10(playing + 1)
  • Like-ratio rewards games with positive reception. Returns 0 when a game has no votes (e.g. brand-new releases).
  • log10(favourites + 1) measures depth of fandom on a log scale — the difference between 100 and 1,000 favourites matters more than between 10M and 100M.
  • log10(playing + 1) measures current concurrent engagement, also log-scaled so a 600k-player giant doesn’t completely drown out a 5k-player niche darling.

Why v2: the v1 formula divided by visits / 24, which collapsed established games like Brookhaven (82B lifetime visits) to a near-zero score — backwards from the business meaning of retention. v2 drops the visits-as-denominator term entirely and rewards quality × fandom × current activity. Lifetime visits no longer penalise the score; if anything, they correlate with all three terms going up.

Session-length proxy
estimatedSessionMinutes =
    later.playing / ((later.visits - earlier.visits) / intervalMinutes)

Two snapshots of playing and visits taken at different times let us compute visit velocity (visits per minute). Dividing concurrency by that velocity yields an estimated average session in minutes — under the assumption that, in steady state, average concurrent players ≈ session-length × arrival rate (Little’s law).

Buckets: <5m, 5–15m, 15–30m, 30m+.

What this doesn’t measure
  • True retention. D1/D7/D30 retention requires per-user data Roblox doesn’t expose publicly.
  • True session length. The proxy assumes steady state; live events, server outages and time-of-day swings will skew it.
  • Bots and idle servers. playing includes AFK accounts and bots. There is no public way to net these out.
  • Game age. Lifetime visits are heavily biased towards older games; the visit-velocity normalisation in the retention proxy partially — but not fully — corrects for this.
  • Discovery sampling bias. Seeds come from the explore-api sorts (Top Trending, Top Playing Now, etc.), so the dataset over-represents currently-popular games.
Sources & refresh cadence

Discovery seed: apis.roblox.com/explore-api/v1/get-sorts — ~230 unique universes per call across five sort rails.

Game enrichment: games.roblox.com/v1/games?universeIds=… (50 IDs per batch).

Votes: games.roblox.com/v1/games/votes?universeIds=… (50 IDs per batch).

Run pnpm refresh-data to regenerate the snapshot. Each refresh appends a (ts, playing, visits) sample per game; the cohort proxy uses the most recent two samples.