# Updates (/docs/updates)

**Updates** answers the question you have after every publish: did it help? Each version of your place gets a card with how players did on it, next to the version before it. It's on the page within minutes of the first server starting on the new version.

There's nothing to set up. The [RoChart module](/docs/getting-started/install) reads `game.PlaceVersion` on every server and sends it as `$place_version` on heartbeats and on `$session_start`, so every publish shows up by itself.

## The page [#the-page]

- **Latest update**: the newest version, when it was first seen, and three headline changes against the version before it.
- **Rollout right now**: the share of players on the newest version, and how many servers and players are still on older ones. Roblox keeps old servers running on the version they started with until they empty out, so right after a publish most players are still on the old version. If the new one looks good, restart the old servers from the Creator Dashboard to move everyone over.
- **Timeline**: every version first seen in the date range (7, 30 or 90 days), newest first. Each card shows when it went out, how long it was the newest version, whether servers still run it, and six numbers with ▲▼ changes against the version before it. Green is better, red is worse; for errors and crashes lower is better.

Each card links to [Game analytics](/docs/game-analytics) split by place version, and to [Health](/docs/health) filtered to that version.

## How each number is counted [#how-each-number-is-counted]

| Metric | How it's counted |
| --- | --- |
| **First seen** | The earliest heartbeat or `$session_start` carrying that `$place_version`. |
| **Live** | At least one server on the version sent a heartbeat in the last 2 minutes and hasn't shut down. |
| **Players, sessions, new players** | Sessions that **started** on the version (the `$place_version` of their `$session_start`), over the version's whole life up to now. A new player is one whose first session ever was on it. |
| **Playtime / player** | Minutes played in those sessions ÷ players. |
| **Avg session** | Average length of those sessions. Open sessions count up to now. |
| **D1 retention** | Of the players whose first session ever was on this version, the share who played again the next day. Empty ("too early") until a full day has passed. |
| **Errors / 1k sessions** | `$error` occurrences (summing `$count`) from servers and clients on the version, per 1,000 sessions. |
| **Crash rate** | Servers on the version whose heartbeats stopped for more than 3 minutes without a `$server_shutdown`, ÷ all its servers. |
| **Robux / player** | `$robux` from `$purchase` events in those sessions ÷ players. |

Relative numbers are compared in percent; rates (D1, crash rate) in percentage points (**pt**).

<Callout type="info" title="Compare like with like">
  A version that has been out for three days has had more time to collect players than one published an hour ago. Per-player and per-session numbers are fair to compare right away; totals aren't. D1 needs a full day.
</Callout>

## Release markers [#release-markers]

The first time RoChart sees a higher `$place_version` from your game, it writes a project [annotation](/docs/reference/rest-api) **"Update v418 published"**, dated when that version was first seen. Release markers (thin `v418` lines) appear on every Game analytics chart and on the Health charts, so you can see what an update did to your numbers at a glance.

## For agents [#for-agents]

The page runs the `game_updates` query, for example:

```json
{ "kind": "game_updates", "dateRange": { "from": "-30d" } }
```

It returns every version first seen in the range, newest first, with the numbers above. Ask an agent *"Did v418 hurt session length or crash more than v417?"* or *"How many players are still on old servers?"* (that one uses `game_servers`).
