Heart Rate Zone Calculator for Runners

Heart Rate Zone Calculator for Runners

Optimize your training using the Karvonen Formula

If you don't know your Max HR, we will estimate it based on your age.

Your Personalized Running Zones

Zone Intensity Range (BPM) Purpose

Heart Rate Reserve (HRR): BPM

Estimated Max HR: BPM

How to Use Heart Rate Zones for Running

Targeting specific heart rate zones allows runners to train different energy systems and improve cardiovascular efficiency without overtraining. This calculator uses the Karvonen Formula, which is widely considered more accurate for athletes because it incorporates your Resting Heart Rate (RHR) to determine your Heart Rate Reserve (HRR).

The 5 Running Zones Explained

  • Zone 1 (50-60% HRR): Recovery. Ideal for active recovery days and warming up. It feels very easy, and you should be able to maintain a full conversation effortlessly.
  • Zone 2 (60-70% HRR): Aerobic/Endurance. This is the "Base Training" zone. Most of your weekly mileage should be in this zone to build mitochondrial density and fat-burning efficiency.
  • Zone 3 (70-80% HRR): Tempo. Improves aerobic capacity. This is "comfortably hard" pacing, often used for marathon-pace workouts.
  • Zone 4 (80-90% HRR): Lactate Threshold. This is where you improve your speed endurance. You can only say short sentences; breathing is heavy.
  • Zone 5 (90-100% HRR): Anaerobic/Maximum. Sprints and high-intensity intervals. This improves top-end speed and VO2 max.

Calculation Example

If a 30-year-old runner has a resting heart rate of 60 BPM:

  1. Estimated Max HR = 220 – 30 = 190 BPM.
  2. Heart Rate Reserve (HRR) = 190 – 60 = 130 BPM.
  3. Zone 2 Lower Limit (60%) = (130 * 0.60) + 60 = 138 BPM.
function calculateHRZones() { var age = document.getElementById('runnerAge').value; var restingHR = document.getElementById('restingHR').value; var manualMaxHR = document.getElementById('maxHR').value; var resultsDiv = document.getElementById('hrResults'); var tableBody = document.getElementById('zoneTableBody'); if (!age || !restingHR) { alert("Please enter your Age and Resting Heart Rate."); return; } var ageNum = parseFloat(age); var rhrNum = parseFloat(restingHR); var maxHR; if (manualMaxHR && manualMaxHR > 0) { maxHR = parseFloat(manualMaxHR); } else { maxHR = 220 – ageNum; } var hrr = maxHR – rhrNum; if (hrr <= 0) { alert("Max Heart Rate must be higher than Resting Heart Rate. Please check your inputs."); return; } var zones = [ { name: "Zone 1", label: "Very Light", low: 0.50, high: 0.60, color: "#a8dadc", goal: "Recovery & Warm-up" }, { name: "Zone 2", label: "Light", low: 0.60, high: 0.70, color: "#457b9d", goal: "Endurance & Fat Burn" }, { name: "Zone 3", label: "Moderate", low: 0.70, high: 0.80, color: "#1d3557", goal: "Aerobic Capacity" }, { name: "Zone 4", label: "Hard", low: 0.80, high: 0.90, color: "#f4a261", goal: "Lactate Threshold" }, { name: "Zone 5", label: "Maximum", low: 0.90, high: 1.00, color: "#e63946", goal: "Sprints & VO2 Max" } ]; var html = ""; for (var i = 0; i < zones.length; i++) { var z = zones[i]; var lowBpm = Math.round((hrr * z.low) + rhrNum); var highBpm = Math.round((hrr * z.high) + rhrNum); html += ""; html += "" + z.name + ""; html += "" + z.label + ""; html += "" + lowBpm + " – " + highBpm + " BPM"; html += "" + z.goal + ""; html += ""; } tableBody.innerHTML = html; document.getElementById('hrrValue').innerText = hrr; document.getElementById('finalMaxHR').innerText = maxHR; resultsDiv.style.display = "block"; resultsDiv.scrollIntoView({ behavior: 'smooth' }); }

Leave a Comment