Underdog metrics, explained

Underdog computes a set of session metrics that go beyond what's available in StatSports' Sonra Lite. This document explains each one — what it is, why it matters, and how it's calculated.

It's written for S&C coaches first, and dives into the methodology at the end for anyone who wants to see the maths.

If you spot anything that doesn't match how you'd interpret these in your own coaching, please tell us — these metrics are tuned for GAA contexts and your feedback shapes the thresholds.


The starting point: MSS

Underdog's individualised metrics all hinge on each athlete's Maximum Sprinting Speed (MSS). Without it, "high speed" and "sprinting" are just arbitrary cutoffs that ignore the player.

What MSS is

The fastest speed an athlete can repeatably reach. Not their one-time max from a perfect sprint with the wind behind them — their typical top end across recent sessions.

How Underdog calculates it

We take each session's maximum speed across the last 12 weeks, then take the 95th percentile of those per-session maxes. Three reasons we do it this way:

  1. It uses the peaks the athlete actually reached, not the average speed they ran at. Most session time is jogging or walking, so averaging across all speed samples would massively underestimate top capacity.
  2. The 95th percentile (rather than the literal max) ignores GPS spikes. A single 12 m/s glitch shouldn't define an athlete's MSS for the next three months.
  3. Twelve weeks is recent enough to reflect current condition but long enough to average out a poor week.

We also need at least 3 sessions in that window before we'll calculate MSS. With fewer than 3, we'll show "—" until enough data accumulates.

Manual override

If you've tested an athlete's max speed (30m sprint test, flying 20m, etc.) and want to use that value instead, you can manually set their MSS in their profile. Underdog will use the manual value and stop auto-calculating until you remove the override.

Why it matters in practice

A 6'4" midfielder with MSS 8.7 and a 5'8" wing-forward with MSS 9.4 are different athletes physiologically. Loading them with the same fixed thresholds — Sonra Lite's 5.5 m/s for HSR and 7 m/s for sprints — undercounts the wing-forward's exposure and overcounts the midfielder's. Individualised thresholds fix that.


HSR (Individualised) — high-speed running, calibrated to the player

What it is

The total distance run inside the high-speed band — at or above the HSR floor but below the sprint floor — in metres per session. By default that band is 60% up to 80% of the athlete's MSS (sprinting, ≥80%, is counted separately). Both floors are configurable per club in Settings → Speed thresholds.

Note (changed June 2026): HSR used to mean "≥80% of MSS" (one-sided, including sprint speeds). Validation on real squad data showed that 80% line actually sits in the sprint zone — almost no match distance is run that fast — so HSR was re-based to a bounded 60–80% band and sprinting dropped to ≥80%. Historical sessions were re-derived to match.

Why it differs from Sonra Lite's HSR

Sonra Lite uses a fixed threshold of 5.5 m/s for everyone. For an athlete with MSS 9.5, 5.5 m/s is only 58% of their maximum — below the 60% HSR floor, so it would barely register as high-speed. The default-threshold count overstates their HSR exposure.

Conversely, an athlete with MSS 7.0 has a 5.5 m/s threshold that's 79% of their max — near the top of the HSR band, so the default fixed cutoff captures only their hardest running.

What good and bad look like

For a typical training session in season:

  • Less than 100m — light session, recovery or technical
  • 100–250m — moderate physical demand
  • 250–500m — high physical demand, post-match or pre-match
  • Above 500m — very high; for a single training session this is unusual and worth checking

Match values vary widely by position and game flow — typical range is 400m–900m for a full match.

What to do with it

Compare to the default-threshold HSR side by side. A big gap between them tells you the player has high top-end speed; their session was more cruise-controlled than the StatSports default suggests. A small gap tells you they're running closer to their limits more of the time.

Track week to week. Sudden jumps relative to chronic load are an injury warning — particularly hamstring strains, which are strongly correlated with HSR exposure spikes.


Sprints (Individualised) — near-maximal effort, calibrated to the player

What it is

