CTL, ATL And TSB: How Much Should You Trust The Performance Manager Chart?
Open intervals.icu, look at the Fitness chart, and you are looking at two exponentially weighted moving averages of your daily TSS. One has a time constant of 42 days. One has a time constant of 7. Subtract the second from the first and you get Training Stress Balance, the number a lot of self-coached riders now use to decide whether Saturday’s club 10 is going to hurt in the good way or the bad way.
Those two numbers, 42 and 7, are not measurements. Nobody put a rider in a lab, tracked their power for a year and found that adaptation decays with a 42-day half-life. They were picked because they produced curves that looked like what coaches already believed, and because in 2006 a spreadsheet with two hard-coded constants was easier to ship than a per-athlete fitting routine. Twenty years on, every major platform still ships them as the default, and most riders have never questioned the ctl atl tsb accuracy of a model that was calibrated by eye.
Here is what changes when you stop treating them as physics.
Where 42 and 7 actually came from
The underlying maths is Banister’s impulse-response model, published in 1975 in IEEE Transactions on Systems, Man and Cybernetics by Banister, Calvert, Savage and Bach. It says performance on any given day is a baseline plus a weighted fitness term minus a weighted fatigue term, where both terms are first-order exponential responses to the same training input:
p(t) = p0 + k1·Fitness(t) − k2·Fatigue(t)
Fitness(t) = Fitness(t−1)·e^(−1/τ1) + w(t)
Fatigue(t) = Fatigue(t−1)·e^(−1/τ2) + w(t)
Four free parameters: τ1, τ2, k1, k2. Banister’s own swimming and running data gave fitness time constants around 40 to 50 days and fatigue constants around 11 to 15, with k2 roughly twice k1. Critically, he fitted those values to each athlete’s performance tests. The model was a fitting framework, not a set of constants.
Andy Coggan’s Performance Manager Chart took the shape of that model and froze it. τ1 became 42, τ2 became 7, and k1 and k2 were both silently set to 1, which is the only way TSB = CTL − ATL makes sense as an equation. Coggan has never pretended otherwise: the constants were chosen by inspection because they produced a chart whose behaviour matched coaching practice at the time. It was a reasonable engineering call. It is not a physiological finding, and the TrainingPeaks and Strava implementations that inherited it have not revisited it since.
Note the second sleight of hand. Setting k1 = k2 = 1 is a much bigger assumption than the time constants. Every published fit of the Banister model I am aware of finds k2 > k1, usually by a factor of 1.5 to 3. If your true fatigue gain is twice your fitness gain, then real “form” is CTL − 2·ATL, which is negative essentially all the time. The number crossing zero has no meaning. Only its shape does.
Fitting the constants to one rider
Take a worked example. Call her a 38-year-old 10 and 25 mile TT rider, FTP 262 W, 19 months of intervals.icu data, and 19 usable performance points: TT results converted to 20-minute equivalents, plus clean 20-minute maximal efforts from testing blocks. Grid search τ1 and τ2, let k1 and k2 float, and validate with a rolling time-series split so you are not scoring the model on data it fitted.
Fitting Banister IR model to 19 performance points (2024-03 → 2025-08)
Grid: tau1 20..60, tau2 3..25, k1/k2 free, 5-fold rolling-origin CV
tau1 tau2 k1 k2 RMSE(W) CV-RMSE(W)
42 7 1.00 1.00 9.8 10.4 <- PMC default (fixed k)
38 12 0.94 1.71 4.6 6.1
33 11 1.02 1.86 3.4 5.2
31 11 1.00 1.91 3.1 5.0 <- best
29 14 1.11 2.30 3.0 6.8 (overfits: CV worsens)
Best model: tau1=31, tau2=11, k2/k1=1.91
Held-out 20-min power residual sd: 5.0 W
Her fitness decays faster than the default and her fatigue clears considerably slower. That combination is common in riders with a big aerobic base and a low tolerance for consecutive hard days, and the default chart gets both wrong in the same direction, which compounds.
What that does to a taper
Set both models running from CTL 85, ATL 110 (TSB −25, a normal end-of-build state) and feed them an identical ten-day taper at 50 TSS per day. Same training, two sets of constants, same-day TSB convention.
| Day | CTL 42/7 | ATL 42/7 | TSB 42/7 | CTL 31/11 | ATL 31/11 | TSB 31/11 |
|---|---|---|---|---|---|---|
| 1 | 84.2 | 102.0 | −17.8 | 83.9 | 104.8 | −20.9 |
| 3 | 82.6 | 89.1 | −6.5 | 81.8 | 95.7 | −13.9 |
| 5 | 81.1 | 79.3 | +1.7 | 79.8 | 88.1 | −8.3 |
| 7 | 79.6 | 72.0 | +7.6 | 77.9 | 81.8 | −3.8 |
| 9 | 78.3 | 66.6 | +11.7 | 76.2 | 76.5 | −0.3 |
| 10 | 77.6 | 64.4 | +13.2 | 75.4 | 74.2 | +1.2 |
(I have seeded both models at the same point to isolate the effect of the decay rates. In practice, refitting shifts your starting CTL and ATL too, usually by a few points.)
The default chart says she crossed into positive territory on day five and is at +13 by day ten, comfortably inside the “+5 to +25 race form” band that gets repeated on every forum. Her own constants say she only crossed zero on day nine. That is a four-day error on the one decision the chart exists to inform. Race off the default and she arrives at the start line with meaningfully more residual fatigue than the graph is showing her, then spends the winter concluding she “doesn’t respond to tapering.”
Run her real k2/k1 of 1.91 through the same day-ten numbers and the honest form figure is 75.4 − 1.91 × 74.2 = −66.3. Still negative, as it always will be. Which is the point: the sign of TSB is an artefact of an assumption, not a state of your body. Track its trajectory, ignore its zero crossing.
Which tools will actually let you change it
intervals.icu is the one that makes this easy. Settings, then your sport settings, and the CTL and ATL day counts are editable text boxes; it recalculates your whole history instantly, and it also lets you choose whether TSB uses today’s or yesterday’s values, which alone is worth a point or two during a taper. WKO5 exposes the constants too, and its modelled metrics go considerably further than a two-EWMA chart. Golden Cheetah will fit a Banister model for you against your performance tests, though the UI is not friendly. Xert sidesteps the argument entirely by running three strain decay rates rather than two.
Strava’s Fitness and Freshness is hard-coded at 42/7 with no way to change it, and it is fed by Relative Effort rather than TSS, so it is the least trustworthy of the lot. TrainingPeaks allows edits on paid tiers but buries them.
If you want the fitting done for you, an LLM with code execution handles this competently, provided you constrain it. Export your daily TSS and your performance points as CSV, then something like:
Attached: daily_load.csv (date, tss) and performances.csv (date, metric_w).
Fit a Banister impulse-response model. Grid search tau1 over 20-60 and
tau2 over 3-25, solve k1, k2 and p0 by least squares at each grid point.
Score with rolling-origin cross-validation, not in-sample RMSE.
Report the CV-RMSE surface, not just the argmin, and tell me how flat it
is. If the best model beats tau1=42, tau2=7, k1=k2=1 by less than the
residual sd, say so and recommend I keep the default.
That last paragraph matters more than the rest. Ask Claude or GPT for your personal constants without it and you will get four decimal places of spurious precision off twelve data points. Hellard and colleagues showed in 2006 that these parameter estimates are badly ill-conditioned: the error surface has long flat valleys, so τ1 = 31 and τ1 = 38 can fit almost identically well while implying different tapers. Fewer than about 15 well-spaced performance points and you are fitting noise. Models like Busso’s variable-dose-response, where k2 itself changes with training load, fit better still and are correspondingly easier to overfit. The same caution applies to the various modelled-FTP approaches covered in FTP estimation and fitness models: more parameters buys you a prettier fit to the past and not necessarily a better guess at Sunday.
The version of this chart worth keeping
Refit once a year, in the off-season, when you have a full season of races and tests to fit against. Write your τ1, τ2 and k2/k1 on a sticky note. Then use the chart the way it deserves to be used: CTL for whether your training volume is going up or down over months, ATL for whether the last fortnight was sane, and the rate of change of the gap between them for tapering. Never the absolute TSB number, never the +5 to +25 band, never “I need CTL of 100 before Nationals.”
Go and change the 42 to 31 in intervals.icu this evening and look at what happens to last year’s A-race.