Calculating Heart Rate Zones for Running

Heart Rate Zone Calculator for Runners

Karvonen Formula (Recommended – Uses Resting HR) Standard Formula (Percentage of Max HR Only)

Your Personalized Training Zones

Zone Intensity Range (BPM) Purpose

How to Calculate Your Heart Rate Zones for Running

Understanding your heart rate (HR) zones is essential for any runner looking to train efficiently. Whether you are training for your first 5K or chasing a Boston Qualifying marathon time, running at the correct intensity ensures you are stimulating the right physiological systems while minimizing the risk of overtraining.

The Karvonen Formula vs. Standard Percentages

Most basic calculators use the standard formula (220 – Age) to determine your maximum heart rate and then apply simple percentages. However, the Karvonen Formula is widely considered more accurate for athletes because it incorporates your Heart Rate Reserve (HRR). HRR is the difference between your maximum heart rate and your resting heart rate. By including your resting pulse, the formula accounts for your current cardiovascular fitness level.

The Five Running Zones Explained

  • Zone 1: Very Light (50-60%) – Used for warm-ups, cool-downs, and active recovery days. You should be able to hold a full conversation easily.
  • Zone 2: Light/Aerobic (60-70%) – The "fat-burning" zone. This is where most of your base mileage should occur. It builds endurance and strengthens the heart.
  • Zone 3: Moderate/Tempo (70-80%) – Improves aerobic power and efficiency. This pace is "comfortably hard."
  • Zone 4: Hard/Threshold (80-90%) – Enhances anaerobic capacity and raises your lactate threshold. Your breathing will be heavy, and you can only speak in short phrases.
  • Zone 5: Maximum (90-100%) – Used for high-intensity intervals and sprints. This effort is only sustainable for very short bursts.

Calculation Example

Imagine a 30-year-old runner with a resting heart rate of 60 BPM. Using the Tanaka formula for a more precise Max HR estimate (208 – 0.7 * Age), their estimated Max HR is 187 BPM. Using the Karvonen method for Zone 2 (60% to 70%):

  1. Max HR (187) – Resting HR (60) = Heart Rate Reserve (127)
  2. (127 * 0.60) + 60 = 136 BPM
  3. (127 * 0.70) + 60 = 149 BPM

Therefore, their Zone 2 range is 136 to 149 beats per minute.

function calculateHRZones() { var age = parseFloat(document.getElementById('runnerAge').value); var restingHR = parseFloat(document.getElementById('restingHR').value); var method = document.getElementById('calcMethod').value; var resultDiv = document.getElementById('hrResults'); var tableBody = document.getElementById('zoneTableBody'); var maxHRElement = document.getElementById('maxHREstimate'); if (isNaN(age) || age 120) { alert("Please enter a valid age."); return; } if (isNaN(restingHR) || restingHR 120) { alert("Please enter a realistic resting heart rate (30-120 BPM)."); return; } // Tanaka Formula for Max HR (more accurate than 220-age for many) var maxHR = 208 – (0.7 * age); var hrr = maxHR – restingHR; maxHRElement.innerHTML = "Estimated Maximum Heart Rate: " + Math.round(maxHR) + " BPM"; var zones = [ { name: "Zone 1", label: "Recovery", min: 0.50, max: 0.60, color: "#3498db", desc: "Warm-up / Recovery" }, { name: "Zone 2", label: "Aerobic", min: 0.60, max: 0.70, color: "#2ecc71", desc: "Endurance / Base Training" }, { name: "Zone 3", label: "Tempo", min: 0.70, max: 0.80, color: "#f1c40f", desc: "Aerobic Power" }, { name: "Zone 4", label: "Threshold", min: 0.80, max: 0.90, color: "#e67e22", desc: "Lactate Threshold Training" }, { name: "Zone 5", label: "Anaerobic", min: 0.90, max: 1.00, color: "#e74c3c", desc: "Sprints / Max Effort" } ]; var html = ""; for (var i = 0; i < zones.length; i++) { var zoneMin, zoneMax; if (method === "karvonen") { zoneMin = Math.round((hrr * zones[i].min) + restingHR); zoneMax = Math.round((hrr * zones[i].max) + restingHR); } else { zoneMin = Math.round(maxHR * zones[i].min); zoneMax = Math.round(maxHR * zones[i].max); } html += ""; html += "" + zones[i].name + ""; html += "" + zones[i].label + " (" + (zones[i].min * 100) + "-" + (zones[i].max * 100) + "%)"; html += "" + zoneMin + " – " + zoneMax + " BPM"; html += "" + zones[i].desc + ""; html += ""; } tableBody.innerHTML = html; resultDiv.style.display = "block"; // Smooth scroll to results resultDiv.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }

Leave a Comment