Features
Training load · ACWR
Spot who is overloaded before they get injured: from each session’s sRPE to ACWR, monotony and strain, with the maths in plain sight.
The base input is sRPE (Foster’s method): after training, the player gives their RPE from 1 to 10 and the minutes; sRPE = RPE × minutes. ACWR compares how much you loaded this week against your own average of the last month: ramp up too fast and it flags risk; load too little and it flags undertraining. It also includes a minutes × player view per match, to keep an eye on game time and squad rotation.
app.squadstats.dev/workload
Technical detail · ACWR, EWMA, monotony, strain and readiness
Rolling ACWR. acute = Σ sRPE 7 days / 7; chronic = Σ sRPE 28 days / 28; ACWR = acute / chronic. Zones (aligned with Gabbett):
| ACWR | Zone |
|---|---|
| < 0.8 | Undertrained |
| 0.8 – 1.3 | Optimal (sweet spot) |
| 1.3 – 1.5 | Caution |
| > 1.5 | Danger |
“Uncoupled” EWMA ACWR (Williams/Lazarus): weights recent days more heavily and corrects the coupling bias. EWMA(series, λ) = λ·today + (1−λ)·EWMA_yesterday, with λ_acute = 2/(7+1) = 0.25 and λ_chronic = 2/(28+1) ≈ 0.069. Both methods coexist.
Monotony and Strain (Foster), 7-day window: monotony = daily_mean / daily_sd; strain = weekly_load × monotony. Cut-offs — monotony: <1.5 low, 1.5–2.0 moderate, ≥2.0 high; strain: <4000 contained, 4000–6000 medium, ≥6000 elevated.
Readiness 0–100 (our own index): readiness = (wellness/5)×100 − [20 if ACWR>1.5 | 10 if >1.3 | 5 if <0.8] − 30 if active injury, clamped to [0,100]. Only calculated if there is wellness for today.
Honesty: rolling ACWR needs roughly 4 weeks of history before the chronic term is representative (the “running-in month problem”). It is a guide, not a diagnosis.
Try it with your real squad.
Tell us about your team and we’ll set up a demo with temporary access.