Heart Rate Zone Calculator (Karvonen Method)
Your Age (Years)
Resting Heart Rate (BPM)
Calculate Training Zones
Estimated Max Heart Rate: — BPM
Heart Rate Reserve (HRR): — BPM
Zone
Intensity
Target BPM Range
Understanding Heart Rate Zones and the Karvonen Formula
Training with heart rate zones is the most effective way to optimize your cardiovascular fitness. Unlike the simple "220 minus age" formula, the Karvonen Method incorporates your Resting Heart Rate (RHR) . This provides a much more personalized set of training ranges because it accounts for your current fitness level.
How the Calculation Works
The Karvonen formula calculates your Heart Rate Reserve (HRR) by subtracting your resting heart rate from your maximum heart rate. Your target heart rate is then calculated as a percentage of that reserve, plus your resting heart rate:
Target HR = ((Max HR − Resting HR) × % Intensity) + Resting HR
Training Zone Breakdown
Zone 1: Very Light (50-60%) – Best for recovery and warm-ups. Improves overall health but provides minimal aerobic conditioning.
Zone 2: Light (60-70%) – The "Fat Burning" zone. Enhances endurance and teaches the body to use fat as a primary fuel source.
Zone 3: Moderate (70-80%) – Aerobic zone. Improves cardiovascular capacity and respiratory efficiency.
Zone 4: Hard (80-90%) – Anaerobic zone. Increases speed and power while raising your lactate threshold.
Zone 5: Maximum (90-100%) – VO2 Max training. Only sustainable for short bursts; used for high-intensity interval training (HIIT).
Example Calculation
If you are 30 years old with a resting heart rate of 60 BPM:
Max HR: 220 – 30 = 190 BPM
HRR: 190 – 60 = 130 BPM
Zone 2 Lower (60%): (130 * 0.60) + 60 = 138 BPM
Zone 2 Upper (70%): (130 * 0.70) + 60 = 151 BPM
function calculateZones() {
var age = parseFloat(document.getElementById('age').value);
var restingHR = parseFloat(document.getElementById('restingHR').value);
var resultsDiv = document.getElementById('hr-results');
var tableBody = document.getElementById('zoneTableBody');
if (isNaN(age) || isNaN(restingHR) || age <= 0 || restingHR <= 0) {
alert("Please enter valid numbers for age and resting heart rate.");
return;
}
// Calculations
var maxHR = 220 – age;
var hrr = maxHR – restingHR;
if (hrr <= 0) {
alert("Resting heart rate cannot be higher than maximum heart rate. Please check your inputs.");
return;
}
document.getElementById('displayMaxHR').innerText = maxHR;
document.getElementById('displayHRR').innerText = hrr;
var zones = [
{ name: "Zone 1 (Recovery)", intensity: "50% – 60%", min: 0.50, max: 0.60, color: "#e8f5e9" },
{ name: "Zone 2 (Endurance)", intensity: "60% – 70%", min: 0.60, max: 0.70, color: "#f1f8e9" },
{ name: "Zone 3 (Aerobic)", intensity: "70% – 80%", min: 0.70, max: 0.80, color: "#fffde7" },
{ name: "Zone 4 (Anaerobic)", intensity: "80% – 90%", min: 0.80, max: 0.90, color: "#fff3e0" },
{ name: "Zone 5 (VO2 Max)", intensity: "90% – 100%", min: 0.90, max: 1.00, color: "#ffebee" }
];
var html = "";
for (var i = 0; i < zones.length; i++) {
var lower = Math.round((hrr * zones[i].min) + restingHR);
var upper = Math.round((hrr * zones[i].max) + restingHR);
html += '
' +
'' + zones[i].name + ' ' +
'' + zones[i].intensity + ' ' +
'' + lower + ' – ' + upper + ' BPM ' +
' ';
}
tableBody.innerHTML = html;
resultsDiv.style.display = 'block';
// Smooth scroll to results
resultsDiv.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}