About
Blog
Demos
Book Diary

The Performance Management Chart for Cycling

2026-08-16

I’ve had a power meter on my bike for a while now, and power-derived metrics turn up in every ride summary: NP, IF, and TSS. I had a rough sense of what each metric meant — NP is power normalised to account for variability, IF is how intense the ride was relative to my FTP, and TSS is how big the ride was. But I couldn’t have said how any of them were actually calculated.

None of it turns out to be difficult. What makes it interesting is that the metrics form a stack, each one defined in terms of the one before it, starting from the raw power recording. Following that stack all the way down also led me somewhere I hadn’t expected. It ends at the Performance Management Chart. I’d seen that chart before without fully appreciating how it worked or what it was trying to convey, and it’s what all of the other metrics exist to produce.

This post works through the stack from top to bottom.

The Pipeline

Everything starts with the raw power recording from the power meter and ends with a chart. Each step is a straightforward transformation of the step before it. The rest of this post walks down the pipeline one box at a time, so there’s no need to make sense of it all at once:

A flow diagram. Power, sampled once per second,
becomes NP via a 30 second rolling average, 4th power, mean and 4th root. NP
divided by FTP gives IF. 100 times hours times IF squared gives TSS, one value
per ride. TSS summed per calendar day gives daily TSS, which feeds two
exponentially weighted moving averages: CTL with a 42 day time constant
(fitness) and ATL with a 7 day time constant (fatigue). CTL minus ATL gives TSB
(form). CTL, ATL and TSB plotted against time form the Performance Management
Chart.

Normalized Power

Average power is a poor measure of how hard a ride was. An hour spent alternating between soft-pedalling and sprinting is far more taxing than an hour held at a constant power, even when both average out to the same number.

Normalized Power (NP) is an attempt to correct for this. It estimates the constant power that would have cost the same physiologically as the variable ride you actually did.

The algorithm operates on power sampled once per second and has four steps1:

  1. Take a 30 second rolling average of the power series.
  2. Raise each of those rolling average values to the 4th power.
  3. Take the mean of the result.
  4. Take the 4th root of that mean.

Writing the 30 second rolling average ending at second i as P30,i, and the number of such values as n:

NP= 1n i=1n P30,i4 4

The algorithm involves two arbitrary-looking constants, and both have a physiological justification:

  • The 30 second window approximates how quickly the body responds to a change in workload. Oxygen uptake doesn’t step instantly to a new level when you push harder, so a 5 second surge isn’t experienced as a 5 second step change in cost.

  • The 4th power is there because blood lactate, along with several other markers of physiological stress, rises roughly as the fourth power of intensity. This is the term that lifts NP above average power whenever the effort is variable.

Why NP exceeds average power

Consider a ride that alternates between one minute at 100 W and one minute at 300 W. The average power is 200 W. Setting the smoothing step aside for a moment, the 4th power steps give:

12·1004 + 12·3004 4 253W

The 30 second rolling average blunts swings on this timescale, so the real figure lands somewhat below 253 W, but still well above the 200 W average.

For a perfectly steady ride, NP and average power are equal. The ratio between them is called the Variability Index, and it’s a reasonable measure of how punchy a ride was. A well paced time trial sits close to 1.0, whereas a criterium can be 1.3 or higher.

Things that trip up the calculation

  • The sampling rate matters. The algorithm assumes power sampled once per second. Head units using “smart recording” store samples irregularly, and feeding those in directly gives a different (and generally lower) answer. The data has to be resampled to one sample per second first.

  • Zeros count. Time spent coasting at 0 W stays in the series and is included in the rolling average. Whether elapsed time or moving time is used changes the answer, which is one reason two apps can disagree about the NP of the same ride.

  • Short efforts are meaningless. NP isn’t considered valid for efforts below about 20 minutes.

Intensity Factor

Intensity Factor (IF) is the simplest metric in the stack1:

IF=NPFTP

