Read the Game

Read the Game

How we measure

Every number on this site comes out of the league’s own record of what happened in a game — who shot, from where, who was on the ice. Nothing here is a projection or an estimate.

This page takes each number in turn and shows you what we counted, what we divided it by, how much of a season it takes before it tells you anything, and what could be wrong with it.

Seven questions people fairly ask about how we do this — four of which we think are right — are answered at the foot of the page: Fair questions about all this. Figures below that depend on one of them link straight to it.

What the replay counts

Six switches, and the rule behind each one

A game page carries six layers you can turn on. Each one counts something different out of the same night, and each states its own rule beside the count while you watch. They are collected here so the rules can be read in one place — and each says which of the figures above it belongs to.

Control (Corsi)

Counts every shot attempt the league recorded: on goal, missed, or blocked, because all three are the team moving the puck at the net.

A blocked attempt is credited to the team that shot it — the shot was still taken, it just never arrived.

Counted across every game we have measured, up to 5 October 2026: Where a shot attempt ends

Shots from the slot

Counts attempts from within 33 ft of the net and 22 ft either side of the middle.

Credited to the team that shot. Blocked attempts are excluded because the coordinate the feed records is where the puck stopped — so we know who shot it, but not from where.

Counted across every game we have measured, up to 5 October 2026: How many shot attempts are taken from the slot

Blocked shots

Counts the attempts a body stopped before they reached the goalie.

Each block is credited to the team that made it, the way a broadcast does. A block by a teammate is credited to neither, so the two figures need not add up.

Counted across every game we have measured, up to 5 October 2026: Where a shot attempt ends

Goaltending

Counts every shot each goaltender faced, and what became of it — saved, scored on, or missed the net.

Each goaltender is counted for the team he plays for, against the other team’s shots — so these two columns read the opposite way round.

Counted across every game we have measured, up to 5 October 2026: How often a goaltender makes the save

Why play stopped

Counts the rule that stopped play, and the dot it restarted on.

A stoppage names a rule and never a team, so nothing here is credited to either side.

Counted across every game we have measured, up to 5 October 2026: How many penalties a team takes · How often a team is offside · How often a team ices the puck

Zone starts

Counts every faceoff, and for the team that won it, whether that draw was in its offensive zone, the neutral zone, or its defensive zone.

Each draw is credited to the team that won it, in the zone that team was attacking toward — so the same dot is an offensive-zone start for one team and a defensive-zone start for the other. The league records the winner and not the loser, so a draw has one team and never two.

Counted across every game we have measured, up to 5 October 2026: What a face-off in one end is worth

These are the layers themselves, not a description of them: the sentences above are the ones the game page prints beside each count, read out of the same code that does the counting.

Fair questions about all this

1. Comparing the first half of a season against the second is a hard test. Aren’t you selling every number short?

Yes, and on purpose. A team in October is not quite the team it is in March — the schedule is different, players get hurt, lines change. Our test counts all of that against the number, even though some of it is real change rather than luck. The gentler version is to compare every other game instead: each half then gets the same schedule and the same healthy roster, and everything looks steadier. We show you both. Under every number above, the smaller figure is what that gentler test says. We publish the harder one, because the question the site is actually answering is does what this team has done so far tell you what it will do next, and that is the harder question.

2. Where does your cut-off for “steady enough” come from?

Nowhere. It is a choice. We picked how closely a team’s first half has to match its second before we are willing to put a number beside a team’s name, and nothing in the data picked it for us. The only useful answer to that is to show you what changes if you pick differently, so every number above also carries what it would need at a looser bar and at a stricter one.

3. And where does half a season come from?

Half a fact, half a choice. A season is 82 games, so 41 is half of something real rather than a number we tuned, and it will move by itself if the league ever changes the schedule. But deciding that half is the right fraction was still us deciding.

4. A number can matter enormously without being steady.

Right, and this is the criticism we agree with most. Our test answers exactly one question — does this number describe this team — and it has nothing at all to say about whether the thing being measured matters. No power-play number passes it. That does not make power plays unimportant; it means our test cannot speak to importance, and we are not going to pretend it can. It is why power plays appear as something hockey does rather than as something a team is, and that is a limitation of the test rather than a defence of it.

5. Your test cannot see a scorekeeper’s bias. Both halves of a season share the same home rink.

Right, and it changed what is on the card. Some things in the record are counted by a person in the building, and that person counts the same way in October as in March — so the number looks beautifully steady while partly measuring the scorekeeper. We test for it separately, by asking whether the home team’s figure moves together with its visitors’ figure in the same building. A measure of shots that missed the net passed every steadiness test we had and failed that one badly. It was on this site for about four hours.

6. You combined three seasons without levelling them first.

Right, and we found it ourselves on 23 September 2026. The league’s recording of some events changed a great deal between those seasons — giveaways nearly doubled in one off-season, which no team did. Pooled without removing each season’s own level, a league-wide change like that reads as a difference between teams. Our own written method said to level them and the code did not. It is fixed, with a test that fails if it ever stops happening. It cost us one number, which came off the card, and gave back another, which went on.

7. Your bar is rigged to reject anything clever.

It rejects the standings. Points percentage, goal difference and save percentage at even strength all need more games than we allow, so none of them is beside a team’s name either. The bar is demanding of the numbers every broadcast leads with before it is demanding of anyone else’s.

What we cannot measure, and will not pretend to

Zone entries and exits, controlled-entry rate. Not in the public feed at any level. Everything the league records for a game is: faceoff, stoppage, hit, giveaway, shot on goal, takeaway, missed shot, blocked shot, goal, penalty, delayed penalty, and the markers for a period starting and ending. A number built on zone entries would be a number built on something we simply do not have.

Expected goals, score-adjusted possession, RAPM, GAR and WAR. These are models — someone’s estimate of how much a chance was worth. This site shows what happened and counts it, so that anything we print can be checked against the replay sitting next to it. An estimate cannot be.

PDO. It adds two rates together rather than dividing one thing by another, so it does not fit the shape every number here takes. Both of its parts need far more than a season to steady. And PDO is designed to measure luck — presenting it as something a team is would turn its own meaning inside out.

Anything per sixty minutes of even-strength play. That is what the analytics world divides rate statistics by, and working it out needs each team’s ice time split by how many players were on the ice — which we cannot get from the league’s feed yet. It is the reason we publish no rate as a team number: every team number above is a share of what the two teams did, which needs no such division. Two of those three still count every situation rather than even strength only, so a team that spends a lot of time on the power play is partly being described by its power play. That is said on each of them, and it is the thing we would fix first.

The whole search — all 47 measures we tested, how much they overlap, and the four different ways we tried to detect scorekeeper bias (they do not fully agree with each other, and we say so) — is in docs/what-settles.md. The code behind every number on this page is src/lib/reliability.js. Both are open, and so is everything else here.