Skip to content

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_VAM is a fixed climbing rate.
  • The result is clamped to [0, 1000], and time_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).

  1. reference_speed(50 km) for Ride ≈ 49 km/h (interpolated between 54 and 46).
  2. ideal_flat_time = 50 / 49 × 3600 ≈ 3673 s.
  3. ideal_climb_time = 800 / 1700 × 3600 ≈ 1694 s.
  4. ideal_time = 5367 s ≈ 1:29.
  5. actual_time = 6300 s.
  6. PLS = round(5367 / 6300 × 1000) = 852Excellent.

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