Loading…

CHL Cards

Season Stats

Every QMJHL, OHL and WHL player's season and career stats in one sortable table, back to 1969-70: points, expected goals, scoring chances, splits and more.

Player Profiles

A scouting card for every player since 2005-06: percentiles, comparable seasons, shot map, splits and game log, with a picture to download.

Lines

Line combinations for every game in the three leagues, as the clubs file them before puck drop, with a printable PDF.

Scores

Every game's box score: goals and shots by period, expected goals, the shot map, each player's line and game score, and the lines each club dressed.

Streaks

The longest active point, goal and assist streaks in the CHL, and goalie win streaks.

Percentiles

Every player-season ranked stat by stat, as a percentile within its own league, season and position.

More tools

Percentiles

Minimum
Loading…

About CHL Cards

Player cards, percentiles and stats for the three leagues of the Canadian Hockey League: the QMJHL, the OHL and the WHL.

What it is

CHL Cards turns each player's season into a card: his numbers, and where each one ranks among the players at his position in his league that year. Around the cards are the tables and tools to find and compare players.

What it covers

 QMJHLOHLWHL
Season totals from1969-701997-981996-97
Cards and percentiles from2005-062005-062005-06
Game logs and splits from2025-262025-262025-26
Expected goals and shot maps from2025-262025-26Not recorded

The WHL does not record where shots are taken, so it has no expected goals and no shot maps. A stat a league did not keep in a given season is left out for that season, never shown as zero.

The numbers are updated every night, and on game nights within about fifteen minutes of a final score.

Where the numbers come from

Statistics come from the leagues' own public HockeyTech / LeagueStat feed, the same one behind the leagues' websites. Lines come from the lineup sheets the clubs file with their league before each game. NHL draft picks come from the NHL's own records.

What the site adds is worked out from those numbers:

Every stat on the site, and how it is worked out, is in the stat glossary.

Who runs it

CHL Cards is built and run by one person, as an independent project. It is not affiliated with, endorsed by, or connected to the Canadian Hockey League, the QMJHL, the OHL, the WHL, or any of their clubs. All team names, logos and player likenesses belong to their owners.

There are no accounts and no cookies. Visits are counted without identifying anyone: which page was opened, not who opened it. The privacy page has the details.

Contact

Write to info@chlcards.com with a question, an idea or a correction.

The site is also on X as @CHLCards, where new cards and lines are posted, and on Instagram as @chlcards.

If a number looks wrong, say which player and season and what you expected. Leagues change a scorer or an assist after a game more often than you would think, and the site follows them the night after.

Stat glossary

Every number on the site: what it tells you, how it is worked out, and where you'll find it.

How to read it

Three ideas sit under almost every number on the site.

PctPercentile

Where a player-season ranks among comparable ones, from 0 to 100. 90 means he's ahead of 90% of them.

How: within the same league, season, competition (regular season or playoffs) and position group (forwards, defencemen or goalies), among players who cleared the games-played floor: (players below him + half of those tied) ÷ players ranked. Stats where lower is better (GAA, PIM/GP, shots per goal, on-ice goals against) are flipped. A true zero on a counting stat is the 0th. The card's bars round to 1–99, apart from that zero.

PercentilesCardChartsTrajectoryCompare

FloorGames-played floor

The minimum games to be ranked, so ten minutes of hockey can't top a list.

How: for the season in progress, half of his club's games so far, rounded up, and never more than 30: 4 games once his club has played 7, 10 once it has played 20, 30 from its 60th game on. Finished seasons use 10 games, and playoffs 3. The same for skaters and goalies. A player under it still has his numbers on his card, without percentiles or comparable seasons.

Early in a season the floor is only a few games, so percentiles swing from night to night, and a player who sits out while his club plays can drop under it until he catches up.

/GPPer game

Rates are per game played, never per 60 minutes: the leagues don't publish skaters' ice time. A goalie's workload rates are per 60 minutes, because his minutes are recorded.

R / PCompetition

Regular season and playoffs are separate everywhere: separate totals, separate rankings. A playoff percentile comes from a short sample and moves a lot.

Player & season

Season · TeamSeason, club

The season a line belongs to, named by the two years it spans: 2025-26 began in the autumn of 2025. Team is his club that season; on a career line, his latest.

Every table

GPGames played

Games he dressed for. From box scores from 2025-26, the league's season line before that.

Everywhere

AgeAge

His age on the last day of the season, whole years. Blank when the league has no birthdate (common before 1990).

DYDraft year

Where a season sits against his first NHL draft. DY is the season that ends in the year he's first eligible, DY-1 the one before, DY+1 the one after.