FTP is Functional Threshold Power, roughly the highest power that could theoretically be sustained for 40 to 60 minutes. IF is therefore dimensionless, and riding at exactly FTP produces an IF of 1.0 by construction.

It captures how hard a ride was, regardless of how long it lasted:

IF Ride type
< 0.75 Recovery rides
0.75 - 0.85 Endurance-paced rides
0.85 - 0.95 Tempo rides; interval sessions; road races over 2.5 hours
0.95 - 1.05 Road races under 2.5 hours; criteriums; 40 km time trials
1.05 - 1.15 Short time trials, around 15 km
> 1.15 Prologue time trials; track pursuit

Interval sessions land lower in the table than their name suggests. A threshold session comes out at around 0.85 to 0.90 as a whole ride, rather than up at threshold itself, because the warm-up, the recoveries between efforts and the cool-down make up most of the elapsed time. Only a sustained racing effort pushes an entire ride above 0.95. The work periods in isolation would score higher, but that’s a number describing a fraction of a session rather than a whole ride.

Training Stress Score

Training Stress Score (TSS) combines intensity with duration to give a single number per ride. It’s scaled so that one hour ridden at FTP scores exactly 1001:

TSS= t·NP·IF FTP·3600 ·100

where t is the duration of the ride in seconds. That’s how it’s usually presented, but substituting NP=IF·FTP collapses it into something much easier to reason about:

TSS=100·h·IF2

where h is the duration of the ride in hours.

TSS is just hours multiplied by intensity squared. Some examples:

Ride IF Hours TSS
Recovery spin 0.60 1.0 36
Endurance ride 0.80 3.0 192
Long endurance ride 0.75 5.0 281
Threshold session 0.88 1.5 116
One hour at exactly FTP 1.00 1.0 100

Duration enters linearly but intensity is squared, which sounds like it should favour intensity, but in practice duration wins easily. The five hour endurance ride scores more than twice the threshold session, despite being much easier throughout.

This is also the metric’s biggest blind spot. Once a ride has been reduced to a TSS, the shape of it is gone. A hundred TSS accumulated in zone 2 and a hundred TSS accumulated at threshold are the same number, and everything further down the pipeline treats them identically, even though they adapt the body in quite different ways.

Fitness, Fatigue and Form

The whole scheme rests on the idea that a hard ride does two things at once. It makes you fitter, and it makes you tired. The important part is that the tiredness fades much faster than the fitness does. Rest for a week and most of the tiredness has gone while nearly all of the fitness remains.

Capturing that requires tracking two quantities rather than one, differing only in how quickly each responds. Daily TSS totals on their own are far too noisy to steer training by, so both are built by smoothing them into exponentially weighted moving averages2 3:

  • CTL (Chronic Training Load) uses a 42 day time constant. It responds slowly, and is interpreted as fitness.

  • ATL (Acute Training Load) uses a 7 day time constant. It responds quickly, and is interpreted as fatigue.

Both are computed with the same recurrence, applied once per day. Writing xd for the value on day d:

xd= xd1 + (TSSdxd1) (1e1/τ)

where the time constant τ is 42 for CTL and 7 for ATL. Days without a ride count as a TSS of zero, which is why both decay when training stops.

Both are in units of TSS per day, which takes some getting used to. A CTL of 60 roughly means “you have been averaging 60 TSS per day recently, weighted towards the more recent past”.

The third quantity is the difference between them:

TSB=CTLATL

TSB (Training Stress Balance) is interpreted as form. It’s conventionally computed from the previous day’s CTL and ATL, so that today’s ride doesn’t affect today’s form. The usual interpretation:

  • Below -30: heavily overloaded. Short excursions here are normal, and are often the deliberate point of a hard block or a training camp. Staying here is how people injure themselves or get ill.
  • -30 to -10: in the middle of a training block. Fatigued, but adapting. This is where most of a build is spent.
  • -10 to +5: maintaining. Training is roughly matching what’s being recovered from.
  • +5 to +25: rested and ready. This is what you’d aim for on event day, such as a gran fondo.
  • Above +25: detrained, if sustained. Fitness is being lost.

