How CO2Stats measures a page

The checker and the badge are coming in a later release. This page was written before either was built, so that they are built to it, and you can read the method before any result.

What a check measures

A check loads one page, once, in a real browser on a stated date, under a fixed test profile (profile m1): a desktop window of 1366 by 768 pixels, an empty cache, no cookies and no consent banners clicked. The browser scrolls slowly to the bottom of the page so that lazy-loaded content appears, then keeps watching until no new request has started and nothing has arrived for 2 seconds, or for at most 30 seconds from the start.

Transfer size is what the browser reports receiving for every request in that window: each response's headers as the browser received them, plus its body as the server sent it (compressed, when the server compressed it), including requests to other websites. Each step of a redirect counts as a request, with the bytes of its own response. A request that failed counts what arrived before it failed; one the checker refused counts nothing. Anything the page takes from its own memory cache, or builds itself (data: and blob: addresses), counts nothing. A page's own document reports its size only when it has finished arriving, so a page that never finishes cannot be measured, and its result says so.

The browser does not open WebSockets, video-call connections or WebTransport, does not run web workers or service workers, opens no other windows and saves no downloads. A page that relies on these is measured without them, and what they would have loaded is not counted.

A result is complete when the page loaded, everything it requested had finished and the window closed normally. It is incomplete when the window ran out of time, a request was still unfinished when it closed (a page that keeps a connection open never finishes), a limit below was reached, the page showed a challenge, the page returned an error, the checker refused one of its requests, or at least 10 requests failed and they were 20% or more of all requests. When the browser is unavailable, the checker says it is busy and asks you to try again later, rather than guessing.

What the checker will not reach

The checker loads pages that strangers choose, from inside Cloudflare's network, so it refuses to reach private addresses. Before any request leaves the browser, it checks the address: only http and https on their usual ports, no address written as numbers, and a name that resolves, at that moment, only to public addresses. A page that tries to reach a private address gets an incomplete result.

These checks have limits, and we would rather say so. The address the browser finally connects to is looked up again by Cloudflare's systems, so a name that changes its answer in between could get past our check. A page can also ask the browser to open a connection ahead of time (a preconnect), which no check of ours sees, though no request is sent on it. In both cases only Cloudflare's own network stands in the way, and Cloudflare does not document that it refuses private addresses. Before every check, the checker tests that Cloudflare's browser still refuses them, and it stops checking pages if that ever fails.

Limits

  • A check stops at 300 requests, or once the transfer it has counted passes 25 MB, and follows redirects 5 hops. A response already arriving when the check stops is counted whole, so a stopped check can show more than 25 MB. Reaching a limit ends the check as incomplete.
  • The same page is measured afresh at most once every 24 hours; within that time the stored result is shown.
  • There is a daily budget for checks. When it is spent, new checks get a "busy, try again later" answer.

The carbon estimate

Grams of CO2e per visit come from @tgwf/co2 version 0.19.0, using the Sustainable Web Design Model v4 and its perVisit estimate with the model's default assumptions about first and return visits (carbon model c1). The model works from the transfer size. If the page's own host is verified by the Green Web Foundation, the whole page is treated as green-hosted; hosts of resources from other websites are not adjusted separately, which is a simplification. The grid carbon intensity of the country a server appears to be in is shown for context only; it does not change the grams.

The grade

The grade comes from the Sustainable Web Design digital carbon rating table, applied to the unrounded grams. Each limit includes its own value. Grams are shown to two decimal places, so a page just above a limit can show the limit's value and still get the lower grade.

Grade by estimated grams of CO2e per visit
GradeGrams per visit
A+up to and including 0.040
Aup to and including 0.079
Bup to and including 0.145
Cup to and including 0.209
Dup to and including 0.278
Eup to and including 0.359
Fmore than 0.359

Hosting facts

A result keeps three facts apart and never merges them: the provider that delivered the page, where known; the country the serving address appears to be in, which may be a content delivery network's location rather than the origin, and is shown as unknown when it cannot be told; and, where a delivery network hides the origin, that the origin is unknown.

"Verified green" means only that the Green Web Foundation listed the host as verified on the date we checked, which is shown beside it with a link to the Foundation's explanation. The date we checked is not the date of the host's verification. From October 2026 the Foundation no longer accepts carbon offsets as evidence, but hosts verified earlier are reassessed under the new criteria only at their next reverification.

CO2Stats Verified

CO2Stats Verified describes one page, not a whole website. A certificate is issued only after a complete measurement shows that the page's host is verified green and the page earns grade A+, A, B. An incomplete measurement can never issue or renew one.

Each certificate expires 45 days after the assessment it rests on. Pages with a certificate are re-checked monthly. A failed re-check ends the certificate at once; a re-check that cannot complete leaves it valid only until it expires, marked as not re-checked. A lapsed certificate says so, and its badge changes to show it. The badge states the page, its grade, its grams and the date of the assessment, and its image is never cached for longer than the certificate has left, or than 24 hours.

Versions

This page describes measurement profile m1 and carbon model c1. Every result records the versions it was produced with.

The rest of the site

  • The green hosting guide: each host's Green Web Foundation listing, the grid where its data centres are and its own evidence, every piece quoted, linked and dated. Hosts are listed alphabetically, never by payment.
  • The Kettle Question: each claim in the ledger records what was counted, by whom and how, in the source's own words; the calculator uses only factors an editor has approved from it.
  • The CO2 pages: NOAA's Mauna Loa records, the ice-core composite NOAA publishes, and Our World in Data for countries, each chart with its source, licence and data table.
  • The editorial policy: how sources are chosen and checked, and how mistakes are corrected.
Back to top