Rando.gg

Dwell time finds broken games that HTTP checks call healthy

Do not use median dwell time to detect broken games. Use the 90th percentile: a working game has a long tail because some players stay, and a broken one has no long sessions at all.

A link checker asks whether a URL answers. That question misses every failure where the server responds correctly and the player still gets nothing: a blank canvas, a bot challenge that never clears, a page that renders an error in its own words.

The only reliable witness is somebody trying to play. We already recorded how long each game was open, so we tried to use it.

The first attempt was wrong

The obvious rule is that a broken game gets abandoned quickly, so flag games with a low median session. We set the threshold at five seconds and it flagged 39 of 105 games, including several we knew were fine.

The reason is specific to this kind of site: the median session across the whole catalogue is about six seconds, because pressing shuffle repeatedly is what the product is for. A player sampling ten games in a minute is not encountering ten broken games.

6.5 secondsmedian session length for the median game — normal, not broken

The distribution has the answer in its tail

Measured per game, the 90th percentile of session length was far more discriminating than the median:

  • Across games, p90 sits at roughly 14 seconds at the 5th percentile, 51 seconds at the 25th, and 101 seconds at the median.
  • A working game therefore has a long tail. Most people bounce; some people stay for minutes.
  • A broken game has no tail at all. Nobody stays, because there is nothing to stay for.

The rule we settled on is p90 at or below fifteen seconds over at least eight sessions. It is not a claim that the game is broken. It is a claim that it is worth looking at.

What it found

On the first run it surfaced games whose HTTP status was fine. Loading each in a real browser settled them:

  • A game whose host showed a bot-protection interstitial that never resolved, even after 35 seconds.
  • A game returning 200 with a completely blank page and three network requests.
  • A host that accepted the connection and then timed out.
  • A URL returning 410 with the body text blocked domain.
  • A page that displayed an ordinary 404, behind a bot challenge that had to be waited out first.

That last one is the one that justifies the whole exercise. Its status code was 403, which our policy correctly classes as a bot filter and refuses to auto-retire, because real visitors clear those routinely. The policy was right. What was missing was anything that ever went and looked.

Suspect means a human should check. It does not mean assume it is fine.

Two things to get right

First, this is a review queue, not an action. Dwell is noisy, and a genuinely dull game also gets abandoned quickly. Retirement should still be a decision made after loading the thing.

Second, calibrate against your own distribution before shipping a threshold. Ours flagged 37 percent of the catalogue on the first guess. The number that looked reasonable in the abstract was useless in context.

Common questions

Why not just use the median session length?
Because on a site built around sampling games quickly, short sessions are normal behaviour rather than evidence of failure. A median-based rule flagged 39 of 105 games, including the most popular ones.
What threshold should I use for p90?
Measure your own distribution first. Ours put p90 at roughly 101 seconds for the median game, so a threshold of 15 seconds isolates the bottom few percent. Copying that number without checking your own data will either flag everything or nothing.
Can dwell time alone justify removing a game?
No. It is a signal that something deserves a look. A boring game and a broken game both get abandoned, and only loading it in a real browser tells you which one you have.
How many sessions do you need before the signal is meaningful?
We require at least eight. Below that the percentile is dominated by individual sessions and the false positive rate becomes unusable.

Not feeling this one?

Play something randomOne tap, a game you haven’t played.

More notes