Heart rate zone calculations: Karvonen, % max HR and LTHR

Just Zones supports three heart-rate zone models, plus custom zone bounds you can set on top of any model. Whichever one you pick in Settings → Zone Setup, the app shows which model produced the zones you're looking at.

To see your own numbers under all three models, use the heart rate zone calculator.

In every model below, the percentage sets each zone's LOWER bound. Z5 has no upper limit — it runs from its lower bound up to max effort. A heart rate below the Z1 floor doesn't count toward any zone; it's untracked, not an error.

1. Percent of max heart rate

The simplest model: each zone's lower bound is a percentage of your maximum heart rate — the conventional 50/60/70/80/90% split for Z1–Z5.

zone lower bound = max HR × percent

Max HR can be entered manually (from a lab test or a known value) or estimated from age. This is the only model that needs no resting heart rate.

2. Heart-rate reserve — Karvonen formula

Heart-rate reserve (HRR) is the gap between your resting and maximum heart rate. Each zone's lower bound is a percentage of that gap, added back on top of resting heart rate — so zones account for your individual resting HR, not just your max. Same 50/60/70/80/90% split as above, applied to reserve instead of max HR directly.

zone lower bound = ((max HR − resting HR) × percent) + resting HR

This needs both a max HR and a resting HR, either entered manually or estimated. Resting HR, when not entered manually, is the 14-day median of your resting-heart-rate samples from Apple Health.

3. Lactate threshold heart rate — Friel model

Zones are set as percentages of your lactate threshold heart rate (LTHR) — the heart rate at which lactate starts accumulating faster than the body can clear it, following Joe Friel's zone system used widely in running and cycling training: Z2 starts at 85% of LTHR, Z3 at 90%, Z4 at 95%, Z5 at 100%. The Z1 floor (65%) isn't part of Friel's published zones — Friel leaves Z1 as "below Z2" with no floor of its own — so Just Zones picks 65% to match the role a Z1 floor plays in the other two models.

zone lower bound = LTHR × percent

LTHR is entered directly, typically from a field test or a known value.

Custom bounds

Zone Setup also lets you type your own lower bound for any zone by hand. A custom value is layered on top of whichever model you've picked — it replaces that one zone's lower bound, while every zone you don't touch keeps the value the chosen model gives it.

Worked example

Take a resting heart rate of 60 bpm and a max heart rate of 180 bpm, using the standard 50/60/70/80/90% heart-rate-reserve split as each zone's lower bound:

HRR = 180 − 60 = 120 bpm Z1 lower (50%): 120 × 0.50 + 60 = 120 bpm Z2 lower (60%): 120 × 0.60 + 60 = 132 bpm Z3 lower (70%): 120 × 0.70 + 60 = 144 bpm Z4 lower (80%): 120 × 0.80 + 60 = 156 bpm Z5 lower (90%): 120 × 0.90 + 60 = 168 bpm, no upper limit

So for this example: Z1 is 120–131 bpm, Z2 is 132–143, Z3 is 144–155, Z4 is 156–167, and Z5 is 168 bpm and up. A reading below 120 bpm falls outside every zone. Just Zones then measures, from your Apple Health heart-rate samples, how many minutes of each workout — and each week — fell inside each of those bounds.

The same numbers under all three models

Take a max heart rate of 180 bpm, a resting heart rate of 60 bpm and an LTHR of 160 bpm. Lower bounds, in bpm:

Zone % max HR Karvonen (HRR) LTHR (Friel) Z1 90 120 104 Z2 108 132 136 Z3 126 144 144 Z4 144 156 152 Z5 162 168 160

The LTHR (Friel) Z1 value (104 bpm, 65% of LTHR) reflects the app's own choice of a 65% floor, not a figure from Friel's published zones.

A heart rate of 140 bpm lands in Z3 under % max HR (126–143), in Z2 under Karvonen (132–143) and in Z2 under LTHR (136–143). Same heart rate, different zone — which is why the app shows which model produced the zones you're looking at.

Just Zones is available now on the App Store.

Still have a question?

See Support, or write to support@guineapigse.space.