The data
Everything on Paper Puck comes from the NHL's own public data: the play-by-play and the shift charts for every regular-season game since 2019-20. I count it all myself. What the NHL doesn't record, like passes or which side a defenceman plays, isn't here.
Where the numbers come from
Two NHL feeds. The play-by-play has every shot attempt and goal, with its time, strength, location and type. The shift charts say who was on the ice, second by second. For the few games the shift charts are missing, I use the NHL's time-on-ice reports instead.
A player counts as on the ice for a shot or goal if his shift was going when it happened. If his shift ends right on a goal, he was out there for it; the guy hopping on for the next faceoff wasn't. In the games I've checked against the NHL's own on-ice numbers, this matches for almost every player, and the misses are a single shot during a line change.
Shot attempts
Corsi (CF, CA) is every shot attempt: goals, shots on goal, misses and blocked shots. Fenwick (FF, FA) is the same without the blocked ones. Shots (SF, SA) are shots on goal, goals included.
A share like CF% or xGF% is his team's shots divided by all the shots while he's on the ice. For a team, I count the team's own shots directly instead of adding up its players.
Strength
All situations is everything. Even strength (5v5, 4v4, 3v3), power play (5v4, 5v3, 4v3) and short-handed (4v5, 3v5, 3v4) only count time with both goalies in net. Empty-net time shows up in All situations and nowhere else.
The nitty-gritty
A shot's strength is the one the NHL records with it. Ice time's strength comes from the shift charts: who was on the ice, second by second.
Positions and handedness
A skater's position (C, LW, RW or D) is the one the NHL lists in his latest game's boxscore. The NHL doesn't say which side a defenceman plays, so every defenceman is just D.
Handedness (Shoots, Catches) is the NHL's record of the hand he shoots or catches with. It has its own filter: left-shot defence is Defence plus Shoots Left. A player with no hand on record only shows up under All.
Age
Age is his age in whole years on February 1 of the season (for 2025-26, February 1, 2026), the middle of the regular season, from the birth date on his NHL.com player page. A row covering several seasons gives his age in the latest one. With no birth date on record, it's left blank.
Shooting luck
The Luck report asks whether a hot or cold season is real. It puts his shooting %, the on-ice shooting % and PDO beside his own past seasons and the league's numbers for his position. Forwards and defencemen shoot at different rates, so I compare each only with his own group.
Sh% z asks how surprising his goal total is, given how he usually shoots. For “usually” I take his past seasons and mix in 100 shots at the league average for his position, so a rookie leans on the league and a veteran on his own history. That mix is my call, not something I fitted. Past ±2 the number gets coloured. For any one player that happens by luck about 1 time in 20, so in a table of 600 skaters, expect about 30 to light up from luck alone.
The nitty-gritty
Every rate is worked out from summed counts (total goals over total shots), never as an average of rates. “His past seasons” means everything I have for him before this one, back to 2019-20.
The z-score is in binomial standard deviations: his goals minus the goals his shots on goal would bring at his expected rate, over the spread chance alone would give. It treats that expected rate as known, when it's really an estimate, so it makes a season look a little more surprising than it is.
Under 25 shots on goal the number is greyed and never coloured: so few shots fit the bell curve badly (2 goals on 4 shots reads +3.6). A player's page shows the same comparison for the season as a “Shooting luck” panel, from 10 shots on goal.