Calculate your HR Zones based on Garmin's Max HR or HRR methodologies.
Used to estimate Max HR if not provided.
Leave blank to use age-based formula (220-Age).
Required for Heart Rate Reserve (HRR) method.
Percentage of Max Heart Rate (%HR Max)
Percentage of Heart Rate Reserve (%HRR)
Garmin allows both; HRR is generally more accurate.
Your Calculated Heart Rate Zones
Based on Max HR: bpm | Method:
Zone
Garmin Label
Intensity (%)
Range (bpm)
Zone 1
Warm Up
50% – 60%
Zone 2
Easy
60% – 70%
Zone 3
Aerobic
70% – 80%
Zone 4
Threshold
80% – 90%
Zone 5
Maximum
90% – 100%
Does Garmin Calculate Heart Rate Zones Automatically?
Yes, Garmin devices automatically calculate heart rate zones, but the accuracy depends heavily on the input data. By default, most Garmin watches use the simple calculation of 220 minus your age to estimate your Maximum Heart Rate (Max HR). The device then creates 5 zones based on percentages of this number.
However, you can achieve much higher precision by customizing these settings in the Garmin Connect app. The calculator above simulates the two primary methods Garmin uses:
% Max HR: This is the default setting. It simply takes percentages (e.g., 70-80% for Zone 3) of your maximum heart rate. It is simple but often underestimates effort for fit individuals.
% Heart Rate Reserve (HRR): This is the "Karvonen Formula." It calculates zones based on the difference between your Max HR and your Resting HR. This is often the preferred method for athletes using Garmin devices because it accounts for cardiovascular fitness.
Understanding the 5 Garmin Zones
Whether you have a Forerunner, Fenix, or Venu, Garmin divides intensity into five distinct zones:
Zone 1 (Warm Up): Very light exertion. Used for warming up or cooling down.
Zone 2 (Easy): Comfortable pace, conversational. This is where endurance is built.
Zone 3 (Aerobic): Moderate pace. Breathing is harder, but sustainable for long periods.
Zone 4 (Threshold): Uncomfortable pace. Just below your lactate threshold. Sustainable for shorter durations (e.g., 10k race pace).
Zone 5 (Maximum): Sprinting pace. Sustainable for only a few minutes or seconds.
How to Update Zones in Garmin Connect
Once you have calculated your custom zones using the tool above, you can manually input them into your device:
Open the Garmin Connect app.
Go to Garmin Devices and select your watch.
Select User Settings or User Profile.
Tap on Heart Rate Zones.
Choose "Based on %HRR" or "Based on %Max" and enter your custom values.
function calculateGarminZones() {
// 1. Get Inputs
var ageInput = document.getElementById('inputAge').value;
var maxHRInput = document.getElementById('inputMaxHR').value;
var restingHRInput = document.getElementById('inputRestingHR').value;
var method = document.getElementById('selectMethod').value;
// 2. Validate Numbers
var age = parseFloat(ageInput);
var customMax = parseFloat(maxHRInput);
var resting = parseFloat(restingHRInput);
// 3. Logic for Max HR
var maxHR = 0;
if (!isNaN(customMax) && customMax > 0) {
maxHR = customMax;
} else if (!isNaN(age) && age > 0) {
maxHR = 220 – age;
} else {
alert("Please enter your Age or a known Max Heart Rate.");
return;
}
// 4. Validate Resting HR if HRR method is selected
if (method === 'hrr') {
if (isNaN(resting) || resting = maxHR) {
alert("For Heart Rate Reserve (HRR) calculations, please enter a valid Resting Heart Rate (lower than Max HR).");
return;
}
}
// 5. Calculate Zones
var z1_start, z1_end, z2_end, z3_end, z4_end, z5_end;
if (method === 'hrr') {
// Karvonen Formula: TargetHR = ((MaxHR – RestingHR) * %Intensity) + RestingHR
var reserve = maxHR – resting;
z1_start = Math.round((reserve * 0.50) + resting);
z1_end = Math.round((reserve * 0.60) + resting);
// Zone 2 start is Z1 end + 1 usually, but for ranges we list cutoffs
z2_end = Math.round((reserve * 0.70) + resting);
z3_end = Math.round((reserve * 0.80) + resting);
z4_end = Math.round((reserve * 0.90) + resting);
z5_end = Math.round((reserve * 1.00) + resting); // Should be MaxHR
document.getElementById('displayMethod').innerText = "Heart Rate Reserve (HRR)";
} else {
// Standard Percentage of Max HR
z1_start = Math.round(maxHR * 0.50);
z1_end = Math.round(maxHR * 0.60);
z2_end = Math.round(maxHR * 0.70);
z3_end = Math.round(maxHR * 0.80);
z4_end = Math.round(maxHR * 0.90);
z5_end = Math.round(maxHR * 1.00);
document.getElementById('displayMethod').innerText = "% of Max Heart Rate";
}
// 6. Output to DOM
document.getElementById('displayMaxHR').innerText = Math.round(maxHR);
// Format ranges: Z1 (Start-End), Z2 (End of Z1 + 1 to End of Z2)
// To prevent gaps in display, we format as:
// Z1: 50%-60%
// Z2: 60%-70%
// Actual BPM logic for display:
document.getElementById('resZ1').innerText = z1_start + " – " + z1_end + " bpm";
document.getElementById('resZ2').innerText = (z1_end + 1) + " – " + z2_end + " bpm";
document.getElementById('resZ3').innerText = (z2_end + 1) + " – " + z3_end + " bpm";
document.getElementById('resZ4').innerText = (z3_end + 1) + " – " + z4_end + " bpm";
document.getElementById('resZ5').innerText = (z4_end + 1) + " – " + z5_end + " bpm";
// Show result container
document.getElementById('resultsArea').style.display = 'block';
}