Heart Rate Reserve Calculator Zones

Heart Rate Reserve (HRR) & Training Zones Calculator

If you have a clinically tested Max HR, enter it here. Otherwise, we'll estimate it.

Your Heart Rate Stats

Zone Intensity Target BPM Range
Note: These calculations use the Karvonen Formula, which is generally more accurate for athletes than the standard Max HR percentage method.

Understanding Heart Rate Reserve (HRR) and Training Zones

Heart Rate Reserve (HRR) represents the difference between your resting heart rate and your maximum heart rate. Unlike basic calculations that only look at your age, the HRR method (known as the Karvonen Formula) takes your individual fitness level into account by factoring in your Resting Heart Rate (RHR).

Why Use the Karvonen Formula?

Standard heart rate zone calculations use a simple percentage of your Maximum Heart Rate (MHR). However, this doesn't account for the fact that a marathon runner and a sedentary individual might have the same MHR but vastly different resting heart rates. By using HRR, your zones are tailored to your current cardiovascular efficiency.

The Mathematical Logic

The formula to find your Target Heart Rate (THR) for a specific intensity percentage is:

THR = [(Max HR − Resting HR) × % Intensity] + Resting HR

Training Zone Breakdowns

  • Zone 1 (50-60%): Very Light. Ideal for active recovery and warm-ups. Promotes blood flow without fatigue.
  • Zone 2 (60-70%): Light (Aerobic). The "fat-burning" zone. Improves basic endurance and metabolic efficiency.
  • Zone 3 (70-80%): Moderate (Tempo). Improves aerobic capacity and heart strength. You can talk but in short sentences.
  • Zone 4 (80-90%): Hard (Threshold). Increases anaerobic capacity. This is where you improve your speed and power.
  • Zone 5 (90-100%): Maximum (Redline). Sprints and high-intensity interval training (HIIT). Not sustainable for long periods.

Example Calculation

Imagine a 30-year-old with a Resting Heart Rate of 60 BPM:

  • Estimated Max HR: 220 – 30 = 190 BPM
  • Heart Rate Reserve (HRR): 190 – 60 = 130 BPM
  • 70% Intensity (Zone 3): (130 × 0.70) + 60 = 151 BPM
function calculateHRRZones() { var age = parseFloat(document.getElementById('userAge').value); var rhr = parseFloat(document.getElementById('restingHR').value); var customMax = parseFloat(document.getElementById('customMaxHR').value); if (isNaN(age) || age 120) { alert("Please enter a valid age."); return; } if (isNaN(rhr) || rhr 120) { alert("Please enter a realistic Resting Heart Rate (30-120 BPM)."); return; } var mhr; if (!isNaN(customMax) && customMax > 0) { mhr = customMax; } else { mhr = 220 – age; } if (rhr >= mhr) { alert("Resting Heart Rate must be lower than Maximum Heart Rate."); return; } var hrr = mhr – rhr; document.getElementById('statsSummary').innerHTML = "Max HR: " + mhr + " BPM | HR Reserve: " + hrr + " BPM"; var zones = [ { name: "Zone 1: Recovery", low: 0.50, high: 0.60, color: "#e8f5e9" }, { name: "Zone 2: Aerobic", low: 0.60, high: 0.70, color: "#fff9c4" }, { name: "Zone 3: Tempo", low: 0.70, high: 0.80, color: "#ffe0b2" }, { name: "Zone 4: Threshold", low: 0.80, high: 0.90, color: "#ffccbc" }, { name: "Zone 5: Redline", low: 0.90, high: 1.00, color: "#ffcdd2" } ]; var tableBody = document.getElementById('zoneTableBody'); tableBody.innerHTML = ""; for (var i = 0; i < zones.length; i++) { var lowBpm = Math.round((hrr * zones[i].low) + rhr); var highBpm = Math.round((hrr * zones[i].high) + rhr); var row = document.createElement('tr'); row.style.borderBottom = "1px solid #eee"; row.style.backgroundColor = zones[i].color; var cell1 = document.createElement('td'); cell1.style.padding = "12px"; cell1.style.fontWeight = "bold"; cell1.innerHTML = zones[i].name; var cell2 = document.createElement('td'); cell2.style.padding = "12px"; cell2.innerHTML = (zones[i].low * 100) + "% – " + (zones[i].high * 100) + "%"; var cell3 = document.createElement('td'); cell3.style.padding = "12px"; cell3.style.textAlign = "right"; cell3.style.fontWeight = "bold"; cell3.innerHTML = lowBpm + " – " + highBpm + " BPM"; row.appendChild(cell1); row.appendChild(cell2); row.appendChild(cell3); tableBody.appendChild(row); } document.getElementById('hrr-results').style.display = "block"; document.getElementById('hrr-results').scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }

Leave a Comment