Calculate your precision target heart rate zones based on Heart Rate Reserve (HRR).
Your Vitals Summary
Estimated Max HR: BPM
Heart Rate Reserve (HRR): BPM
Zone
Intensity
Target BPM Range
What is the Karvonen Method?
The Karvonen Method is a mathematical formula used to determine your target heart rate (THR) zones. Unlike simple percentage-of-max-HR formulas, the Karvonen method incorporates your Resting Heart Rate (RHR) to calculate your Heart Rate Reserve (HRR). This provides a much more personalized and accurate training range, as it accounts for your current cardiovascular fitness level.
Zone 1 (50-60%): Very Light. Ideal for active recovery and warm-ups. Improves overall health but doesn't significantly boost performance.
Zone 2 (60-70%): Light (Fat Burning). The "Aerobic Base" zone. Great for weight loss and building endurance for long-duration activities.
Zone 3 (70-80%): Moderate (Aerobic). Improves aerobic capacity and efficiency. This is the "Tempo" zone where you begin to feel the challenge.
Zone 4 (80-90%): Hard (Threshold). Increases lactate threshold and speed. High-intensity training that can only be sustained for shorter periods.
Zone 5 (90-100%): Maximum (Anaerobic). Peak performance and sprint interval training. Reserved for short bursts of maximum effort.
Example Calculation
Consider a 30-year-old athlete with a resting heart rate of 60 BPM:
Max HR: 220 – 30 = 190 BPM
HRR: 190 – 60 = 130 BPM
70% Intensity Target: (130 * 0.70) + 60 = 151 BPM
By using the Karvonen method, this athlete knows that 151 BPM is the starting point for their Zone 3 training, whereas a generic formula might suggest a much lower or higher number that doesn't account for their resting heart rate.
function calculateKarvonen() {
var age = document.getElementById('age').value;
var rhr = document.getElementById('rhr').value;
if (!age || !rhr || age <= 0 || rhr <= 0) {
alert("Please enter valid positive numbers for Age and Resting Heart Rate.");
return;
}
age = parseFloat(age);
rhr = parseFloat(rhr);
// Standard formula: Max HR = 220 – age
var mhr = 220 – age;
var hrr = mhr – rhr;
if (hrr <= 0) {
alert("Resting Heart Rate cannot be higher than Maximum Heart Rate. Please check your inputs.");
return;
}
document.getElementById('res-mhr').innerText = mhr;
document.getElementById('res-hrr').innerText = hrr;
var zones = [
{ name: "Zone 1", label: "Recovery", min: 0.50, max: 0.60, color: "#3498db" },
{ name: "Zone 2", label: "Aerobic / Fat Burn", min: 0.60, max: 0.70, color: "#2ecc71" },
{ name: "Zone 3", label: "Tempo / Moderate", min: 0.70, max: 0.80, color: "#f1c40f" },
{ name: "Zone 4", label: "Threshold / Hard", min: 0.80, max: 0.90, color: "#e67e22" },
{ name: "Zone 5", label: "Anaerobic / Max", min: 0.90, max: 1.00, color: "#c0392b" }
];
var tableBody = document.getElementById('zone-table-body');
tableBody.innerHTML = "";
for (var i = 0; i < zones.length; i++) {
var zone = zones[i];
var lowBpm = Math.round((hrr * zone.min) + rhr);
var highBpm = Math.round((hrr * zone.max) + rhr);
var row = document.createElement('tr');
row.style.borderBottom = "1px solid #eee";
var cell1 = document.createElement('td');
cell1.style.padding = "12px";
cell1.innerHTML = '' + zone.name + '';
var cell2 = document.createElement('td');
cell2.style.padding = "12px";
cell2.innerText = zone.label + " (" + (zone.min * 100) + "-" + (zone.max * 100) + "%)";
var cell3 = document.createElement('td');
cell3.style.padding = "12px";
cell3.style.textAlign = "center";
cell3.innerHTML = '' + lowBpm + ' – ' + highBpm + ' BPM';
row.appendChild(cell1);
row.appendChild(cell2);
row.appendChild(cell3);
tableBody.appendChild(row);
}
document.getElementById('results-area').style.display = "block";
document.getElementById('results-area').scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}