CHL Cards

Percentiles

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.

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.

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

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

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

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

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.

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, a rebound (within 3 s), 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.

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

PSHAREShare 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.

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.

FO%Faceoff percentage

Faceoffs won ÷ faceoffs taken × 100. 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.

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.

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).

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.

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.

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.

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. QMJHL and OHL from 2025-26; the WHL records no shot locations.

Player Profiles

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

What's new

What has been added to CHL Cards, newest first. Each addition is also posted on X by @CHLCards.