PeakLine Score¶
PeakLine Score (PLS) is a single 0–1000 number that summarizes how strong an effort was, relative to a calibrated reference athlete and to the actual terrain.
It exists because raw averages — "I averaged 28 km/h" — mean nothing without context. 28 km/h on a flat windless day is a recovery ride; 28 km/h over 2000 m of climbing is exceptional. PLS normalizes for distance and elevation so two activities are comparable.
The headline number¶
PLS is computed by comparing your moving time to an ideal time that a calibrated super-athlete would have produced on the same course:
ideal_time = distance / reference_speed(distance) + elevation_gain / reference_VAM
PLS = clamp(0, 1000, round(ideal_time / actual_time × 1000))
A few things matter in that formula:
reference_speed(distance)is distance-aware — it decays logarithmically. Holding a high pace for 1 km is easy; holding it for 100 km is not, so the reference accounts for that.reference_VAMis a fixed climbing rate.- The result is clamped to
[0, 1000], andtime_ratio > 1.15(you beating the super-athlete by more than 15%) is rejected as suspect.
Reference speeds and VAM¶
The super-athlete is calibrated against world-class performances (roughly FTP 400 W on the bike, ~17 km/h marathon pace for runners). Reference speeds at three distances:
| Activity | 1 km | 10 km | 100 km |
|---|---|---|---|
| Ride | 62 km/h | 54 km/h | 46 km/h |
| Run | 25 km/h | 22.2 km/h | 19.4 km/h |
Speeds between those anchors are interpolated on a log curve.
Reference VAM: ~1700 m/h for rides, ~1100 m/h for runs.
VirtualRide gets a +10% speed bonus — turbo trainers and Zwift produce systematically higher averages than outdoor riding, so the reference is raised to keep PLS roughly comparable.
Tiers¶
PLS is mostly used as a number, but it also rolls up into named tiers:
| PLS | Tier |
|---|---|
| 900–1000 | Elite |
| 800–899 | Excellent |
| 700–799 | Very Good |
| 600–699 | Good |
| 500–599 | Average |
| 400–499 | Fair |
| 0–399 | Needs Improvement |
Recreational riders typically land in the 400–600 range. Strong club riders sit at 600–750. Above 800 is rare; 900+ means you're racing.
Anti-abuse gates¶
PLS is not the right metric for short coffee rides, downhill bombs, or treadmill mistakes. Activities are rejected (no PLS shown) when:
- Distance < 10 km (Ride) or < 5 km (Run)
- Moving time < 10 minutes
- Average speed > 90 km/h (Ride) or > 35 km/h (Run)
- The computed time-ratio > 1.15 (faster than the super-athlete by >15%)
EBikeRide is always excluded — the assist makes the reference meaningless.
Why no PLS on my ride?
If you don't see a PLS on an activity, one of the gates above triggered. The most common cause is a short ride or a downhill MTB descent that averages above the speed cap.
Comparing yourself over time¶
The score is most useful as a trend, not a single data point. PeakLine fits a linear regression over your last 4+ activities of the same type and shows one of three trend states:
- Positive — slope > +5 pts/week
- Stable — slope within ±5 pts/week
- Negative — slope < −5 pts/week
A negative trend isn't necessarily bad. Heavy training blocks, illness, or summer heat all push PLS down even when you're getting fitter. The trend is information, not judgment.
Worked example¶
A 50 km ride with 800 m of climbing, finished in 1:45 (avg 28.6 km/h).
reference_speed(50 km)for Ride ≈ 49 km/h (interpolated between 54 and 46).ideal_flat_time = 50 / 49 × 3600 ≈ 3673 s.ideal_climb_time = 800 / 1700 × 3600 ≈ 1694 s.ideal_time = 5367 s ≈ 1:29.actual_time = 6300 s.PLS = round(5367 / 6300 × 1000) = 852→ Excellent.
What PLS isn't¶
- Not a fitness score. It's a performance score for one activity. CTL/ATL/TSB models (built on Stress Points) are the right tool for fitness.
- Not a fair race result. It rewards effort against terrain — wind, weather, and group dynamics still matter.
- Not comparable across sports. Don't put your Run PLS next to your Ride PLS and read anything into the gap.
See also¶
- Stress Points — for training load, not single-effort performance
- Climbs, terrain, VAM — the inputs that PLS uses for elevation modeling
- What gets analyzed — full pipeline context