Calculate your optimal training zones using the Karvonen Formula
Measure your pulse for 60 seconds while completely relaxed (optional).
Your Heart Rate Profile
Maximum Heart Rate (MHR)
— BPM
Heart Rate Reserve (HRR)
— BPM
Training Zones
Zone / Intensity
Target Range (BPM)
Benefit
Understanding Your Target Heart Rate
Calculating your target heart rate zones is essential for effective cardiovascular training. Whether your goal is fat loss, endurance building, or athletic performance, training in the correct "zone" ensures you are stimulating the right energy systems in your body.
How This Calculator Works
This calculator utilizes the Karvonen Formula when a resting heart rate is provided. This is widely considered more accurate than standard percentages because it takes into account your individual fitness level (represented by your resting heart rate).
Maximum Heart Rate (MHR): Estimated as 220 – Age. This represents the fastest your heart can beat safely.
Heart Rate Reserve (HRR): The difference between your Maximum Heart Rate and your Resting Heart Rate.
Zone 1 (50-60%): Very Light. Ideal for warm-ups, cool-downs, and active recovery. It improves overall health and helps recovery.
Zone 2 (60-70%): Light. Often called the "Fat Burning Zone." At this intensity, your body primarily uses fat for fuel. It builds basic endurance and aerobic capacity.
Zone 3 (70-80%): Moderate. The "Aerobic Zone." Improves blood circulation and efficiency of the heart. You will start breathing harder and sweating more.
Zone 4 (80-90%): Hard. The "Anaerobic Zone." Increases maximum performance capacity. Your body creates lactic acid faster than it can flush it out.
Zone 5 (90-100%): Maximum. For elite athletic interval training. Can only be sustained for very short periods.
When to Measure Resting Heart Rate
For the most accurate results, measure your resting heart rate (RHR) in the morning right after you wake up, before getting out of bed. An average adult has an RHR between 60 and 100 beats per minute, while conditioned athletes may be between 40 and 60 bpm.
function calculateHeartRateZones() {
// 1. Get Input Values
var ageInput = document.getElementById('hrAge').value;
var rhrInput = document.getElementById('hrResting').value;
var resultsDiv = document.getElementById('hrResults');
// 2. Validate Age
if (!ageInput || isNaN(ageInput)) {
alert("Please enter a valid age.");
return;
}
var age = parseInt(ageInput);
if (age 120) {
alert("Please enter a realistic age between 1 and 120.");
return;
}
// 3. Handle Resting Heart Rate (Optional)
var rhr = 0;
var useKarvonen = false;
if (rhrInput && !isNaN(rhrInput)) {
rhr = parseInt(rhrInput);
if (rhr 200) {
alert("Please enter a realistic Resting Heart Rate (30-200 BPM) or leave it blank.");
return;
}
useKarvonen = true;
}
// 4. Calculate Max Heart Rate (Standard Formula: 220 – Age)
var maxHr = 220 – age;
var hrr = 0; // Heart Rate Reserve
if (useKarvonen) {
hrr = maxHr – rhr;
} else {
// If no RHR provided, HRR isn't really used for calculation,
// but we calculate zones based on straight % of Max HR.
hrr = maxHr; // Simplification for display logic, though formula differs
}
// 5. Update Summary Display
document.getElementById('dispMHR').innerText = maxHr + " BPM";
if (useKarvonen) {
document.getElementById('dispHRR').innerText = hrr + " BPM";
} else {
document.getElementById('dispHRR').innerText = "N/A (No RHR)";
}
// 6. Define Zones Data
// Zones: 1 (50-60), 2 (60-70), 3 (70-80), 4 (80-90), 5 (90-100)
var zones = [
{ pctMin: 0.50, pctMax: 0.60, name: "Zone 1 (Very Light)", benefit: "Warm up, Recovery", css: "zone-1" },
{ pctMin: 0.60, pctMax: 0.70, name: "Zone 2 (Light)", benefit: "Fat Burn, Endurance", css: "zone-2" },
{ pctMin: 0.70, pctMax: 0.80, name: "Zone 3 (Moderate)", benefit: "Aerobic Capacity", css: "zone-3" },
{ pctMin: 0.80, pctMax: 0.90, name: "Zone 4 (Hard)", benefit: "Anaerobic Threshold", css: "zone-4" },
{ pctMin: 0.90, pctMax: 1.00, name: "Zone 5 (Maximum)", benefit: "Peak Performance", css: "zone-5" }
];
var tableHtml = "";
// 7. Calculate and Build Table
for (var i = 0; i < zones.length; i++) {
var z = zones[i];
var minBpm, maxBpm;
if (useKarvonen) {
// Karvonen: Target = ((Max – Resting) * %) + Resting
minBpm = Math.round((hrr * z.pctMin) + rhr);
maxBpm = Math.round((hrr * z.pctMax) + rhr);
} else {
// Standard: Target = Max * %
minBpm = Math.round(maxHr * z.pctMin);
maxBpm = Math.round(maxHr * z.pctMax);
}
tableHtml += "
";
tableHtml += "
" + z.name + "
";
tableHtml += "
" + minBpm + " – " + maxBpm + " bpm
";
tableHtml += "
" + z.benefit + "
";
tableHtml += "
";
}
document.getElementById('zonesTableBody').innerHTML = tableHtml;
// 8. Show Results
resultsDiv.style.display = "block";
// Scroll to results on mobile
resultsDiv.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}