The number of distinct sprint events where the athlete crossed the sprint floor — by default 80% of their MSS — lasting at least one second. The floor is configurable per club in Settings → Speed thresholds.

Why 80%?

A "sprint" in applied GAA practice is generally categorised as ~80% of MSS and above, with a 90–95% sub-maximal band and ≥95% reserved for true maximal sprinting. The default sprint floor is therefore 80% of MSS (it was 90% before June 2026; a coach review and validation on real data brought it down). Sonra Lite's 7 m/s default is a fixed cutoff that approximates this only for mid-range athletes and skews for faster or slower players.

What good and bad look like

A single sprint count out of context isn't very meaningful — depends entirely on session type:

  • 0–5 sprints — recovery session, technical session, or a session where this player wasn't loaded
  • 5–15 sprints — typical training session with some sprint work
  • 15–25 sprints — sprint-focused conditioning or small-sided games
  • 25+ sprints — match-equivalent or hard conditioning block

The pattern across weeks matters more than any single number.

What to do with it

Compare to RHIE bouts (next metric). 20 sprints with 0 RHIE bouts is very different from 20 sprints in 4 RHIE bouts — same total, different physiological demand.

Sprint distance — how far the sprinting actually was

Alongside the sprint count, the session grid shows sprint distance (individualised): the total metres run at or above the same sprint floor. The count tells you how many near-maximal efforts there were; the distance tells you how far they covered. Two players with 10 sprints each can differ widely — short repeated accelerations vs longer sustained sprints — and the distance separates them. Treat it as the metre counterpart to the count, not a new threshold.


RHIE Bouts — clusters of repeated efforts

What it is

A Repeated High-Intensity Effort (RHIE) bout is a sequence of 3 or more sprints with less than 21 seconds of recovery between each. We count the number of bouts per session, plus the total number of efforts that fell inside any bout.

Why this exists

Field invasion sports — Gaelic football, hurling, soccer, rugby — are characterised by burst-recover-burst patterns rather than continuous running. The ability to repeat high-intensity efforts with short recovery is what predicts late-game fatigue resistance.

Two players might have identical sprint counts. Player A spread their 20 sprints across 80 minutes with 4-minute recovery between each. Player B did 20 sprints in 4 bouts of 5 sprints each, with 15 seconds between sprints. Same volume, very different demand. RHIE captures that difference; sprint count alone doesn't.

Where the 21-second figure comes from

The 21-second cap comes from Spencer et al. (2004) — a time–motion analysis of elite field hockey that defined a repeated-sprint sequence as three or more sprints with a mean recovery of under 21 seconds between them (PubMed). The interval matches the typical observed gap between consecutive efforts during high-intensity passages of play — closer-spaced efforts represent genuine "repeated" demands; further-spaced efforts represent recovery and aren't part of the same physiological challenge.

What good and bad look like

For a session:

  • 0 bouts — no clustered high-intensity work; either a quiet session or all the sprints were spaced out
  • 1–3 bouts — typical for moderate training
  • 4–8 bouts — match-equivalent or focused conditioning block
  • 8+ bouts — very high RHIE demand; unusual outside actual matches

For a match, RHIE counts vary heavily by position. Half-forwards and half-backs typically accumulate more RHIE than corner-backs or full-forwards.

What to do with it

Use it as a fatigue proxy. Players with low RHIE capacity drop off sharply in the second half of matches. If a player's RHIE bouts in matches are declining over a 4-week period despite consistent sprint counts, they may be carrying fatigue.

Use it to validate session design. If you intended to programme repeated-effort work and the RHIE count is 0 across the squad, your activity structure didn't deliver what you planned.


HRR60 — heart-rate recovery, post-effort

What it is

The average drop in heart rate (in bpm) over the 60 seconds following each high-intensity effort. We measure it after every individualised sprint and report the mean.

Why it matters

HRR60 is one of the most validated cardiovascular fitness markers in the literature. After an effort, HR is elevated; how fast it drops back down is a function of cardiac efficiency and current fatigue state. Fitter, fresher athletes drop faster.

Why this is genuinely useful longitudinally