Those boundaries are conventions rather than measurements, and different sources place them differently. They also can’t be compared between people: a TSB of -20 doesn’t mean the same thing for two riders with different CTLs, because the same absolute number represents a much larger disturbance to someone training lightly than to someone training a lot.

The Performance Management Chart

The Performance Management Chart (PMC) is CTL, ATL and TSB plotted against time3 4. There’s nothing more to it than that. It is the pipeline’s output, and it’s where all of the preceding metrics are actually meant to be read. This is my own riding for the last six months:

Three stacked panels sharing a time axis from February
to August 2026. The top panel shows daily TSS as bars, mostly between 50 and
300, with two reaching about 440 and a sparse stretch through June. The middle
panel shows CTL and ATL in TSS per day: CTL rises from about 55 in early March
to a peak near 86 in early May, falls to about 40 by mid July, then recovers to
just under 50. ATL swings between about 5 and 146 around it. The bottom panel
shows TSB, which drops to -70 at the end of March, sits above +25 for much of
June, and returns to around zero by August. Dashed vertical lines mark the
Bobbin Head Classic in late March and the Mudgee Classic in early May.

The two gran fondos I rode are marked, and I rode them in very different states. I arrived at the Bobbin Head Classic on a TSB of -34, well into the heavily overloaded band, largely because I’d ridden 300 TSS the previous day. I had a thoroughly bad time. The event itself scored 436, ATL spiked to 146, and TSB bottomed out at -70 the following morning, the lowest point on the chart by some margin.

The Mudgee Classic five weeks later was the reverse. Four days off beforehand pulled ATL down while CTL barely moved, which is what a taper is supposed to do, and I started on a TSB of +6. I felt strong for most of it. I did get dropped in the end, but I’d been holding on in a group that was stronger than I thought I could ride with, so I counted it as a win. The two rides scored 436 and 419, so as training stress they were nearly identical. The difference between them is entirely in the state I turned up in, which is what the chart is tracking.

Where It Came From

The two-exponential structure long predates power meters. It’s the impulse-response model proposed by Eric Banister in 1975, which treats each training session as an impulse producing a positive fitness effect and a negative fatigue effect, each decaying exponentially at its own rate, with performance being the difference between them. Banister measured training load using heart rate, in units he called TRIMP (Training Impulse).

Andrew Coggan adapted the model to power meter data, introducing TSS in 2003 and, with a group of beta testers, building the Performance Manager chart that shipped in WKO+2 4. He and Hunter Allen popularised the whole framework in Training and Racing with a Power Meter in 2006.

Who Owns the Names

There’s a complication if you go looking for these metrics in software other than TrainingPeaks. Six names are registered US trademarks owned by TrainingPeaks LLC: Training Stress Score and TSS, Normalized Power and NP, Intensity Factor and IF5.

Nothing else in the pipeline is registered: TrainingPeaks holds no mark on CTL, ATL, TSB or FTP, and none on “Performance Management Chart” or “PMC”.

A trademark covers a name used in connection with particular goods and services. It says nothing about the mathematics behind the name. The algorithms were published in the 2006 book and no patent covers them, so anyone is free to compute the numbers. What you can’t do is distribute software that labels the output TSS.

Software either licenses the names or invents its own. Garmin’s device manuals carry a trademark notice for all three metrics6, and since Garmin bought TrainingPeaks in July 20267 it licenses the marks from itself. Hammerhead writes Normalized Power™, Intensity Factor® and Training Stress Score® in its list of data fields8, and TrainerRoad says it uses the terms with permission9. Strava has its own names for all of it: Weighted Average Power, Training Load, and Fitness, Fatigue and Form for the three curves10. Those aren’t just renames. Strava doesn’t publish its algorithms, and the figures it reports for a ride don’t match TrainingPeaks’11.


Github
LinkedIn
© Peter Stace 2015-2026