Tracking load with CTL, ATL, and form
May 24, 2026
Every workout produces a Training Stress Score (TSS). On the bike it comes from normalized power and a duration term, scaled so a one-hour effort at threshold equals 100. On the run I use rTSS off pace. Swim TSS is the least reliable; I estimate it off perceived exertion and duration since I don’t train with a force plate in the pool.
Three exponentially-weighted moving averages, applied to daily TSS, drive everything:
- CTL (Chronic Training Load): 42-day EWMA. Fitness.
- ATL (Acute Training Load): 7-day EWMA. Fatigue.
- TSB (Training Stress Balance): CTL minus ATL. Form.
The intuition: CTL rises slowly with consistent work and falls slowly with rest. ATL spikes after hard weeks and drops fast. TSB tells you whether you’re carrying fatigue (negative) or rested into form (positive).
My current numbers, May 24:
| Metric | Value |
|---|---|
| CTL | 78 |
| ATL | 92 |
| TSB | -14 |
A TSB of -14 is the productive end of overload. Most of the adaptation happens here. Below -30 and the risk-reward inverts: injury and illness probabilities rise faster than fitness. Above +15 and you’re racing fresh but losing top-end fitness day over day.
The number I actually plan against is the rate of CTL change, called ramp rate. Sustainable ramp is around 3-5 TSS/week. Push 7 and you’re probably going to lose a week to a cold or a tendon. I learned this the expensive way in January, ramping at 9/week for three consecutive weeks before a calf strain put me off running for ten days. The CTL I’d built fell from 71 to 62 in the layoff, which is the cruel arithmetic of overreaching: gains compound slowly, losses don’t.
Two things the model doesn’t capture. First, neuromuscular load. A heavy lifting session generates almost no TSS but trashes the legs for two days. I shadow-track it as a binary flag on my calendar. Second, sleep. A night of five hours is worth roughly 30 TSS of equivalent fatigue from my own correlations, but no platform builds that in. I subtract it manually before reading TSB.
The whole model is wrong in the box-and-Cox sense — but it’s wrong in consistent ways, which is what you want from a training metric.