A single session's HRR60 is noisy — depends on what came after each sprint, ambient temperature, etc. The longitudinal trend is where it earns its keep. A declining HRR60 over a 4-week block — even when a player's session performance metrics look the same — is an early signal of accumulated fatigue, illness coming on, or under-recovery.

This shows up in the data before it shows up in performance. That's the kind of finding that helps you intervene earlier with rest, nutrition, or screening.

What good and bad look like

These are rough indicative ranges; the absolute number matters less than the trend for an individual:

  • 30+ bpm drop — well-conditioned, fresh
  • 20–30 bpm — typical
  • 10–20 bpm — fatigued, under-recovered, or warming up still
  • Under 10 bpm — significantly under-recovered or unwell

What to do with it

Track the per-athlete trend across 4–8 weeks. Look for sustained declines of >5 bpm in their typical HRR60. That's worth a wellness check-in.

Don't overweight a single low value. Hot weather, heavy meal, dehydration, or simply standing still after a sprint (vs walking) all skew an individual session.

A note on synthetic data

If you're seeing negative HRR60 values in your demo data right now, that's a known limitation of the synthetic data generator — its heart-rate model doesn't have the post-effort drop dynamics of real physiology. Real data produces realistic positive values.


Speed percentiles (P95 and P99)

What they are

  • P95: the speed below which 95% of session seconds occurred — the top of what the athlete sustained for any meaningful duration
  • P99: the speed below which 99% of session seconds occurred — the speed they spent only a tiny fraction of the session above

Why two numbers, not one max?

Maximum speed is one moment. The athlete hit it once. It's noisy and influenced by GPS quality.

Percentiles describe the shape of the speed distribution rather than just the peak:

  • A small gap between P95 and P99 (e.g. 5.2 → 5.5) means the athlete had a few brief peaks and then plateaued; their top-end was tightly concentrated.
  • A wide gap (e.g. 4.5 → 7.2) means the athlete had sustained periods near the top of their range, with occasional bursts even higher.

Two athletes with identical max speeds but different P95s are doing very different things — one peaked once, the other could cruise near the top.

What to do with them

Use P95 as a more stable proxy for top-end speed than the single max. When comparing across weeks, a max speed dropping from 8.4 to 8.1 might be noise. A P95 dropping from 6.8 to 5.9 is meaningful and worth investigating.

Use the P99-minus-P95 gap to interpret session shape. Wide gaps suggest interval-style work; narrow gaps suggest steady-state running with isolated peaks.


High-speed work-rate — the Speed Endurance lens

What it is

Individualised HSR metres (the 60–80%-of-MSS band by default) per active minute, across the 12-week window. Where Max Sprint Speed asks "how fast is the ceiling?", work-rate asks "how much fast running do they actually sustain?" — normalised for how long they were on the pitch, so a 70-minute match and a 25-minute cameo are comparable.

Why a rate, and not "P95 as a % of MSS"

We tried defining speed-endurance as the median session P95 expressed as a percentage of the athlete's MSS. On real data it didn't work: because most of a session is standing and jogging, whole-session P95 lands around 4 m/s for nearly everyone — about 49% of MSS, in a band only ~3 points wide — and it came out strongly (inversely) correlated with MSS. In other words it mostly just re-drew the ceiling, told you nothing new, and couldn't separate one athlete from another.

High-speed work-rate fixes both problems: it spreads athletes out widely and it's independent of top-end speed — a genuinely separate quality. A fast player can have a low work-rate (a "burner"), and a player with a modest ceiling can have a high one (an "engine").

The ceiling-vs-work-rate map (squad view)

The squad Speed Endurance view plots every athlete by top speed (→) and work-rate (↑), split at the squad medians into four archetypes a coach trains differently:

  • Complete — high ceiling and high work-rate.
  • Engines — modest ceiling, high work-rate: the workhorses.
  • Burners — high ceiling, low work-rate: fast, but little sustained fast running — a conditioning target.
  • Develop — low on both.

What good and bad look like