How: first eligible draft = the year he turns 18 if born on or before 15 September, otherwise the next year.

Season StatsPercentiles filterCardLines

RookieFirst-year player

A player his league counts as a rookie that season. It is the league's own mark, not an age: an import in his first year is a rookie at 19. On Season Stats and Percentiles, the Experience menu keeps rookies only; a card of a rookie season says ROOKIE beside the name.

How: read from the league's season stat lines, every night for the season in progress. On Percentiles a rookie's percentile is still his rank among every player of his league, season and position, not among rookies. The filter is a season's, so it is off in a career view.

Season Stats and Percentiles filterCard

Overager20-year-old player

A player in his 20-year-old season, the last a junior may play: born twenty years before the year the season starts (a 2006 birth year in 2026-27). A club may dress only a few, so most have two to five. On Season Stats and Percentiles, the Experience menu keeps overagers only.

How: from his birth year alone, which is the leagues' own rule; it is not the 15 September cutoff a draft year uses, so an overager can be DY+2 or DY+3. A player with no birthdate on file is not counted as one, which is most players before 1990. On Percentiles an overager's percentile is still his rank among every player of his league, season and position. The filter is a season's, so it is off in a career view.

Season Stats and Percentiles filter

League draftQMJHL / OHL / WHL draft

The year, round and pick he was taken in his league's draft, "Import draft" for the CHL import draft, or "Undrafted" when the league signed or listed him without a pick.

CardSeason Stats and Percentiles filter

NHL draftNHL draft & rights

His NHL pick (year, round, pick, club), from the NHL's own results where they can be matched to him, the league feed otherwise. "NHL rights" names the club holding them after a trade, and shows on current players only.

CardLines (club logo)

Nat / PosNationality, position

From the league's player record. A season is ranked at the position he was listed at that season, so a defenceman who later moved up front stays a defenceman for those years.

Scoring

G / A / PGoals, assists, points

The league's official counts. P = G + A.

Season StatsCardGame log

A1 / A2Primary, secondary assists

A1 is the last pass before the goal; A2 is the one before that. Primary assists say more about who created the goal.

How: A1 from each box score's list of goals, which names the first and second assister. A2 = assists − A1, so the two always add up to his assists. From 2025-26.

Season StatsSeason by seasonGame log

P/GPPoints per game

Points ÷ games played. The main production number.

PercentilesCard

NHLeNHL equivalency

His points a game translated to NHL points over 82 games, so the three leagues read on one scale: what his scoring would be worth in the NHL. It is the one stat whose percentile is ranked across the CHL, among every forward (or defenceman) of the three leagues that season.

How: points ÷ games played × his league's factor × 82. The factors are the site's own, fitted on the careers of every NHL skater since 2005-06 who played in the CHL: how the leagues' scoring compares from players who went on to the AHL and then the NHL, and how much of it carries over from those who went straight to the NHL the next season. Fitted on junior seasons 2015-16 to 2024-25: QMJHL 0.253, OHL 0.298, WHL 0.276. Fitted again each summer. Regular season only; no adjustment for age. A career counts each season by its own league's factor.

Season StatsSeason by seasonPercentilesCardCompare

G/GP · A/GPGoals, assists per game

Goals ÷ GP and assists ÷ GP.

A1/GPPrimary assists per game

Primary assists ÷ GP. The only assist split with a percentile. From 2025-26.

P1 · P1/GPPrimary points

Goals plus primary assists: points without the second assist, which says the least about who made the goal happen. A cleaner read of a player's own production than total points.

How: P1 = G + A1. Season Stats, the season-by-season table and the game log show the total; Percentiles and cards rank it per game (P1/GP), in all situations and at 5v5, on the power play and on the penalty kill. From 2025-26, in all three leagues.

Season StatsPercentilesCardSeason by seasonGame log

GmScGame score

One number for one game, from everything on a player's line that night. In a game log, and in Season Stats' Game view, it is that game's score; in a season's or a career's row, his season-by-season table and his splits it is his average a game.

An ordinary game for a skater is about 0.15, a good one 1.35 or more (one game in ten) and a great one 2.8 or more (one in a hundred); a goalie's ordinary start is about 0.45, and a 40-save shutout is 4.00. Season Stats' Game view lists every game of a season, a row a game, and opens on the best by game score.

