Methodology
How WhoDatStats labels analytics, model outputs, reports, and stale-data warnings.
Status: Current schedule and derived nflfastR analytics refresh through Supabase ingestion runs when source files are available; the archived snapshot stays labeled and available as fallback.
Fan Mode keeps the plain-English takeaway first, but freshness and warning labels always stay visible.
EPA / adjusted EPA
EPA estimates how much a play changed expected points. Adjusted EPA is used when a view explicitly accounts for opponent or context; otherwise WhoDatStats labels the metric as plain EPA.
Analyst note: team EPA per play is measured over scrimmage plays — passes and runs, excluding kneels, spikes and every special-teams snap — and averaged with each game weighted by the snaps that unit took, defensive rates by defensive snaps. That is the same definition the league profiles behind the game plan use, so the figure on the homepage, the team dashboard and the matchup edges is one number rather than three. Opponent-adjusted claims are only made where the data source exposes adjusted rows.
Success rate
The share of plays that kept the offense on schedule by improving expected points.
Analyst note: success rate is paired with EPA so a boom-or-bust offense is not mistaken for consistent efficiency, and is measured over the same scrimmage plays EPA is. A punt is not an unsuccessful offensive play; it is not an offensive play.
CPOE, aDOT, YPRR, pressure rate
Player and unit metrics describe passing accuracy over expectation, target depth, receiving efficiency per route, and defensive disruption.
Analyst note: these are shown only when available in player or position-specific source rows; unavailable fields are omitted.
Win probability, playoff odds, projected wins
Probability outputs describe a model snapshot, not certainty. Historical outputs are labeled when the underlying season snapshot is archived.
Analyst note: bundled outlook files are reproducible release artifacts and should not be interpreted as live forecasts.
Player trends and matchup advantage
Trend cards compare recent available samples with prior samples. Matchup cards remain pending when verified opponent data is missing.
Analyst note: guards require enough game rows before trend language appears and prevent pending opponent comparisons from showing fabricated advantages.
Game plan edge scores
The game plan sets each Saints unit against the opponent unit across from it. Both are ranked against the other 31 teams first, so an edge means “this much better than them, relative to the league” rather than a raw difference. Positive favours New Orleans.
Analyst note: an edge is 100·tanh((z_saints − z_opponent)/2) over league-wide offensive and defensive profiles built from nflverse play-by-play, so two standard deviations of separation reads about 76 and the scale saturates rather than running away. “Sacked or hit” stands in for pressure, which needs a charting provider this project does not have. The single-game projection reuses the season outlook’s regressed EPA ratings and constants, so the two cannot disagree about who is favoured.
Model-generated reports
Reports surface published rows from the report pipeline. Pending report cards explain what will appear later without inventing report content.
Analyst note: current weekly status reports are deterministic templates generated from schedule, roster, depth chart, analytics, and news availability—not AI-generated claims.
nflfastR current-season pipeline
Current schedule comes from nflverse schedules, while EPA/play and success-rate aggregates come from nflfastR play-by-play batch ingestion after games are available.
Analyst note: WhoDatStats stores derived Supabase aggregates instead of raw full-season PBP for Netlify/Supabase safety. CPOE appears only when present in source rows; YPRR and pressure rate remain pending because route and pressure fields are not present in nflfastR PBP.
Ingestion health
Freshness labels read ingestion run metadata where available, including last attempts and successful refreshes. The data status page turns all of it into one view: which datasets are current, which are final season data, which are projections, and when each last moved.
Analyst note: failed jobs write ingestion_runs rows and leave prior good Supabase snapshots in place, so stale warnings remain visible instead of silently replacing data with empty responses. When the run log itself cannot be read, the status page says the refresh time is unknown rather than reporting the data as fresh or as failed.