Work-rate is heavily role-driven, so read it within a position group (the view has a position / Middle-Third filter for exactly this). A midfielder will sit well above a corner-back by the nature of the job. The useful signals are the archetype (relative to peers) and the trend — the second-half-of-window vs first-half delta on the leaderboard.

What to do with it

Pair it with the ceiling. A burner (fast, low work-rate) and an engine (high work-rate, modest ceiling) need opposite emphases. The scatter makes that an at-a-glance read across the panel.

Watch the trend, filtered by line. A forward whose work-rate is climbing while peers are flat is responding to conditioning; a sustained drop is worth a load/wellness check.


Session highlights

The Session Highlights view is a different beast. Rather than a single number per metric, it's a list of automatically-extracted moments from the session. The system reads through the minute-by-minute data and surfaces what's worth attention.

Highlight types

  • Peak intensity — the single minute with the most distance covered
  • Peak speed — when they hit their session-max speed
  • Peak HR — when their cardiac load topped out
  • Repeated efforts (RHIE bout) — clusters of 3+ sprints with short recovery
  • Sustained effort — the 5-minute window with the most cumulative HSR
  • Low activity — 3+ contiguous minutes well below session average; likely a break, stoppage, or halftime
  • Second-half drop-off — if HSR dropped >15% in the second half compared to the first
  • Tapered finish / Finished hard — whether the last 5 minutes were a cool-down or maintained intensity

How to read them

Highlights are listed in chronological order, so reading top-to-bottom gives you a timeline of the session. Each row tells you when, how big, and what kind. No interpretation required — the system has already done it.

The intent isn't to replace looking at the speed/HR chart underneath; it's to skip straight to the moments worth attention so you can spot-check the chart only where it matters.


ACWR — acute:chronic workload ratio

What it is

ACWR compares what an athlete has done recently (their acute load) against what they're conditioned for (their chronic base). A ratio near 1.0 means recent work matches the base; well above 1.0 means load is spiking faster than the base can absorb — the classic injury-risk window.

Both limbs are exponentially weighted moving averages (EWMA, Williams et al. 2017) over a per-athlete daily load series (rest days count as zero): the acute limb decays fast (λ ≈ 0.25, 7-day time constant), the chronic limb slow (λ ≈ 0.069, ~28-day). Recent days count for more and older days fade out smoothly, rather than a hard 7-/28-day cut-off. EWMA replaced a rolling average because on an intermittent (twice-a-week) amateur schedule the rolling window threw false spikes on light weeks; EWMA de-noises them.

The bands

Because high-speed running is burstier than overall running, the bands are stream-aware — HSR is allowed to run a little hotter before it flags:

Band Distance / mechanical High-speed running
Under base (low) < 0.80 < 0.80
On base (sweet spot) 0.80–1.15 0.80–1.25
Caution 1.15–1.30 1.25–1.40
High ≥ 1.30 ≥ 1.40

These are v1 EWMA thresholds, coach-validated on real GAA load (~63 weeks, June–July 2026) and due a review after a full block — see docs/acwr-ewma-shadow.md. They live in one place (f_acwr_band) so the squad heatmap and the concern sparklines always agree.

What to do with it

Read a row of the load heatmap left to right to see how an athlete arrived at today's band. A single High week isn't a verdict — look at whether it's a one-off spike or a sustained climb, and whether it lands the week before a match (tapering) or the week after (accumulating). Sustained Under base matters too: it can mean a player is detraining or quietly carrying a niggle.


Methodology summary (for the technically curious)

Metric Formula Threshold
MSS 95th percentile of per-session maxes, last 12 weeks requires ≥3 sessions
HSR (individualised) Σ speed where HSR floor ≤ speed < sprint floor, in metres 60%–80% of MSS (band; per-org configurable)
Sprints (individualised) Count of contiguous runs where speed ≥ sprint floor, lasting ≥1s 80% of MSS (per-org configurable)
Sprint distance (individualised) Σ metres in those sprint runs (speed ≥ sprint floor) 80% of MSS (per-org configurable)
RHIE bout Sequence of ≥3 sprints with <21s recovery between consecutive efforts 21s recovery cap
HRR60 mean(HR_at_sprint_end − HR_at_sprint_end+60s) across sprints in session per individual sprint
Speed P95, P99 Continuous percentile across all 1Hz speed samples session-scoped
High-speed work-rate Σ hsr_individualised_m ÷ Σ active minutes, over the 12-week window per athlete; the Speed Endurance lens

