The AHL site only gives save percentage and GAA, and those treat a point shot and a one-timer from the crease as the same shot. I wanted a rough goals-saved-above-expected number off data anyone can already see, so this isn’t a private model or a scraped tracking feed.
The shots come from the public HockeyTech feed behind the AHL game center online, the same source as the shot chart on a game page. For every final 2025-26 regular-season game I pulled the play-by-play. Each shot event has the goalie, whether it went in, an x/y location, and the league’s own quality tag.
Empty-net shots are dropped, because there’s no goalie on the event. Shootout attempts are dropped too. The coordinates are an image scale, not NHL feet, so I estimated the two nets from where goals actually clustered at each end of the rink and measured distance to the nearer one.
Expected goals is then just the season’s scoring rate in that distance bin and quality tag, shrunk toward the league rate so a bin with four shots doesn’t go to 0% or 100%. One fix matters: the raw tag says “Quality goal” on goals and “Quality on net” on saves. If we leave that in, the model already knows the result and the GSAx is wrong. I stripped the outcome and kept only quality vs non-quality.
GSAx is expected goals against minus goals allowed. Positive means the goalie allowed fewer than that location model expected on the shots they faced. GSAx per 100 shots is the rate version, so a 20-start goalie and a call-up aren’t compared only on totals.
This is NOT MoneyPuck. There’s no rush, rebound, screen, or pass quality in the public feed, and the coordinates are coarser than NHL tracking. One season of goalie data is still noisy even with a better model. Read it next to save percentage: a big gap is the interesting part, a one-goal gap is not.
Whether GSAx is better than GSAx/100 depends entirely on what you want to measure: total team impact or individual efficiency. Both are vital advanced metrics in hockey analytics used to evaluate goaltenders by comparing actual goals allowed against expected goals (xG) based on shot quality. GSAx is Heavily biased toward starters who play more games and for GSAx/100 Small sample sizes can heavily skew data (e.g., a backup after 2 games).
| Goalie |
GP |
Shots |
GA |
SV% |
xGA |
GSAx |
GSAx/100 |
| Michael DiPietro |
45 |
1203 |
86 |
0.929 |
127.3 |
+41.3 |
+3.44 |
| Carl Lindbom |
35 |
997 |
77 |
0.923 |
103.1 |
+26.1 |
+2.62 |
| Michal Postava |
25 |
634 |
41 |
0.935 |
63.8 |
+22.8 |
+3.59 |
| Sergei Murashov |
38 |
985 |
85 |
0.914 |
107.2 |
+22.2 |
+2.25 |
| Cayden Primeau |
39 |
1133 |
101 |
0.911 |
121.1 |
+20.1 |
+1.78 |
| Clay Stevenson |
36 |
1042 |
95 |
0.909 |
111.0 |
+16.0 |
+1.54 |
| Cooper Black |
42 |
1060 |
105 |
0.901 |
119.4 |
+14.4 |
+1.36 |
| Connor Ungar |
13 |
427 |
34 |
0.920 |
48.2 |
+14.2 |
+3.33 |
| Rémi Poirier |
52 |
1505 |
143 |
0.905 |
157.0 |
+14.0 |
+0.93 |
| Sebastian Cossa |
39 |
1057 |
94 |
0.911 |
106.8 |
+12.8 |
+1.21 |
| Jacob Fowler |
27 |
719 |
63 |
0.912 |
75.3 |
+12.3 |
+1.70 |
| Joel Blomqvist |
26 |
702 |
64 |
0.909 |
75.8 |
+11.8 |
+1.69 |
| Šimon Zajíček |
21 |
580 |
51 |
0.912 |
60.4 |
+9.4 |
+1.62 |
| Erik Portillo |
30 |
767 |
74 |
0.904 |
83.4 |
+9.4 |
+1.22 |
| Nikke Kokko |
34 |
1017 |
104 |
0.898 |
111.7 |
+7.7 |
+0.76 |
| Victor Östman |
36 |
1012 |
101 |
0.900 |
108.7 |
+7.7 |
+0.76 |
| Trent Miner |
32 |
834 |
83 |
0.900 |
90.3 |
+7.3 |
+0.87 |
| Leevi Meriläinen |
19 |
540 |
51 |
0.906 |
58.2 |
+7.2 |
+1.33 |
| Brandon Halverson |
43 |
1068 |
105 |
0.902 |
111.9 |
+6.9 |
+0.65 |
| Matt Tomkins |
42 |
1280 |
130 |
0.898 |
135.8 |
+5.8 |
+0.46 |
| Jiří Patera |
30 |
848 |
83 |
0.902 |
88.8 |
+5.8 |
+0.69 |
| Kirill Gerasimyuk |
19 |
419 |
46 |
0.890 |
49.7 |
+3.7 |
+0.88 |
| Ville Husso |
17 |
434 |
44 |
0.899 |
47.2 |
+3.2 |
+0.73 |
| Vadim Zherenko |
42 |
1204 |
124 |
0.897 |
126.5 |
+2.5 |
+0.21 |
| Mitch Gibson |
23 |
660 |
68 |
0.897 |
70.2 |
+2.2 |
+0.34 |
| Georgii Romanov |
27 |
782 |
85 |
0.891 |
86.8 |
+1.8 |
+0.23 |
| Gabriel Carriere |
31 |
776 |
86 |
0.889 |
87.4 |
+1.4 |
+0.18 |
| Owen Say |
19 |
486 |
55 |
0.887 |
56.1 |
+1.1 |
+0.24 |
| Thomas Milic |
41 |
1080 |
106 |
0.902 |
106.9 |
+0.9 |
+0.08 |
| Arsenii Sergeev |
29 |
893 |
96 |
0.892 |
96.8 |
+0.8 |
+0.09 |
| Ryan Fanti |
27 |
658 |
70 |
0.894 |
70.4 |
+0.4 |
+0.05 |
| Pheonix Copley |
33 |
865 |
89 |
0.897 |
89.1 |
+0.1 |
+0.01 |
| Devon Levi |
52 |
1489 |
149 |
0.900 |
148.7 |
-0.3 |
-0.02 |
| Laurent Brossoit |
28 |
852 |
89 |
0.896 |
88.4 |
-0.6 |
-0.07 |
| Amir Miftakhov |
28 |
778 |
88 |
0.887 |
87.1 |
-0.9 |
-0.11 |
| Artur Akhtyamov |
37 |
1077 |
107 |
0.901 |
105.8 |
-1.2 |
-0.11 |
| Dennis Hildeby |
23 |
619 |
66 |
0.893 |
64.4 |
-1.6 |
-0.25 |
| Marcus Högberg |
31 |
812 |
95 |
0.883 |
93.3 |
-1.7 |
-0.22 |
| Kaapo Kähkönen |
38 |
971 |
104 |
0.893 |
101.9 |
-2.1 |
-0.21 |
| Jakub Málek |
31 |
767 |
85 |
0.889 |
82.9 |
-2.1 |
-0.27 |
| Henrik Tikkanen |
29 |
702 |
76 |
0.892 |
73.5 |
-2.5 |
-0.35 |
| Nikita Tolopilo |
19 |
566 |
63 |
0.889 |
59.6 |
-3.4 |
-0.60 |
| Dylan Garand |
36 |
922 |
101 |
0.890 |
97.4 |
-3.6 |
-0.39 |
| Isak Posch |
28 |
717 |
81 |
0.887 |
77.3 |
-3.7 |
-0.52 |
| Stanislav Berezhnoy |
16 |
447 |
52 |
0.884 |
47.8 |
-4.2 |
-0.95 |
| Matthew Murray |
47 |
1345 |
137 |
0.898 |
132.7 |
-4.3 |
-0.32 |
| Domenic DiVincentiis |
34 |
916 |
101 |
0.890 |
96.2 |
-4.8 |
-0.53 |
| Calle Clang |
36 |
923 |
100 |
0.892 |
94.7 |
-5.3 |
-0.57 |
| Jakub Skarek |
20 |
541 |
64 |
0.882 |
58.7 |
-5.3 |
-0.99 |
| Aleksei Kolosov |
38 |
1067 |
119 |
0.888 |
113.5 |
-5.5 |
-0.52 |
| Jaxson Stauber |
36 |
976 |
115 |
0.882 |
109.2 |
-5.8 |
-0.59 |
| Matthew Villalta |
33 |
952 |
109 |
0.886 |
102.4 |
-6.6 |
-0.70 |
| Hunter Shepard |
19 |
553 |
66 |
0.881 |
59.3 |
-6.7 |
-1.22 |
| Magnus Chrona |
25 |
661 |
72 |
0.891 |
65.1 |
-6.9 |
-1.04 |
| Ivan Fedotov |
47 |
1151 |
136 |
0.882 |
128.9 |
-7.1 |
-0.62 |
| Zach Sawchenko |
29 |
689 |
86 |
0.875 |
78.5 |
-7.5 |
-1.08 |
| Ty Young |
17 |
476 |
57 |
0.880 |
49.0 |
-8.0 |
-1.68 |
| Ivan Prosvetov |
25 |
782 |
93 |
0.881 |
85.0 |
-8.0 |
-1.03 |
| Tomas Suchanek |
15 |
405 |
49 |
0.879 |
40.9 |
-8.1 |
-1.99 |
| Drew Commesso |
37 |
1085 |
115 |
0.894 |
106.7 |
-8.3 |
-0.77 |
| Nico Daws |
44 |
1096 |
126 |
0.885 |
117.4 |
-8.6 |
-0.79 |
| Arno Tiefensee |
20 |
551 |
66 |
0.880 |
56.7 |
-9.3 |
-1.69 |
| Cal Petersen |
33 |
814 |
90 |
0.889 |
80.6 |
-9.4 |
-1.15 |
| Garin Bjorklund |
17 |
469 |
61 |
0.870 |
50.8 |
-10.2 |
-2.18 |
| Samuel Hlavaj |
22 |
639 |
76 |
0.881 |
64.5 |
-11.5 |
-1.81 |
| Cameron Whitehead |
17 |
477 |
64 |
0.866 |
52.3 |
-11.7 |
-2.45 |
| Carson Bjarnason |
32 |
840 |
106 |
0.874 |
90.3 |
-15.7 |
-1.87 |
| Spencer Martin |
22 |
559 |
76 |
0.864 |
60.2 |
-15.8 |
-2.82 |
| Jesper Vikman |
18 |
468 |
66 |
0.859 |
49.3 |
-16.7 |
-3.56 |
| Mads Søgaard |
27 |
696 |
93 |
0.866 |
72.4 |
-20.6 |
-2.96 |