Calculate your specific heart rate zones for running and cycling.
Used to estimate Max HR if not provided.
Percentage of Max Heart Rate (%Max HR)
Percentage of Heart Rate Reserve (%HRR)
Required for HRR method. Check your Garmin watch for your 7-day avg.
Zone
Intensity
Heart Rate Range (BPM)
Benefit
Understanding Garmin Heart Rate Zones
Using a Garmin device to track your training is most effective when your heart rate zones are set correctly. Unlike generic calculators, this tool allows you to switch between the two primary methods used in Garmin Connect: % Max Heart Rate and % Heart Rate Reserve (HRR).
Method 1: % Max Heart Rate
This is the default setting on most Garmin devices. It calculates zones based purely on your maximum heart rate. While simple, it doesn't account for your fitness level as indicated by your resting heart rate. The formula is simply: Target HR = Max HR × Zone Percentage.
Method 2: % Heart Rate Reserve (HRR)
Often called the Karvonen formula, this method is generally considered more accurate for athletes. It takes into account your "reserve" — the difference between your maximum and resting heart rate. As you get fitter and your resting heart rate drops, your training zones adjust automatically. The formula is: Target HR = ((Max HR – Resting HR) × Zone Percentage) + Resting HR.
What Do the 5 Zones Mean?
Zone 1 (Warm Up): Very light exertion. Helps with warm-up and cool-down.
Zone 2 (Easy): Comfortable pace, easy breathing. Builds basic endurance and burns fat.
Zone 3 (Aerobic): Moderate pace, rhythmic breathing. improves aerobic capacity.
Zone 4 (Threshold): Uncomfortable pace, heavy breathing. Improves speed and lactate threshold.
Zone 5 (Maximum): Maximum effort, gasping for breath. Improves sprint speed and neuromuscular power.
How to Update Settings on Garmin
Once you have your numbers from the calculator above, open your Garmin Connect app, go to Garmin Devices > User Settings > Heart Rate Zones, and input your custom Max HR, Resting HR, or specific zone values manually to ensure your watch data matches your training goals.
function toggleRestingHR() {
var method = document.getElementById("calcMethod").value;
var restingGroup = document.getElementById("restingHrGroup");
if (method === "hrr") {
restingGroup.style.display = "block";
} else {
restingGroup.style.display = "none";
}
}
function calculateGarminZones() {
// Inputs
var ageInput = document.getElementById("calcAge").value;
var maxHRInput = document.getElementById("calcMaxHR").value;
var restingHRInput = document.getElementById("calcRestingHR").value;
var method = document.getElementById("calcMethod").value;
// Parsing
var age = parseFloat(ageInput);
var maxHR = parseFloat(maxHRInput);
var restingHR = parseFloat(restingHRInput);
// Validation & Auto-calc Max HR
if (!maxHR) {
if (!age) {
alert("Please enter your Age or a known Max Heart Rate.");
return;
}
maxHR = 220 – age;
}
// Validate HR logic
if (age 120) {
if (!maxHRInput) { // only alert if relying on age for calc
alert("Please enter a valid age.");
return;
}
}
if (maxHR 250) {
alert("Max Heart Rate seems unrealistic (usually between 100-250 BPM). Please check your input.");
return;
}
if (method === "hrr") {
if (!restingHR || restingHR 120) {
alert("Please enter a valid Resting Heart Rate (typically 30-100 BPM) for the HRR method.");
return;
}
if (restingHR >= maxHR) {
alert("Resting Heart Rate cannot be higher than or equal to Max Heart Rate.");
return;
}
}
// Calculation Logic
var zones = [];
var zoneDefs = [
{ name: "Zone 1", desc: "Warm Up", color: "zone-1-row", minPct: 0.50, maxPct: 0.60, benefit: "Relaxed, easy pace" },
{ name: "Zone 2", desc: "Easy", color: "zone-2-row", minPct: 0.60, maxPct: 0.70, benefit: "Basic endurance, fat burning" },
{ name: "Zone 3", desc: "Aerobic", color: "zone-3-row", minPct: 0.70, maxPct: 0.80, benefit: "Cardiovascular capacity" },
{ name: "Zone 4", desc: "Threshold", color: "zone-4-row", minPct: 0.80, maxPct: 0.90, benefit: "Speed endurance, lactate tolerance" },
{ name: "Zone 5", desc: "Maximum", color: "zone-5-row", minPct: 0.90, maxPct: 1.00, benefit: "Max effort, sprint power" }
];
var hrr = maxHR – restingHR;
for (var i = 0; i < zoneDefs.length; i++) {
var z = zoneDefs[i];
var minBPM, maxBPM;
if (method === "hrr") {
// Karvonen Formula: Target = (HRR * %) + Rest
minBPM = Math.round((hrr * z.minPct) + restingHR);
maxBPM = Math.round((hrr * z.maxPct) + restingHR);
} else {
// Max HR Formula: Target = Max * %
minBPM = Math.round(maxHR * z.minPct);
maxBPM = Math.round(maxHR * z.maxPct);
}
// Adjust boundaries so they don't overlap confusingly (usually Garmin starts next zone at previous max + 1)
// But strict math usually implies continuous ranges. Let's keep strict rounding.
zones.push({
name: z.name,
desc: z.desc,
range: minBPM + " – " + maxBPM + " bpm",
pct: (z.minPct * 100) + "-" + (z.maxPct * 100) + "%",
benefit: z.benefit,
cssClass: z.color
});
}
// Output Display
var summaryHtml = "Results Based on:";
summaryHtml += "Max Heart Rate: " + maxHR + " BPM";
if (method === "hrr") {
summaryHtml += "Resting Heart Rate: " + restingHR + " BPM";
summaryHtml += "Heart Rate Reserve: " + hrr + " BPM";
summaryHtml += "Method: Karvonen (Heart Rate Reserve)";
} else {
summaryHtml += "Method: Standard (% of Max Heart Rate)";
}
document.getElementById("summaryBox").innerHTML = summaryHtml;
var tableHtml = "";
for (var j = 0; j < zones.length; j++) {
tableHtml += "