All metrics are computed per session and stored in session_derived_metrics and session_minute_buckets. Derivation runs after each session ingest and is idempotent — recomputing a session updates the existing row.

Single source of truth: session_efforts

Sprints, HSR runs and RHIE bouts all come from the same underlying step: scanning the 1 Hz speed trace for contiguous runs at or above a threshold (a missing second ends a run). That detection used to be duplicated inside every function that needed it. It now lives in exactly one place.

session_efforts holds one row per detected run — a sprint or an HSR run, under both the default (fixed 5.5/7.0 m/s) and the individualised (0.80/0.90 × MSS) thresholds. Each row records the run's start/end (both as session offsets and absolute wall-clock), duration, distance, peak/mean/entry/exit speed, recovery since the previous effort, heart rate at start/end and 60 s later, entry acceleration / exit deceleration, and — for individualised sprints inside a qualifying bout — its RHIE bout id. It's written by f_compute_session_efforts immediately after a session's timeseries lands, on the same idempotent recompute basis as everything else.

A note on acceleration / deceleration. entry_accel_mps2 / exit_decel_mps2 (and their peak-over-3s variants) are derived from the 1 Hz speed trace — change in speed across one second. They're useful as relative indicators (did the athlete enter this run explosively, brake hard out of it, vs their own norm), but they are not the high-frequency accel/decel StatSports computes. StatSports' own full-resolution accel/decel counts live at session level on session_summaries.accelerations / decelerations. NULL when the neighbouring second is missing (run at a session edge, or a gap in the trace).

The aggregate tables are then read-throughs, not re-derivations:

  • session_derived_metrics takes sprints_individualised, hsr_individualised_m, rhie_bouts and rhie_total_efforts straight from session_efforts.
  • session_minute_buckets takes per-minute sprint counts and the rhie_active flag from it.
  • session_phases takes per-phase RHIE bout counts from it.

What deliberately stays computed from the raw timeseries are the per-second quantities — total and HSR distance, seconds-above-threshold, and the speed/heart-rate aggregates — because those are second-by-second attributions, not properties of a run (a run that straddles a minute boundary can't be split cleanly from its effort row). The same applies to the speed percentiles, which don't depend on run detection at all.

The practical payoff: the sprint count on the dashboard, the RHIE bouts in a match phase, and the individual runs a future video tool will seek to are guaranteed to agree, because they're the same rows — and the detection rule only has to be correct, and tuned, in one function.

Threshold sources

  • HSR as a band below the sprint floor, and sprinting from ~80% of MSS: individualised-velocity-threshold work (Buchheit & Mendez-Villanueva, J Sports Sci) plus applied GAA practice, where sprinting is generally ~80%+ of MSS with a 90–95% sub-maximal band and ≥95% as true maximal sprinting
  • 21s recovery cap for RHIE: Spencer et al. (2004), Time–motion analysis of elite field hockey, with special reference to repeated-sprint activity, J Sports Sci 22(9):843–850 (PubMed) — defines a repeated-sprint sequence as ≥3 sprints with mean recovery <21 s in field-invasion sports

The defaults (HSR 60–80%, sprint ≥80% of MSS) were set after validating against real squad data and a coach review. They are adjustable per organisation in Settings → Speed thresholds (admin-only); changing them re-defines these metrics for new sessions, and re-deriving historical sessions is a separate backfill step.


Feedback

These metrics are early. The thresholds are based on published research but haven't been calibrated against any specific squad's data yet. If something doesn't match how you'd interpret a session — too sensitive, not sensitive enough, missing a pattern you'd flag — please tell us.

The goal is "what an experienced S&C coach would highlight, computed automatically." That requires real coach judgement to refine.