Calculate your Lactate Threshold Heart Rate (LTHR) and Training Zones
I have 30-min Time Trial Data (Most Accurate)
Estimate based on Age (Approximation)
Enter the average BPM from the final 20 minutes of a solo 30-minute all-out effort.
Beginner / Untrained
Recreational Runner (Average)
Competitive Runner
Elite Athlete
Estimates LTHR as a percentage of your calculated Max HR (Tanaka Formula).
Your Lactate Threshold Heart Rate (LTHR)— bpm
Your Running Training Zones (Joe Friel System)
Zone
Name
Range (BPM)
Description
What is Threshold Heart Rate for Running?
Threshold Heart Rate, often referred to as Lactate Threshold Heart Rate (LTHR), is the specific heart rate intensity at which lactate begins to accumulate in the bloodstream faster than your body can remove it. For runners, this is arguably the most critical metric for defining training zones.
Unlike Max Heart Rate, which is genetic and doesn't change much with fitness, your LTHR changes as you become fitter. A higher LTHR allows you to run faster for longer periods before fatigue sets in. This calculator uses the standard Joe Friel 7-Zone system designed specifically for running, which provides more granularity than generic 5-zone models.
The Gold Standard Test: The most accurate way to find your LTHR without a lab is the 30-Minute Time Trial. Run alone on a flat course as hard as you can sustain for 30 minutes. Your LTHR is the average heart rate of the last 20 minutes of that run.
Understanding the Running Zones
Training at the correct intensity ensures you aren't running "junk miles"—too fast for recovery but too slow to produce physiological adaptations. Here is how the zones break down:
Zone 1 (Recovery): Very easy effort used for warm-ups, cool-downs, and active recovery runs.
Zone 2 (Aerobic): The foundation of endurance. You should be able to hold a conversation. Most of your weekly mileage should be here.
Zone 3 (Tempo): "Comfortably hard." Requires focus to maintain but isn't an all-out sprint. Good for marathon prep.
Zone 4 (Sub-Threshold): Just below your red line. Used to push up your lactate threshold.
Zone 5a (Super-Threshold): Slightly above threshold. Sustainable for only short durations (intervals).
Zone 5b (Aerobic Capacity): VO2 Max territory. Very hard breathing, sustainable for minutes only.
Zone 5c (Anaerobic Capacity): Sprinting power. Neuromuscular training.
Why Not Use Just Age?
While our calculator offers an age-based estimation, it is a statistical average. The "220 minus age" or "Tanaka" formulas calculate Maximum Heart Rate, not Threshold. While we can estimate Threshold as roughly 90% of Max for an average runner, individual variance is huge.
For example, two 40-year-old runners might both have a Max HR of 180. However, the trained runner might have an LTHR of 170 (94% of max), while the beginner might have an LTHR of 153 (85% of max). Using the Field Test method ensures your zones are customized to your current physiology.
How to Use These Numbers
Perform the 30-minute solo time trial to get your input number.
Input the average heart rate from the last 20 minutes above.
Set these zones on your GPS watch (Garmin, Coros, Polar, etc.).
Retest every 6-8 weeks, as your LTHR will likely increase with fitness.
function toggleInputs() {
var method = document.getElementById('calcMethod').value;
var testSection = document.getElementById('input-test-section');
var ageSection = document.getElementById('input-age-section');
if (method === 'test') {
testSection.style.display = 'block';
ageSection.style.display = 'none';
} else {
testSection.style.display = 'none';
ageSection.style.display = 'block';
}
// Hide results when switching methods to avoid confusion
document.getElementById('results-area').style.display = 'none';
}
function calculateRunningZones() {
var method = document.getElementById('calcMethod').value;
var lthr = 0;
if (method === 'test') {
var inputHr = document.getElementById('avgHrTest').value;
if (!inputHr || inputHr 250) {
alert("Please enter a valid Average Heart Rate (between 30 and 250 bpm).");
return;
}
lthr = parseFloat(inputHr);
} else {
var age = document.getElementById('runnerAge').value;
var fitnessFactor = document.getElementById('fitnessLevel').value;
if (!age || age 120) {
alert("Please enter a valid age.");
return;
}
// Tanaka Formula for Max HR
var maxHr = 208 – (0.7 * parseFloat(age));
// Estimate LTHR based on fitness level percentage of Max HR
lthr = Math.round(maxHr * parseFloat(fitnessFactor));
}
// Display LTHR
lthr = Math.round(lthr);
document.getElementById('lthrResult').innerText = lthr + " bpm";
// Calculate Friel Running Zones
// Zone 1: 106%
var z1_upper = Math.floor(lthr * 0.85) – 1;
var z2_lower = Math.floor(lthr * 0.85);
var z2_upper = Math.floor(lthr * 0.89);
var z3_lower = Math.floor(lthr * 0.90);
var z3_upper = Math.floor(lthr * 0.94);
var z4_lower = Math.floor(lthr * 0.95);
var z4_upper = Math.floor(lthr * 0.99);
var z5a_lower = lthr; // 100%
var z5a_upper = Math.floor(lthr * 1.02);
var z5b_lower = Math.floor(lthr * 1.03);
var z5b_upper = Math.floor(lthr * 1.06);
var z5c_lower = Math.floor(lthr * 1.07);
var zonesHTML = `