How to Calculate Your Training Heart Rate Zones

Training Heart Rate Zone Calculator

Heart Rate Zone Calculator (Karvonen Method)

Enter your details to discover your personalized training intensity zones.

Best measured upon waking up.

Your Personal Training Zones

Estimated Max HR: bpm
Heart Rate Reserve: bpm
Zone Intensity Target Range (BPM) Benefit

How to Calculate Your Training Heart Rate Zones

Training by heart rate is one of the most effective ways to ensure you are working at the right intensity to achieve specific fitness goals. Whether you are training for a marathon, looking to burn fat, or improving your cardiovascular health, understanding your heart rate zones is essential. This calculator uses the Karvonen Formula, widely considered the most accurate method for determining training zones because it accounts for your resting heart rate (RHR), unlike simpler methods that only look at age.

Understanding the Variables

To accurately calculate your zones, you need to understand three key numbers:

  • Maximum Heart Rate (MHR): The highest number of beats per minute your heart can reach during maximum physical exertion. The standard formula is 220 minus your age, though a clinical stress test is the gold standard for accuracy.
  • Resting Heart Rate (RHR): Your heart rate when you are completely at rest. The best time to measure this is in the morning, right after waking up, before getting out of bed. A lower RHR generally indicates better aerobic fitness.
  • Heart Rate Reserve (HRR): This is the difference between your Maximum Heart Rate and your Resting Heart Rate (MHR – RHR). It represents the cushion of heartbeats available for exercise.

The 5 Training Zones Explained

Zone 1: Very Light (50% – 60%)

Feeling: Very easy, comfortable breathing.
Benefit: Warm-up, cool-down, and active recovery. This zone helps blood flow and aids in muscle recovery without adding fatigue.

Zone 2: Light (60% – 70%)

Feeling: Comfortable, conversational pace.
Benefit: Basic endurance and fat burning. This is often called the "aerobic base" zone. Training here improves your body's ability to use fat as a fuel source and builds mitochondrial density.

Zone 3: Moderate (70% – 80%)

Feeling: Moderate strain, breathing becomes heavier, harder to hold a conversation.
Benefit: Improves aerobic capacity and blood circulation. This is effectively the "tempo" zone where you build the ability to sustain faster paces for longer durations.

Zone 4: Hard (80% – 90%)

Feeling: Heavy breathing, muscle fatigue sets in, difficult to speak.
Benefit: Increases anaerobic threshold (lactate threshold). Training here teaches your body to process lactic acid more efficiently, allowing you to perform at high intensities for longer.

Zone 5: Maximum (90% – 100%)

Feeling: Gasping for air, very painful, sustainable for only short bursts.
Benefit: Max effort intervals. This zone improves maximum sprinting speed and neuromuscular coordination. It is extremely taxing and should be used sparingly.

Why Use the Karvonen Formula?

The standard "220 – Age" formula multiplied by a percentage often underestimates the target heart rate for fit individuals because it ignores resting heart rate. For example, if two people have the same max heart rate but one has a resting heart rate of 50 (fit) and the other 80 (sedentary), their training intensities should differ.

The Karvonen formula calculates the target heart rate as:

Target HR = ((Max HR − Resting HR) × %Intensity) + Resting HR

This ensures that the training zones are scaled to your specific cardiovascular profile, making your workouts safer and more effective.

function calculateZones() { // 1. Get Input Values var ageInput = document.getElementById("hr_age").value; var rhrInput = document.getElementById("hr_resting").value; var maxHrInput = document.getElementById("hr_max_custom").value; // 2. Validation if (ageInput === "" || rhrInput === "") { alert("Please enter both your Age and Resting Heart Rate."); return; } var age = parseFloat(ageInput); var rhr = parseFloat(rhrInput); var customMax = parseFloat(maxHrInput); if (isNaN(age) || age 120) { alert("Please enter a valid age."); return; } if (isNaN(rhr) || rhr 200) { alert("Please enter a valid resting heart rate."); return; } // 3. Logic: Calculate Max HR and Heart Rate Reserve var maxHr = 220 – age; if (!isNaN(customMax) && customMax > 0) { maxHr = customMax; } // Safety check: RHR cannot be greater than Max HR if (rhr >= maxHr) { alert("Resting Heart Rate cannot be higher than or equal to Maximum Heart Rate."); return; } var hrr = maxHr – rhr; // Heart Rate Reserve // 4. Calculate Karvonen Zones // Formula: (HRR * %) + RHR // Zone 1: 50-60% var z1_min = Math.round((hrr * 0.50) + rhr); var z1_max = Math.round((hrr * 0.60) + rhr); // Zone 2: 60-70% var z2_min = Math.round((hrr * 0.60) + rhr); var z2_max = Math.round((hrr * 0.70) + rhr); // Zone 3: 70-80% var z3_min = Math.round((hrr * 0.70) + rhr); var z3_max = Math.round((hrr * 0.80) + rhr); // Zone 4: 80-90% var z4_min = Math.round((hrr * 0.80) + rhr); var z4_max = Math.round((hrr * 0.90) + rhr); // Zone 5: 90-100% var z5_min = Math.round((hrr * 0.90) + rhr); var z5_max = maxHr; // 5. Update UI document.getElementById("display_max_hr").innerHTML = maxHr; document.getElementById("display_hrr").innerHTML = hrr; var tableHtml = ""; // Helper to create rows function createRow(zone, color, intensity, range, benefit) { return '' + '' + zone + '' + '' + intensity + '' + '' + range + ' bpm' + '' + benefit + '' + ''; } tableHtml += createRow("Zone 1", "#9e9e9e", "50% – 60%", z1_min + " – " + z1_max, "Warm up / Recovery"); tableHtml += createRow("Zone 2", "#1976d2", "60% – 70%", z2_min + " – " + z2_max, "Fat Burning / Base"); tableHtml += createRow("Zone 3", "#388e3c", "70% – 80%", z3_min + " – " + z3_max, "Aerobic Fitness"); tableHtml += createRow("Zone 4", "#f57c00", "80% – 90%", z4_min + " – " + z4_max, "Anaerobic Threshold"); tableHtml += createRow("Zone 5", "#d32f2f", "90% – 100%", z5_min + " – " + z5_max, "Maximum Effort"); document.getElementById("zones_table_body").innerHTML = tableHtml; document.getElementById("hr_results").style.display = "block"; }

Leave a Comment