Training 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
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:
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.
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.
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:
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:
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.
Both systems below are anchored to LTHR, and both estimate it the same way — a solo time trial, no drafting, steady and honest:
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.
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.)
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:
| Zone | Name | % of LTHR |
|---|---|---|
| 1 | Active recovery | < 69% |
| 2 | Endurance | 69–83% |
| 3 | Tempo | 84–94% |
| 4 | Threshold | 95–105% |
| 5 | VO₂max | > 105% |
Notice Zone 4 straddles threshold symmetrically (95–105%): for Coggan, "at threshold" is a broad band, not a single line.
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:
| Zone | Name | Cycling | Running |
|---|---|---|---|
| 1 | Recovery | < 81% | < 85% |
| 2 | Aerobic | 81–89% | 85–89% |
| 3 | Tempo | 90–93% | 90–94% |
| 4 | Threshold | 94–99% | 95–99% |
| 5 | Above 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.)
Both cut five zones from the same threshold — they just disagree on where:
| Question | Coggan | Friel |
|---|---|---|
| Anchor | LTHR (threshold HR) | LTHR (threshold HR) |
| HR zones | 5 | 5 |
| Where threshold sits | Middle of Zone 4 (95–105%) | Top of Zone 4 (≈99%) |
| Band widths | Wide | Narrower, clustered near threshold |
| Sport-specific % | One set of numbers | Separate cycling & running sets |
| Designed around | Power (HR is the fallback) | Heart rate itself |
| Best when… | You also train with power | You 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.
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:
68 / 83 / 94 / 10580 / 89 / 93 / 9984 / 89 / 94 / 99Puste 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.
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.