How: a skater's is 0.75 a goal, 0.70 a primary assist, 0.55 a secondary assist, 0.075 a shot on goal, 0.15 for each goal his club scores with him on the ice at 5v5 and 0.15 off for each against, 0.15 off for each minor he takes (a double minor is two; a fight or a misconduct costs nothing), 0.01 for a faceoff won and 0.01 off for one lost. A goalie's is 0.10 a save, less 0.75 a goal against. The weights are those of the public game score, without what these leagues do not record: blocked shots, penalties drawn and shot attempts. Over a whole season it follows points per game closely; its use is the single game. Skaters from 2025-26, in all three leagues; a goalie's season average wherever his saves were counted.

Season StatsSeason by seasonSplitsGame log

1P · 1P% · 2P · 2P% · 3P · 3P%Consistency: games with a point

In how many of his games he got on the scoresheet. 1P counts the games in which he had one point or more, 2P two or more and 3P three or more; 1P%, 2P% and 3P% are each count's share of the games he played. Two players at a point a game can get there very differently: one with a point most nights, another with a few big ones.

How: each is "at least", so a three-point night counts in all three. A share is the count ÷ the games he played. From 2025-26, the seasons read game by game, in all three leagues; a career adds up those seasons only.

Season StatsSeason by season

ESP/GPEven-strength points per game

(Points − power-play points − short-handed points) ÷ GP. "Even strength" here is anything but PP and SH, so it includes 4-on-4 and empty nets; the strict 5v5 version is in the Situation menu. On the charts it is written EVP/GP.

GWGGame-winning goals

The goal that put his team one ahead of the other side's final score. A season count.

OTGOvertime goals

