Stats engine
Stats are derived from the game sheet, never typed. Fix the goal and everything downstream — points, standings, the widgets on your website — corrects itself.
Every number has a receipt.
Stats aren't typed in. They're derived from the game sheet — so when the bench records a goal, the scorer's points, the standings and every widget on your site agree, instantly.
The bench records a goal.
Period, time, scorer, assists, situation. On a phone, offline if it has to be. The sheet is the only thing anyone types.
Every stat is derived from it.
Points, PIM, save percentage, games played, standings, game-winning goals — recomputed from sheets, never edited by hand. Fix the goal and everything downstream corrects itself.
Your website updates itself.
Every widget reads the same numbers. The roster on your site, the standings in the sidebar, the scorers on the front page — one source, no copying.
Game sheet
Derived stats
Your website
One goal, end to end
From the tap to the number, and back.
Three steps the engine takes every time the bench records something.
BLD
Blades
WLV
Wolves
This game
- P3 11:42#44 Singh (#11 Okafor)
- P2 06:18#9 Patel (unassisted)
- P1 14:03Ridge Wolves goal
01 · The sheet
A goal is recorded.
The bench taps it in: period, time, scorer, assists, situation. That line on the sheet is the only thing anyone types.
02 · The engine
Points, PIM, SV%, standings recompute.
Goals, assists, points, penalty minutes, power-play and short-handed goals, the game-winner, games played, both goalies' save percentage and goals-against average — all derived from the sheet, none edited by hand.
03 · The receipt
The click-through.
Any number on a player's page opens the games behind it, down to the period, the time and the assist. Open the sheet from there. Fix the sheet, and the number fixes itself.
Games played
Honest games played.
When the bench sets a lineup, GP comes from it: dressed players get the game, scratches don't. A game entered by hand is flagged as manual, so a reader can tell a live sheet from a paper one.
- GP from lineups when they exist
- Scratches don't count
- Manual-entry games are flagged
Standings
Standings that add up.
Wins, losses, ties, games played, goals for and against, differential and points, from finalized sheets only. Overtime losses appear as a column only when a team has one. Tournament standings break ties the way a tournament does: points, head-to-head, goal difference, goals for, wins.
- W–L–T, with OTL only when there are overtime losses
- GP, GF, GA, DIFF, PTS
- Tiebreakers: points, head-to-head, goal difference, goals for, wins
Players
Player profiles and careers.
Each player has a public profile: headshot, number, position and a few optional bio fields the club chooses to show. Under it, every season with the club and a career line across them. A birthdate is never on a public page.
- Headshot, number, position, optional bio
- Career across seasons
- Date of birth never public
Blades U15
#44 Singh
Defence · shoots left
Third season with the club. Captain's assistant this year.
| Season | GP | G | A | PTS |
|---|---|---|---|---|
| 2024–25 | 22 | 4 | 9 | 13 |
| 2025–26 | 24 | 6 | 11 | 17 |
| 2026–27 | 14 | 7 | 12 | 19 |
| Career | 60 | 17 | 32 | 49 |
Birthdate is never shown on a public page.
The details
What the engine gets right.
Honest games played
GP comes from the lineup when there is one. A scratch doesn't earn a game. A game entered by hand is flagged as manual.
The game-winner, computed
GWG is worked out from the goal log and the final score, not ticked by the scorer. Change the score and it moves.
Both goalies, fairly
Split nets attribute shots and goals against to the goalie who was in. Save percentage and GAA follow from that.
Season and all-time
A season switcher on every table. Career totals across the seasons a player has been with the club.
Paper games, flagged
Games scored on paper can be entered by hand or photographed with the Sheet Scanner. Either way they're marked as manual, so you know which numbers came from a live sheet.
Advanced stats on paid plans
Power-play goals, short-handed goals and game-winners are on the Team and Club plans. Points, PIM, goalie numbers and standings are on every plan.
Questions about hockey stats.
Can we type stats in?
For a game scored on paper, yes — manual entry exists, and the game is flagged as manual so everyone can tell it apart from a sheet scored live. The Sheet Scanner can read the paper sheet for you instead.
Do you track plus/minus?
No. The sheet records who scored and who assisted, not who was on the ice for every goal, so we don't publish a number we can't derive honestly.
Can we fix a mistake after the game?
An admin reopens the sheet, corrects it and finalizes again. Points, PIM, goalie stats, standings and every widget recompute from the corrected sheet. If the sheet had been signed, the signatures are voided with a reason and the trail is kept.
Are stats public?
The player stats and standings widgets are public on your club's website, and so are player profiles if the club turns them on. Birthdates are never shown anywhere public.
Do stats carry between seasons?
Yes. A player's profile shows each season and a career total across them, and every table has a season switcher with an all-time view.
The rest of HockeyOS
Where the stats come from, and where they go.
The sheet that feeds the engine, the widgets it fills, and the people who read the numbers.
Score one game and watch the numbers move.
Free for one team, forever. No card. The stats widgets are live on your website the same day.