Where the data comes from

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.

Important: We never store the original box score files. PDFs and HTML pages are downloaded, parsed for statistics, and discarded. Only the extracted numerical data is retained.

Data coverage

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 levelWhat it meansHow it shows
100%All matches parsed successfullyCoverage badge shows 100%
80-99%Most matches parsed, 1-3 gapsCoverage badge with count
50-79%Significant gaps in dataYellow warning on scouting report
<50%Limited data availableStats 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.

How each stat is calculated

Goals per Game
goals_scored / matches_parsed
Goals Against Average
goals_against_total / matches_parsed
Save Percentage
saves / (saves + goals_against)
Shooting Percentage
goals_scored / total_shots
APC Conversion Rate
goals_from_APCs / APCs_total
DPC Success Rate
goals_against_from_DPCs / DPCs_total
Goal differential
goals_scored - goals_against_total
Shot differential
shots_for_total - shots_against_total

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.

Penalty corner goal attribution

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.

How do we identify corner goals?

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.

What does "PC attribution reliable" mean?

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.

Note on PC stats: Attack penalty corner totals (how many PCs a team earned) and defensive penalty corner totals (how many PCs opponents earned) are available in nearly all box scores. The attribution question only affects "goals from penalty corners" โ€” i.e., which specific goals resulted from a PC setup.

How rankings work

Minimum matches 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.

Tie handling

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.

Sort direction

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

Conference rankings

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 withinconferences, against only conference opponents, are not calculated at this time.

Overtime and shootout handling

  • Overtime periods (OT, OT2) are included in all cumulative stats: goals, shots, saves, penalty corners, and period-by-period breakdowns.
  • Shootout results count toward wins and losses but shootout goals are not included in goals_scored or goals_against totals. This matches NCAA convention.
  • Per-attempt shootout data (who took each attempt, saves vs. misses) is not consistently available in box scores, so shootout conversion rates are not calculated.

What's not included

  • Exhibition games are excluded from all statistics.
  • Individual player stats are not tracked. Elite Stats focuses on team-level metrics.
  • Time-of-possession and passing stats are not available in standard box scores.
  • Historical seasons prior to the 2025 season are not covered by Elite Stats at this time.

Found something wrong?

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.

back to top