How to calculate TSS without a power meter (hrTSS and rTSS)
If you train with heart rate or pace and not a power meter, you can still get a meaningful Training Stress Score for every workout. The two main alternatives are hrTSS (heart-rate-based) and rTSS (pace-based, mainly for runners). Here is how each one works, what you need to set them up, and how TrainCurve uses them.
The principle is the same
TSS is intensity × duration, normalised so that one hour at threshold equals 100. Power does it via Normalized Power and FTP. Heart rate does it via a similar smoothed intensity ratio, anchored to your lactate threshold heart rate (LTHR). Pace does it via your threshold pace (e.g. 5K pace + a buffer for running).
hrTSS — heart-rate TSS
The simplified version (TrainingPeaks' own formula):
hrTSS = (duration_h × IF² × 100)
where
IF = (avg HR − HRrest) ÷ (LTHR − HRrest)
You need two numbers up front:
- HRrest: your resting heart rate, measured first thing in the morning. Most adults sit between 50 and 70 bpm; trained endurance athletes can be 35–50.
- LTHR: your lactate threshold heart rate. The easiest test: a 30-minute all-out effort (after a good warm-up). Your average HR for the last 20 minutes is a fair estimate of LTHR.
A worked hrTSS example
HRrest = 50 bpm, LTHR = 175 bpm. You do a 75-minute steady run at an average heart rate of 155 bpm.
IF = (155 − 50) ÷ (175 − 50) = 105 ÷ 125 = 0.84
hrTSS = (75/60) × 0.84² × 100 = 1.25 × 0.7056 × 100 ≈ 88
That is a solid aerobic run — high tempo / low threshold work. TrainCurve would score it as 88 TSS and roll it into your CTL and ATL exactly the same way a power-meter ride would.
rTSS — running pace TSS
For runners with a GPS watch but no HR strap (or unreliable HR), rTSS uses pace against threshold pace:
rTSS = (duration_h × IF² × 100)
with
IF = threshold pace ÷ actual pace (seconds/km)
You need a threshold pace for the distance. A common proxy: your recent 5K race pace, slowed by ~10–15 seconds per km (or use a half-marathon pace + a small adjustment). The slower threshold gives more conservative numbers on long runs, which is the safer default.
Worked rTSS example
Threshold pace = 5:00/km. You run 12 km at an average of 5:30/km, taking 66 minutes total.
IF = 5:00 ÷ 5:30 = 300 s ÷ 330 s = 0.91
rTSS = (66/60) × 0.91² × 100 ≈ 1.10 × 0.828 × 100 ≈ 91
Higher than expected because the effort was close to threshold — useful to know before stacking another hard day.
Why hrTSS/rTSS are imperfect but useful
- They lag during intervals (HR rises slowly after a hard rep)
- They drift in heat, dehydration or stress (HR creeps up at the same effort)
- They miss short sprints (HR never reaches threshold during a 30-second effort)
For the bulk of your training — easy aerobic volume and steady threshold work — they are good enough to drive a real TSS-based model. Combined with your training load history, they give you actionable Fitness, Fatigue and Form.
TrainCurve scores both automatically
Upload a FIT or TCX file (with HR or pace) and TrainCurve picks hrTSS or rTSS as the right scoring method for that workout. No manual entry. Start free and your next no-power run will show up with a real TSS.
See your own training load
TrainCurve turns your workouts into CTL, ATL and TSB automatically — free for your first 100 workouts.