Stress Points¶
Stress Points (SP) is PeakLine's training-load metric. It answers a single question: how hard was that, and how much will it cost me to recover?
It's modeled on TSS (Training Stress Score) from TrainingPeaks, but with two important differences:
- SP works without a power meter — it gracefully falls back to HR, then pace, then speed.
- SP applies activity-type coefficients and intensity-zone multipliers, so a 1-hour Z2 spin and a 1-hour Z5 interval session don't get the same number.
The formula¶
The interesting work happens in intensity_factor and zone_multiplier.
Intensity factor¶
The intensity factor (IF) is computed using the best available data, in this order:
- Power-based IF = NP / FTP. The gold standard. Requires a power meter and your FTP in settings.
- HR-based IF = avg_hr / threshold_hr. Used when no power is available. Reasonably accurate if your LTHR is set.
- Pace-based IF (running only) = threshold_pace / avg_pace. Used for runs without HR or power.
- Speed-based estimate — last resort. Compares avg speed to a sport-specific reference.
The lower in the list you fall, the wider the error bars. A 90-minute ride with power gives a tight SP estimate; the same ride logged manually as "duration only" gives a rough estimate.
Zone multipliers¶
The intensity zone the workout falls into amplifies SP, because the metabolic cost is non-linear:
| Zone | Multiplier | What it looks like |
|---|---|---|
| Recovery | 0.7 | Z1 spin, very easy |
| Endurance | 1.0 | Long Z2, conversation pace |
| Tempo | 1.5 | Z3, sweet-spot |
| Threshold | 2.0 | Z4, race pace |
| VO2max | 2.5 | Z5, 3–5 min intervals |
| Anaerobic | 3.0 | Z6, 30s–2min hard |
| Maximal | 4.0 | Z7, all-out sprints |
So a 1-hour easy ride and a 1-hour interval session can differ by 4x in Stress Points — which matches what they actually cost you.
Training load categories¶
Single-session SP rolls up into named buckets so you can sanity-check what you just did:
| SP | Category |
|---|---|
| < 30 | Very Light |
| 30–60 | Light |
| 60–100 | Moderate |
| 100–150 | Hard |
| 150–250 | Very Hard |
| 250+ | Extreme |
A weekly SP total of 400–600 is a normal training week for a fit recreational athlete. 700+ is heavy training. 1000+ is a race or training-camp week.
Why not just use TSS?¶
TSS is a great metric if you have power. If you don't, TSS-equivalents from HR (hrTSS) tend to under-count high-intensity work and over-count zone 2 drift, because HR lags load and decouples with fatigue.
Stress Points addresses that by:
- Picking the best available intensity proxy per workout, not a fixed one.
- Applying explicit zone multipliers, so a 30-minute VO2 session gets credit even if the average HR looks low.
- Capping at SP = 2000 for ultra-long efforts (rather than letting a 12-hour gravel race produce a meaningless five-figure number).
If you do have power on every ride, SP will track very closely to TSS in practice — they should agree within 5% on most workouts.
What SP is good for¶
- Spotting overtraining. A rolling 7-day SP that's way above your usual is a warning sign. PeakLine surfaces this on the dashboard.
- Planning a hard week. If you target ~600 SP this week and you're at 200 by Wednesday, the math says: two more moderate days or one hard day, not both.
- Comparing weeks across the year. Even if your power numbers drift up over a season, SP stays comparable.
What SP is not good for¶
- Replacing CTL/ATL/TSB. SP per activity is the input; a proper training-load curve is built by summing SP over time with exponential decay. PeakLine displays a rolling 7-day and 28-day SP but doesn't implement the full Banister model.
- Comparing across athletes. Your SP is calibrated to your FTP / LTHR. Comparing absolute SP numbers between users is meaningless.
See also¶
- PeakLine Score — for single-effort performance, not load
- Power and HR zones — the zone model SP uses
- What gets analyzed — pipeline context