Every stat in Final Whistle's Elite Stats subscription is derived from official box scores published by university athletics departments. Final Whistle parses the HTML and ingests the data directly in our system.
Our scraper runs automatically after games are complete, typically within a few hours. We do not use any second-hand data providers, APIs, or manual data entry. Everything is machine-parsed directly from the source.
Not every box score is parseable. Some schools use non-standard formats, some box scores contain errors, and occasionally pages are unavailable. We track coverage at the team level and display it on each scouting report.
| Coverage level | What it means | How it shows |
|---|---|---|
| 100% | All matches parsed successfully | Coverage badge shows 100% |
| 80-99% | Most matches parsed, 1-3 gaps | Coverage badge with count |
| 50-79% | Significant gaps in data | Yellow warning on scouting report |
| <50% | Limited data available | Stats shown with strong caveat |
Per-game averages are always calculated using matches_parsed as the denominator, not total matches played. This means a team with 18 of 20 matches parsed shows accurate per-game averages for those 18 games, rather than artificially diluted numbers.
All per-match averages use the same denominator: the number of matches with successfully parsed box scores for that team. Period-by-period breakdowns (Q1-Q4, OT, OT2) are summed from the individual match data and include overtime periods when played.
On the head-to-head comparison page, the "Momentum" chart tracks which team was attacking more, period by period. It blends four stats into a single line: Goals For and APCs on the attacking side, Goals Against and DPCs on the defending side.
Goals alone are not a true reflection of attacking momentum. Blending goals with penalty corner volume gives a broader picture of the action, showing which team was generating and conceding pressure that period, not just which team happened to get lucky in front of the goal.
Each of the four stats is converted to a percentage of the highest value either team hit for that stat. That shared scale is what makes the two teams' lines directly comparable: if Team A's line sits higher than Team B's at some point, Team A genuinely generated more offense relative to the pressure on its own defense during that stretch — not just relative to its own average game.
The faint dots on the chart are the four individual stat values (Goals For, Attack PCs, Goals Against, Def PCs) feeding into that period's line position, shown at low opacity so the composite line stays the primary focus.
Every match begins scoreless, so both lines start at zero at the pass-back before curving toward each team's actual Q1 numbers — no team is assumed to have any advantage before the ball is in play.
Yes, when applicable — an OT column appears at the end of the chart only for matchups where at least one team actually played overtime minutes that season. It's scaled independently from Q1-Q4 (OT is a much shorter period, so including it in the main scale would flatten every other period's bars).
Determining which goals came from penalty corners is one of the trickiest parts of the data pipeline. Not all box scores explicitly tag "goal from penalty corner" — in many cases, we need to infer it from the scoring summary or play-by-play.
Our parser combs through play-by-play summaries, looking for penalty corners and goals. Because there's no objective way to define when a goal is a direct result of a penalty corner, Final Whistle attributes goals scored within 26 seconds of a penalty corner to be a result of the corner, assuming there are no substitutions or additional penalties indicating that a corner play was completed prior to the goal.
A team's PC conversion stats are marked as reliable when at least 75% of its parsed matches include PC goal attribution data. If fewer than 75% of the team's matches have penalty corner attribution data, the conversion rate is still calculated from the matches that do have it, but rankings may exclude teams below this threshold.
Teams must have at least 3 parsed matches to appear in national rankings. This prevents early-season outliers (a team that's played one game and scored 8 goals) from dominating the leaderboard.
When two or more teams have identical values for a metric, they receive the same rank with a "T-" prefix (e.g., "T-5"). The next rank is skipped — so if three teams tie at #5, the next team is ranked #8, not #6. This is standard dense ranking.
Most stats are ranked highest-first (goals per game, save %, PC conversion). A few are ranked lowest-first where lower is better: goals against average, defensive PCs conceded per match. The sort direction is chosen to match what coaches would consider "best."
When you filter by conference on the rankings page, the rank numbers do not change, though the displayed teams are limited to that conference. This is done on purpose, as rankings
goals_scored or goals_against totals. This matches NCAA convention.Box scores are messy. Occasionally a stat gets parsed incorrectly, a match gets missed, or a format change breaks our parser. If you spot a number that doesn't look right on a scouting report, use the "Report a data error" link on that team's page. We investigate every report and typically resolve issues within 24 hours.
Common issues we've seen: overtime goals attributed to the wrong period, penalty corner counts that don't match the PDF box score, and exhibition games accidentally included in season totals. Your reports help us catch these faster.