Endurance Debrief / Guides / How to Calculate TSS

How to Calculate TSS (Training Stress Score)

Guide 3 min read Formula & example

Short answer: TSS compresses the duration and intensity of a session into one number – exactly one hour at your threshold power is defined as TSS 100. Everything else scales from there.

Training Stress Score (TSS) was developed by Dr. Andrew Coggan and has become the standard way to quantify how much a single session cost your body – whether that's 40 hard minutes or three easy hours. It's also the raw input for the fitness curve (CTL/ATL/TSB) that tracks your form over weeks.

The formula: power-based TSS

With a power meter, TSS is most accurate because it's built on Normalized Power (NP) rather than a plain average – NP weights harder efforts more heavily, because they cost the body disproportionately more. It's calculated from a 30-second rolling average of power, raised to the fourth power, averaged, then taken back to the fourth root.

IF  = NP / FTP
TSS = (duration_seconds × NP × IF) / (FTP × 3600) × 100

Worked example: 1h 20min (4800s) at NP 220W, FTP 250W → IF = 220/250 = 0.88. TSS = (4800 × 220 × 0.88) / (250 × 3600) × 100 ≈ 103. A brisk sweet-spot session, just over an hour at threshold.

No power meter: hrTSS via heart rate

No power meter? hrTSS takes over – zone-based on your lactate threshold heart rate (LTHR). Each zone earns a fixed TSS credit per hour (roughly: Z1 ≈ 30, Z2 ≈ 55, Z3 ≈ 70, Z4 ≈ 90, Z5 ≈ 110), summed proportionally to time spent in each zone. Don't know your LTHR? A rough estimate from max heart rate works too (LTHR ≈ 0.9 × HRmax) – less precise, but better than no number at all.

Running: rTSS via pace

For running, pace replaces power. The intensity factor is your threshold pace divided by your actual pace, and rTSS squares that factor:

IF_run = threshold pace / actual pace
rTSS = (duration_seconds × IF_run²) / 3600 × 100

No threshold pace set? It falls back to the hrTSS path. One thing worth watching for: the method should always stay visible, because a power-based TSS 98 and an hrTSS 98 carry different confidence – good analysis tools label which one you're looking at.

No data at all? The RPE estimate

For sessions with no recording (a trainer ride with no sensor, a spontaneous run), there's the pragmatic Foster approximation: duration in hours times perceived effort (RPE, 1–10) squared. One hour at RPE 5 comes out to roughly 25 TSS – rough, but enough to keep your fitness curve from having a gap.

Why TSS is more than a single number

The real value shows up once TSS accumulates over time: CTL (42-day average, "fitness"), ATL (7-day average, "fatigue") and TSB (CTL − ATL, "form") together make up the performance management chart that TrainingPeaks and similar tools are built around. Any single session is just one data point in that curve.

Endurance Debrief

You don't have to work any of this out by hand. Import your .fit, .tcx or .gpx file, or turn on Apple Health import – Endurance Debrief calculates TSS, NP, IF and your CTL/ATL/TSB curve automatically, right on your iPhone. No cloud, no account.