← Back to Puste

Training zones

How Puste calculates your heart-rate zones

Every zone boundary is a percentage of one personal anchor. This page explains which anchor Puste uses, the exact arithmetic, and how the two best-known threshold systems — Coggan and Friel — carve the zones differently.

Puste · Training zones · last updated 9 Aug 2026

The one idea behind every zone

Heart-rate zones are not fixed bpm numbers — they're bands scaled to your own physiology. Pick a single reference heart rate (an "anchor"), then place each zone boundary at a percentage of it. A boundary is just:

boundary (bpm) = percentage × your anchor

Two riders with identical zone percentages get completely different bpm ranges, because their anchors differ. The only real questions are which anchor you scale from and what percentages you use to cut the bands. That's the whole subject — and it's exactly where Coggan and Friel part ways.

The three anchors Puste offers

In Settings → Training zones → Zone basis you choose the anchor. Puste then computes the four upper boundaries of its five-zone model from it:

Max HR — %HRmax

Scales from your maximum heart rate alone.

boundary = pct% × HRmax

Simplest, and the one most watches default to. Its weakness: a percentage of max doesn't line up with your actual metabolic thresholds — two athletes with the same HRmax but very different fitness get identical zones.

Max + Rest — heart-rate reserve (Karvonen)

Scales from the span between rest and max, then adds resting HR back on:

boundary = HRrest + pct% × (HRmax − HRrest)

More personal than plain %HRmax because it folds in your resting heart rate (a rough fitness proxy). Still anchored to max, not to threshold.

LTHR — lactate threshold heart rate

Scales from your threshold heart rate — the effort you can just hold for about an hour:

boundary = pct% × LTHR

This is the anchor both Coggan and Friel use. It's tied to a real metabolic event (the lactate turn-point), so the zones map onto how training actually feels — 100 % is threshold. Exactly where Zone 4 ends around it is one of the things the two systems disagree on: Puste's default and Friel both put threshold at the top of Zone 4, while Coggan runs a wider Zone 4 up to 105 %. See the comparison below.

Puste applies one zone set — the one from your current settings — to every activity, old and new alike, so your whole history is bucketed with the same bands. HRmax and HRrest come from your age, measured peaks and synced resting-HR history; LTHR you set yourself, because it only moves with real fitness change, not day to day.

Finding your LTHR — the field test

Both systems below are anchored to LTHR, and both estimate it the same way — a solo time trial, no drafting, steady and honest:

  1. Warm up thoroughly (10–15 min, a few short pickups).
  2. Ride or run 30 minutes all-out, alone, on flat or gently rolling ground — as hard as you can hold to the end.
  3. Take your average heart rate over the final 20 minutes. That number is your LTHR.

Use the last 20 minutes (not all 30) because heart rate keeps climbing for the first few minutes before it settles — averaging from the start would under-read your threshold. Re-test every couple of months, or after a clear step up in fitness.

LTHR is sport-specific. Your running threshold heart rate is typically several beats higher than your cycling one, and swimming lower still. If you train seriously across disciplines, test each one — a single LTHR is a compromise.

Two ways to slice it: Coggan vs. Friel

Given the same LTHR, Coggan and Friel place the boundaries at different percentages. Both build five heart-rate zones anchored to threshold — same anchor, different rulers. (The percentages below are the standard published values, lightly rounded so the five bands sit edge-to-edge with no gaps.)

Andrew Coggan's HR zones

Coggan's zones are the heart-rate companion to his power model. In his system power is primary — heart rate lags at the start of an effort, drifts upward over long ones, and can't tell a 5-second sprint from a moderate surge — so his very top efforts are power-only, and the HR side is a clean five zones with wide bands centred on threshold:

ZoneName% of LTHR
1Active recovery< 69%
2Endurance69–83%
3Tempo84–94%
4Threshold95–105%
5VO₂max> 105%

Notice Zone 4 straddles threshold symmetrically (95–105%): for Coggan, "at threshold" is a broad band, not a single line.

Joe Friel's HR zones

Friel's system is heart-rate-first — designed to be used with nothing but a HR strap — and he publishes different percentages for cycling and running, since the same athlete's threshold HR differs between the two. His bands are narrower than Coggan's and cluster just below threshold, where most quality training happens:

ZoneNameCyclingRunning
1Recovery< 81%< 85%
2Aerobic81–89%85–89%
3Tempo90–93%90–94%
4Threshold94–99%95–99%
5Above threshold> 99%> 99%

For Friel, threshold sits at the top of Zone 4 (≈99%), so 100% and up is Zone 5. (His full model subdivides that top zone into 5a/5b/5c; Puste keeps a single Zone 5 for a simpler read.)

Side by side

Both cut five zones from the same threshold — they just disagree on where:

QuestionCogganFriel
AnchorLTHR (threshold HR)LTHR (threshold HR)
HR zones55
Where threshold sitsMiddle of Zone 4 (95–105%)Top of Zone 4 (≈99%)
Band widthsWideNarrower, clustered near threshold
Sport-specific %One set of numbersSeparate cycling & running sets
Designed aroundPower (HR is the fallback)Heart rate itself
Best when…You also train with powerYou train by HR alone

A worked feel for it — take an LTHR of 170 bpm. Coggan's Endurance (Zone 2, 69–83%) runs a wide 117–141 bpm; Friel's Aerobic (cycling Zone 2, 81–89%) is a tighter 138–151 bpm. Neither is "right" — Coggan lumps all easy riding together, Friel separates true recovery from aerobic base.

What Puste ships — and how to match either system

Out of the box, the LTHR basis uses a clean five-zone split — upper thresholds at 85 / 90 / 95 / 100 % of threshold, with Zone 5 above 100%. It's a deliberately simple middle ground: threshold at the top of Zone 4, like Friel, with Coggan's tidy five bands.

The four numbers you type are each a zone's upper threshold — the highest percentage still inside that zone. (So a reference zone written "< 81%" has its top at 80%: you enter 80.) They're fully editable in Settings, so to match a system just enter its four numbers:

Puste keeps a separate set of percentages for each basis, so switching between Max HR, Max + Rest and LTHR never loses your custom numbers. Change any of them and every zone chart in the app — the weekly Home card and each activity's breakdown — recomputes from your new boundaries.

Which should you pick? If you ride with a power meter, Coggan keeps your HR and power stories aligned. If heart rate is your main gauge, Friel's tighter bands near threshold give finer control — use his running numbers when you run. If you just want sensible bands without fuss, Puste's default five-zone LTHR split is a solid all-rounder.

Zone boundaries are computed live from your chosen anchor and percentages — nothing is baked in. LTHR, resting HR and max HR all live in Settings → Training zones; the anchor maths above is exactly what the app runs when it colours a ride by heart-rate zone.