# Site updates

> Mark what changed on your site and when, by hand, from a deploy script or from a coding assistant, and see what visitors, conversion and revenue did next.

A site update is a note of what changed on your website and when it went live: a new pricing page, shorter copy, a checkout fix. odo marks it on the Overview, Traffic and Revenue charts, then compares the days after it with as many days just before: visitors, conversion, and revenue traced to visits.

## What odo works out

Once a whole day has passed, each update shows the whole days after it against as many just before, up to a week each side, so every weekday is in both. Conversion is visitors who paid ÷ visitors, and odo says whether a change in it is beyond chance (p below 0.05, with at least 10 sales between the two sides and 50 visitors each). Other updates that went live in the same days are named too, since their effects can’t be told apart.

It isn’t proof of what caused a change: a campaign or a season moves numbers as well. For proof, run an [experiment](https://odo.gg/docs/experiments). A change that moved conversion beyond chance shows among the dashboard’s **Next moves**.

## Add one by hand

On the Traffic dashboard, **Site updates → Add**: what changed in a few words, and optionally the details, the page, the kind (`deploy`, `design`, `copy`, `pricing` or `other`), the website and when it went live (now, unless you say). Owners and managers add, change and remove them there.

## From a deploy script

A [project key](https://odo.gg/docs/api) with the **Updates** permission notes one with `POST /api/v1/updates`:

```sh
curl -X POST https://odo.gg/api/v1/updates -H "Authorization: Bearer $ODO_KEY" -H "Content-Type: application/json" -d '{"title":"New pricing page","path":"/pricing","kind":"pricing"}'
```

`title` is required (up to 120 characters). The rest is optional: `details` (plain text, up to 1,000), `path` (`/pricing` or a full address), `kind`, `at` (ISO 8601 with its zone, or epoch milliseconds; now by default) and `site` (an id, a domain or an address on it). The answer is the update, with `via: "key"` and the key’s name as `by`. A project keeps 2,000 updates and takes 100 a day. Details in the [REST API](https://odo.gg/docs/api#site-updates).

## From a coding assistant

An assistant connected over MCP that changes your site can note each change it ships with the `record_site_update` tool, so it lands on your charts with what it did. It can do that only if you left **Note site changes** on when you approved it (a key needs the Updates permission). That’s the one thing an assistant can write in odo.

Tell it when to, in the project’s `CLAUDE.md` (or `AGENTS.md`):

```md
After you deploy or publish a change to the website that visitors will see (a new page, copy, design, pricing, a checkout fix), call odo’s record_site_update tool once with a few plain words of what changed and the page’s path, so odo marks it on its charts and shows what it did to visitors, conversion and revenue.
```

It reads them back, with what each did, through `list_site_updates`. More in [AI assistants](https://odo.gg/docs/mcp).

## What gets noted

One update per change a visitor would notice: a new or redesigned page, new copy, a pricing change, a checkout or signup fix, a feature they see. Not refactors, tests or anything visitors never see. A deploy with several small fixes is one update. Titles and details are shown as plain text: Markdown comes off.