Goals scored in overtime (shootout goals don't count). A season count.

FGFirst goals

Games in which he scored the first goal, whichever side went on to win. A season count.

How: the league's own count up to 2024-25. From 2025-26 it is counted from each game's list of goals, and held to the league's season totals every night.

Season StatsSeason by seasonSplitsGame log

INSInsurance goals

For the side that won, its next goal after the game-winner: the one that put the game a goal further out of reach. One a game at most, and none in a game won by one. A season count.

How: the league's own count up to 2024-25. From 2025-26 it is counted from each game's list of goals, and held to the league's season totals every night.

Season StatsSeason by seasonSplitsGame log

UAUnassisted goals

His goals on which no assist was given. A season count.

How: the league's own count up to 2024-25. From 2025-26 it is counted from each game's list of goals, and held to the league's season totals every night.

Season StatsSeason by seasonSplitsGame log

ENGEmpty-net goals

His goals into a net the goalie had left for an extra skater. They count among his goals; expected goals leave them out. A season count.

Season StatsSeason by seasonSplitsGame log

Shooting & expected goals

The leagues record shots on goal only, never missed or blocked shots, so every shot number here is shots on goal.

SShots on goal

Shots that reached the goalie or went in.

SH%Shooting percentage

Goals ÷ shots × 100. Highly streaky over one season.

SHOT/GPShots per game

Shots ÷ GP. How much he gets the puck to the net.

SHOT/GShots per goal

Shots ÷ goals; lower is better. Only for players with a goal.

xGExpected goals

How many goals his shots would produce for an average shooter. It rates the chances he gets, apart from how he finishes them.

How: each shot on goal gets a chance of scoring from a model fitted on the league's own shots: distance, angle, behind the net, how soon it follows his own side's last shot (the same second, or 1, 2 or 3 seconds after, each weighed apart), off a faceoff (within 4 s), the manpower on the ice, and shots recorded from his own zone. xG is the sum. Empty-net shots are left out. QMJHL and OHL from 2025-26; the WHL records no shot locations.

Season StatsPercentiles (xG/GP)Card

GAXGoals above expected

Finishing. Above zero, he scored more than his chances were worth.

How: goals on his located shots − xG of those shots. Leaves out empty-net goals, so it won't equal G − xG for everyone.

xG/SHOT · xG/SExpected goals per shot

Shot quality: what one of his shots is worth, whatever their number. It tells a player who gets to the net from one who shoots from everywhere. A forward's is about 0.12; a net-front finisher's is 0.17 and over.

How: xG ÷ the shots on goal it prices (empty nets left out). On Percentiles and the card it is ranked from 40 shots; in the season in progress that minimum climbs with the club's games played (10 shots at 8 games, the full 40 from 34). Season Stats shows it raw. QMJHL and OHL, from 2025-26.

Season StatsSeason by seasonPercentilesCard

DISTMedian shot distance

How far from the net he shoots, in feet: half his shots on goal were taken from closer than this. Forwards are around 28 feet, defencemen around 48. On Percentiles, closer ranks higher.

How: the median distance of his shots on goal: the middle one, so a few shots from his own end do not move it. Ranked from 40 shots, on the same climbing minimum as expected goals per shot. A career's is the median of all its shots. QMJHL and OHL, from 2025-26.

Season StatsSeason by seasonPercentiles

HDSC · MDSC · LDSCScoring chances by danger

His shots on goal sorted into high-, medium- and low-danger chances. High-danger chances are rare and go in about one time in four; low-danger ones are about half of all shots and go in 3 to 4% of the time.

How: by each shot's expected-goal value: high is 20% or better, medium 8 to 20%, low under 8%. Season Stats shows the totals; Percentiles and cards rank them per game (HDSC/GP and so on). These are all shots on goal, so a low-danger "chance" is often a long shot that reached the goalie. QMJHL and OHL from 2025-26; empty nets left out.

Season StatsPercentilesCard

HDSC% · MDSC% · LDSC%Conversion by danger

How often he scores on chances of each kind: finishing, with the quality of the chance held roughly equal.

How: goals ÷ chances at that level × 100. To be ranked he needs a minimum number of chances; below it the card leaves the row off. Over a full season that is 10 high-danger chances, or 20 medium or low. During the season in progress the minimum grows with the games his club has played, reaching the full number at 34 club games: after 8 games it is 3 high-danger chances, or 5 medium or low. Early-season rates rest on a handful of shots and move a lot. Season Stats shows the raw rate for everyone.

Season StatsPercentilesCard

Special teams

PPG · PPA · PPPPower-play goals, assists, points

Scored while his team had more skaters because of a penalty, as the league flags the goal.

Season StatsPercentiles (PPG/GP, PPP/GP)

PPSH%PP share

Which power-play unit he is on, without ice time: of his club's power-play goals in the games he played, the share he was on the ice for. A first-unit regular is at 80 to 90%. A player who never sees the power play is at 0.

How: his on-ice power-play goals for ÷ his club's power-play goals in his games × 100. Ranked once the club has 10 such goals; in the season in progress that minimum climbs with the club's games played (3 goals at 8 games, the full 10 from 34). It counts goals, not minutes, so a second unit that rarely scores reads smaller than its ice time. QMJHL and OHL, from 2025-26.

Season StatsPercentilesCardPower-play card

SHG · SHPShort-handed goals, points

Scored while his team was short a skater.

Season StatsPercentiles (SHG/GP, SHP/GP)

On the ice

Every goal lists the skaters on the ice for both teams, so the site knows who was out there, not just who scored. Goals only: shots don't say who was on the ice. From 2025-26, QMJHL and OHL. The WHL's feed leaves power-play goals off those lists, so it has none of these.

GF · GAOn-ice goals for, against

Goals his team scored, and allowed, with him on the ice.

How: at 5v5 in the all-situations tables; with a situation picked, that situation's own. A power-play goal against him is counted on his penalty kill.

Season StatsPercentiles (OGF/GP, OGA/GP)

GF%On-ice goal share

Plus/minus done properly: of the 5v5 goals with him on the ice, the share his team scored. 50% is even.

How: GF ÷ (GF + GA) × 100, at 5v5. Ranked from 10 on-ice goals.

GF% RelGF% relative to team

Whether his team does better with him on the ice than without him. Separates a player driving results from one riding a good team.

How: his GF% − his team's GF% with him off the ice, in the games he played, at 5v5. Ranked from 10 on-ice goals. Shown on the card in place of plus/minus when he has it.

Season StatsPercentiles (RELGF%)Card

IPPIndividual points percentage

Of the goals scored with him on the ice, the share he had a point on. High: he's in on the scoring. Low: he's along for the ride.

How: his points on those goals ÷ GF × 100. At 5v5 in all situations. Ranked from 10 on-ice goals for.

+/-Plus/minus

The league's plus/minus: +1 when he's on the ice for an even-strength or short-handed goal for, −1 for one against. Power-play goals don't count. Empty nets do.

Season StatsCard stat linePercentiles (PM/GP)

Role & physical

PSHARE · TmP%Share of team points

His points ÷ all points by his club's skaters that season × 100. GSHARE and ASHARE are the same for goals and assists. On Season Stats and on a chart the three read TmP%, TmG% and TmA%.

Season StatsSeason by seasonPercentilesCard

xGSHARE · TmxG%Share of team expected goals

How much of his club's chances he takes himself. A first-line shooter is at 14 to 19%; most regulars are around 3 or 4.

How: his expected goals ÷ the expected goals of all his club's skaters that season × 100, so a club's players add up to 100. Empty-net shots are left out, as for every expected-goal stat. QMJHL and OHL, from 2025-26.

Season StatsSeason by seasonPercentilesCard

PM/GPPlus/minus per game

Plus/minus ÷ GP.

HIT · HIT/GPHits

Body checks credited by the scorer. QMJHL only, from 2003-04: the OHL and WHL have never recorded hits.

PIM · PIM/GPPenalty minutes

Minutes assessed. PIM/GP is ranked lower-is-better.

MINOR · MAJOR · FIGHT · HOOK …Penalties by type

How many penalties of each kind he took. First by class: minors, majors, misconducts (MISC) and game misconducts (GM). Then by what they were called for: fighting, roughing, tripping, hooking and so on.

How: minors and majors are the league's own count for seasons up to 2024-25. From 2025-26 every penalty of every game is read from its box score, in the league's own words, and counted. A double minor is two minors and one call of its infraction. An infraction counts its minors and majors; a misconduct that came with it is counted as a misconduct, not a second time. A penalty shot is not a penalty. Bench penalties belong to nobody.

The headings: FIGHT fighting · ROUGH roughing · TRIP tripping · HOOK hooking · HI-STK high-sticking · SLASH slashing · HOLD holding · X-CHK cross-checking · INTRF interference · UNSP unsportsmanlike conduct · DELAY delay of game · BOARD boarding · HEAD check to the head · INSTG instigator or aggressor · BEHIND checking from behind · KNEE kneeing · CHARGE charging · OTHER everything else.

Season StatsSeason by season

FO · FOW · FO%Faceoffs

Faceoffs he took (FO), how many of them he won (FOW), and the share he won (FO%). A player who took none has no share.

How: FO% is faceoffs won ÷ faceoffs taken × 100. On a card it is ranked for centres with 100 or more faceoffs.

Goalies

W · L · OTL · SORecord, shutouts

Decisions as the league credits them. OTL counts overtime and shootout losses. WIN% = wins ÷ GP × 100; SO/GP = shutouts ÷ GP.

SA · SV · GAShots against, saves, goals against

Shots on goal he faced, the ones he stopped, the ones that went in.

SV%Save percentage

Saves ÷ shots against, shown as .912.

GAAGoals-against average

Goals against × 60 ÷ minutes played. Lower is better.

GSAXGoals saved above expected

How many goals he saved beyond what an average goalie would have, given the quality of the shots he faced.

How: xG of the shots he faced − goals he allowed on them. Empty nets left out. QMJHL and OHL from 2025-26.

A goalie's game log has it game by game, and over the log his best and his worst night of the season are named: press one and that game is marked in the log. Every game he played in counts, a relief appearance too.

GSAX/GPGoals saved above expected per game

GSAX on a per-game scale, so a starter and a backup can be compared. The total grows with how much a goalie plays; this doesn't.

How: GSAX ÷ games played. It is the version on the card's radar; the total stays in the card's bars.

PercentilesCard radar

HDSA · MDSA · LDSAShots against by danger

The shots he faced, sorted into high-, medium- and low-danger by the same cut-offs as skaters' scoring chances.

How: by each shot's expected-goal value: high is 20% or better, medium 8 to 20%, low under 8%. Totals on Season Stats, per game on Percentiles and cards. QMJHL and OHL from 2025-26.

Season StatsPercentilesCard

HDSV% · MDSV% · LDSV%Save percentage by danger

His save percentage on each kind of shot. High-danger save % separates goalies more than the overall number, which is dominated by easy saves.

How: saves ÷ shots at that level. To be ranked over a full season he needs 30 high-danger shots, or 50 medium or low. During the season in progress that minimum grows with his club's games in the same way as for skaters: after 8 games it is 8 high-danger shots, or 12 medium or low. Season Stats shows the raw rate for everyone.

Season StatsPercentilesCard

MIN · SA/60 · SV/60Minutes and workload

How much he plays, and how busy he is when he does. MIN is his minutes in net; SA/60 and SV/60 are the shots he faced and stopped for every 60 of them; MIN/GP is minutes per game played.

GSGames started

The games he started in net. Games played also counts the nights he came in for someone else.

How: from each game's box score, so from 2025-26; a league's season totals for earlier years say games played only.

Season StatsSeason by season

QS · QS% · RBSQuality starts, really bad starts

How often he gave his club a good night, and how often a very bad one. QS counts his quality starts, QS% is their share of his starts, and RBS counts his really bad starts.

How: a quality start is a start with a save percentage at or above the league's that season, or at .885 or better when he faced twenty shots or fewer. A really bad start is one under .850. The league's save percentage moves as the season goes, so a start near the line can change sides. From 2025-26.

Season StatsSeason by season

STLStolen wins

The wins he stole: games his club won in which he saved more goals above expected than the game was won by. Take an ordinary night in net and the shots say his club does not win it.

How: a win credited to him in which his goals saved above expected that night are more than the margin of the final score. Empty-net goals count in the margin, so it can be read off the result; a shootout win is won by one. A win in relief counts, on the shots he faced. QMJHL and OHL, from 2025-26. About one win in six is one.

Season StatsSeason by season

SUPGoal support

The goals his club scored a game in his starts. It explains a record that does not match a save percentage: a goalie who gets two goals a night loses games another wins.

How: his club's goals in the games he started ÷ his starts. A shootout's deciding goal is not a goal. From 2025-26.

Season StatsSeason by season

ST% · B2B · REL · PULLWorkload

How much he is leaned on. ST% is the share of his club's games he started; B2B, his starts made the day after his last start; REL, the games he came into without starting; PULL, the starts in which another goalie of his club also played.

How: ST% is his starts ÷ the games his club has played. A goalie traded in mid-season is set against his new club's games. A back-to-back is counted start to start: a night in relief between two starts neither makes one nor hides one. How he does in them is the Rest menu's to say. From 2025-26.

Season StatsSeason by season

L5 SV% · L5 GSAXRecent form: his last five starts

His save percentage and his goals saved above expected over the last five starts of the season: how he is playing now, beside how his season has gone.

How: saves ÷ shots over those five starts; expected goals against less goals against on the same starts, QMJHL and OHL only. With fewer than five starts, the ones he has. A career table has none: it is a season's.

Season StatsSeason by season

Situations

The Situation menu splits a player's numbers by game state. From 2025-26, the seasons read game by game. Games played stays all his games, since there is no ice time by situation.

AllAll situations

Everything, the way the league counts it.

5v5Even strength

Strictly five skaters a side with both goalies in. Not 4-on-4, not 3-on-3 overtime, not an empty net or an extra attacker.

PP · PKPower play, penalty kill

More, or fewer, skaters than the other side because of a penalty. A goalie's situation is his team's: a power-play shot against him is his penalty kill.

HowHow a situation is decided

Goals: exact. Power play and short-handed come from the league's flag on the goal; 5v5 from the five-a-side on-ice lists. Shots: worked out from the penalties being served, with regular-season overtime as 3-on-3. A shot taken with the goalie pulled for an extra attacker can't be spotted and counts as 5v5 (about 2% of shots).

ScoreLeading, tied, trailing

The Score menu of Season Stats keeps what a player did while his club was ahead, level or behind: his goals, assists and shots, or for a goalie the shots he faced. It goes with a situation, so trailing at 5v5 or leading on the penalty kill can be asked for. On a profile it is the By score table of the Splits box.

How: each goal and each shot is counted by the score just before it. So the goal that ties a game was scored trailing, and the goal that puts a club ahead was scored tied. A goalie's score is his own club's. These are counts, not rates: there is no ice time by score, so games played stays all his games, and a player on a club that is usually ahead has most of his points while leading. Shots, expected goals and every goalie number need located shots, so the QMJHL and OHL only. From 2025-26. Not together with a split or a date range.

Season StatsPlayer profile

Splits

A split is one slice of a season: where the game was played, the month, the opponent, or the period. On Season Stats it is the Split menu; on a profile it is the Splits box, between the season table and the game log. From 2025-26, in all three leagues. A profile's streaks are counted from the same games.

Home · AwayBy venue

His games at home, or on the road. Games played is the games in that slice, and every counting stat comes with it.

MonthBy month

The games played in one calendar month. The quickest way to see a hot stretch or a slump.

vsBy opponent

His games against one club.

RestDays off before a start, for goalies

The Rest menu of Season Stats keeps a goalie's starts by the days off he had before them. 0 is a back-to-back, a start made the day after his last start; 1 is one day off between the two; and so on up to 7+, a week or more. Every number in the table is then of those starts alone: his record, his save percentage, his goals saved above expected.

On a goalie's profile the By rest table of the Splits box sets his starts on no rest beside his other starts and his nights in relief; the three add up to his season.

How: counted start to start, as the B2B column is: a night in relief between two starts is not a start, and does not reset the count. His first start of a season has no start before it and is under no number, nor is a night in relief. A goalie's only: the menu is greyed out on a table of skaters. It is a choice of games, so it goes with a split by venue, month or opponent and with a date range, and in the Game view it lists those starts one by one; not with a situation, a score or a period. A regular goalie has a handful of starts under each number, so read the games played beside the rest. From 2025-26, in all three leagues.

Season StatsSplits

1st · 2nd · 3rd · OTBy period

What he did in each period, with every period after the third counted as overtime. Unlike the other three it is a part of every game, so games played stays all his games on Season Stats and is a dash in the profile box.

How: goals and assists from the play-by-play, which matches the box score point for point. Shots, shooting % and xG by period come from the located shots, so the QMJHL and OHL only. Plus/minus, penalty minutes, game-winners, hits and faceoffs are not recorded by period and show a dash.

StreaksGames in a row

How many games in a row he did a thing: for a skater a point, a goal, an assist; for a goalie a win, or two goals against or fewer. Over his game log, for the log's season: the longest of the season with the dates it ran between, and while the season is being played the one he is on now. Press a number and that streak's games are marked in the log. The Streaks page lists every player's: the longest active streaks in a league or in all three, or each player's longest of a season. It lists streaks of two games or more, the hundred longest.

How: counted over the games he played, so a game he missed does not break a streak, and a current one stays current while he is out. A goalie's win streak is counted over his decisions: a game he entered or left with no decision neither adds to it nor ends it. Two goals against or fewer is asked of every game he played in, relief appearances included. The regular season and the playoffs are counted apart, and a streak does not carry from one season to the next.

Player profileStreaks

GameA row a game, and minimums

Season Stats has three views: a career's rows, a season's, and one row for each game a player played. The Game view is every player's game log in one table: the day, the opponent and the result, then his numbers that night. It opens on the best games by game score, sorts by any column, and takes the filters the other views take. Home or away, a month or an opponent there keeps the games of it.

A minimum keeps the rows with at least a number in a column: pick the stat, type the number, press Add. Three goals and five shots in the Game view is every such night; ten games on a season's rows takes out the players who barely played. Several can be set at once, and each is taken off by its cross. On Percentiles a stat's minimum is its percentile: 90 is the 90th or better.

How: a game's row is his game log's row, so it has that log's columns: no games played, and no rate on a handful of shots. Seasons read game by game only, 2025-26 on, in all three leagues. A minimum's number means what the column shows: 12.5 for 12.5%, .9 for a save percentage of .900. A row with nothing in a column does not meet a minimum on it.

Season StatsPercentiles

DatesA date range

The two date boxes of Season Stats keep the games from one day to another, both days included. Either box may be left empty: from a day on, or up to one. On a season's rows and on a career's, every number is then counted over those games only: the last month, since the trade deadline, the first half. In the Game view the rows are the games of those days, and the same day in both boxes is everybody who played that night.

How: seasons read game by game only, 2025-26 on, in all three leagues. A range is a choice of games, as a split by venue, month or opponent is, and goes with one: home games since January. It leaves out what a split leaves out (the on-ice stats, PP share, the team shares, the shot distance, penalties by type, a goalie's starts); game score and the Consistency columns are of those games. Not together with a situation or a period: choosing one lets the dates go. A player's club is the one he played the last of those games for.

Season Stats

HowHow splits behave

One split at a time, and not together with a situation: choosing one sets the other back to all. The on-ice stats and PP share are left out of splits. A career view adds up the seasons that have game data. Goalies have every split except by period in the WHL, which records no shot locations.

Season StatsPlayer profile

Cards & charts

CompsComparable seasons

The four seasons most like this one, from the same league, position group and draft-year class, in the same season or earlier.

How: similarity = 100 − the weighted average gap between the two seasons' percentiles. Scoring rates weigh most, physical play least. xG, A1 and the on-ice stats are not part of it.

ClassTrajectory class line

On a trajectory, the median percentile of players in the same draft-year class that season, for comparison with his own line.

ScaleScatter scales

Percentiles ranks each axis 0–100. Per game plots the stat itself. Totals multiplies a per-game stat by games played; rates and shares (SH%, SV%) stay as they are.

RadarRadar

Up to three player-seasons on the same percentile spokes. Each spoke is a percentile, so the shape shows strengths at a glance.

Shot mapShot map

Every shot on goal of a player's season on a half rink, under his card on Player Profiles. It is drawn from behind the shooter with the net at the top, so his left is the left of the drawing. A goalie's map shows the shots he faced.

How: one dot per shot on goal, filled for a goal, larger for a better chance (its expected-goal value). Shots taken from past centre sit on a strip under the red line. Empty-net goals are left out. Only shots on goal exist: no league records misses or blocks. The filters (situation, danger, result, opponent, goalie) redraw the map, the totals and the by-danger table; the radar beside it shows his season percentiles and does not follow the filters. Hover or tap a dot for that shot's details. Zones, the switch over the map, cut the half rink in nine: the inner slot (the goal posts to the faceoff dots), the outer slot (dot to dot, 20 to 40 ft out), the two flanks (the rest of each side from the goal line to 40 ft), behind the net (behind the goal line), the blue line in thirds from 40 ft out to the blue line, and beyond the blue line (past centre included); each says its share of the shots. The By zone table under the map gives each zone's shots, share, goals, shooting %, expected goals, expected goals a shot and goals above expected (for a goalie: goals against, save %, expected goals against and goals saved above expected), for the filters as set. A shot is marked a rebound when his own side had shot 2 seconds or less before, the same second included; the clock is written by hand in each rink, so take it as a rough mark. QMJHL and OHL from 2025-26; the WHL records no shot locations.

Player Profiles

Zone · Share · xGA · xGA/SStats by zone of the shot map

With a zone picked in Player Stats' Zone menu, every player's shots on goal from that zone of the shot map (a goalie's: the shots he faced from it). Share is that zone's part of all his shots on goal, in the situation chosen. xGA is the expected goals of the shots a goalie faced from it, xGA/S the same a shot.

How: each shot is put in a zone by the rule the shot map draws: the inner slot, the outer slot, the left and right flanks, behind the net, the blue line in thirds, and beyond the blue line; the Slot and Blue line choices add their zones up (the blue line its three thirds). The columns are GP (all his games), S, Share, G, SH%, xG, xG/S and GAX; for a goalie GP, SA, Share, GA, SV%, xGA, xGA/S and GSAX. Empty nets left out; expected goals over the priced shots. It goes with a situation, not with the score, a split, a rest or a date range. A player's row is his profile's By zone table. QMJHL and OHL from 2025-26; the WHL records no shot locations.

Player Stats

CareerCareer view

In Season Stats, every season a player played added together. Rates and shares are worked out from the summed counts, not averaged. Stats that start in 2025-26 cover only those seasons.

Lines

LinesLine combinations

Read from the lineup sheets clubs file with the league before each game: forward lines, defence pairs, starting and backup goalie.

DetailsPlayer line

Shooting (or catching) hand · draft year · birth month (YYYY-MM) · height · weight, from the club's roster. The logo in the corner is the NHL club holding his rights.

StripSeason strip

His season so far, as of the last update: GP · G · A · P for skaters, GP · SV% · GAA for goalies.

What exists when

A stat a league never recorded is absent, never shown as zero.

StatQMJHLOHLWHL
Goals, assists, points, PIM, power play1969-70 on1997-98 on1996-97 on
Shots on goal1998-99 on2015-16 on2014-15 on
Hits2003-04 onnevernever
Percentiles, cards, charts2005-06 on2005-06 on2005-06 on
Game logs, A1 / A2, situations, splits2025-26 on2025-26 on2025-26 on
xG, GAX, GSAX2025-26 on2025-26 onno shot locations
On-ice GF, GA, GF%, IPP, PP share2025-26 on2025-26 onincomplete, not shown

Privacy

CHL Cards has no accounts, sets no cookies and shows no ads. This page says what the site does learn about a visit, and what it holds about players.

In short

What is counted when you visit

Visits are counted with Vercel Web Analytics, which uses no cookies. When a page of the site is opened, it records:

To tell one visitor from the next it makes a short code from the request, and throws it away after 24 hours. Nothing in it says who you are, and it cannot follow you to another site.

What the servers see

Like any website, CHL Cards is delivered by servers that see your internet (IP) address and what your browser asked for, and that keep short-lived technical logs of it. The site is hosted by Vercel, a company in the United States.

The site's own database holds hockey statistics, and nothing about its visitors.

Other servers your browser may contact

Everything else, the fonts included, comes from chlcards.com itself. Links to X, to Instagram, to a league's box score or lineup sheet open those sites, which have their own rules; nothing of theirs is loaded until you click.

What stays in your browser

The columns you chose to show or hide in a table, and their order, are kept in your browser's own storage, on your device. Clearing the site's data in your browser removes them.

What the site holds about players

CHL Cards shows what the leagues publish about their players: name, date of birth, hometown, nationality, height and weight, position, photo, draft history and statistics. It comes from the leagues' own public feed, from the lineup sheets clubs file before games, and from the NHL's draft records.

If you are a player, or a player's parent or guardian, and something about you is wrong or you would rather it were not shown here, write to info@chlcards.com and it will be looked into.

Questions, and changes

CHL Cards is run by one person, who answers for what this page says: info@chlcards.com.

If what the site collects changes, this page changes with it. Last updated .