Optimize your training using the Karvonen Formula (Heart Rate Reserve)
Estimated Max Heart Rate
—
BPM (Beats Per Minute)
Zone
Intensity
Range (BPM)
Zone 1
Active Recovery (50-60%)
—
Zone 2
Endurance (60-70%)
—
Zone 3
Tempo (70-80%)
—
Zone 4
Lactate Threshold (80-90%)
—
Zone 5
VO2 Max (90-100%)
—
How to Use This Calculator
This calculator uses the Karvonen Formula, which is widely considered more accurate for cyclists than simple percentages because it accounts for your Heart Rate Reserve (HRR). By including your resting heart rate, the zones are tailored to your specific cardiovascular fitness level.
Understanding Your Cycling Zones
To become a faster, more efficient cyclist, you need to train at different intensities. Here is what each zone means for your performance:
Zone 1 (Active Recovery): Very easy effort. Used for recovery rides after hard races or intervals. It flushes out metabolic waste without adding fatigue.
Zone 2 (Endurance): This is your "all-day" pace. Training here builds mitochondrial density and teaches your body to burn fat efficiently. Most of your weekly mileage should be here.
Zone 3 (Tempo): A moderate effort where conversation becomes difficult. Great for building aerobic power but requires more recovery than Zone 2.
Zone 4 (Lactate Threshold): The "sweet spot" and threshold range. This is the pace you could sustain for about 40-60 minutes in a time trial. Essential for climbing and racing.
Zone 5 (VO2 Max): Maximal effort. Used for short intervals (3-8 minutes) to increase your ceiling for oxygen consumption and explosive power.
Example Calculation
If a 40-year-old cyclist has a resting heart rate of 60 BPM:
Estimated Max HR: 220 – 40 = 180 BPM
Heart Rate Reserve (HRR): 180 – 60 = 120 BPM
Zone 2 Lower Limit: (120 * 0.60) + 60 = 132 BPM
Zone 2 Upper Limit: (120 * 0.70) + 60 = 144 BPM
The resulting Zone 2 for this cyclist would be 132 to 144 beats per minute.
function calculateCyclingZones() {
var age = document.getElementById("cyclistAge").value;
var resting = document.getElementById("restingHR").value;
if (!age || !resting || age <= 0 || resting <= 0) {
alert("Please enter valid positive numbers for both age and resting heart rate.");
return;
}
// Standard Max HR Formula (220 – age)
var maxHR = 220 – age;
var hrr = maxHR – resting;
if (hrr <= 0) {
alert("Resting heart rate cannot be higher than maximum heart rate. Please check your inputs.");
return;
}
// Display Max HR
document.getElementById("maxHRDisplay").innerHTML = maxHR;
// Karvonen Formula: ((Max HR – Rest HR) * %Intensity) + Rest HR
// Zone 1: 50% to 60%
var z1Low = Math.round((hrr * 0.50) + parseInt(resting));
var z1High = Math.round((hrr * 0.60) + parseInt(resting));
document.getElementById("z1-range").innerHTML = z1Low + " – " + z1High + " BPM";
// Zone 2: 60% to 70%
var z2Low = Math.round((hrr * 0.60) + parseInt(resting));
var z2High = Math.round((hrr * 0.70) + parseInt(resting));
document.getElementById("z2-range").innerHTML = z2Low + " – " + z2High + " BPM";
// Zone 3: 70% to 80%
var z3Low = Math.round((hrr * 0.70) + parseInt(resting));
var z3High = Math.round((hrr * 0.80) + parseInt(resting));
document.getElementById("z3-range").innerHTML = z3Low + " – " + z3High + " BPM";
// Zone 4: 80% to 90%
var z4Low = Math.round((hrr * 0.80) + parseInt(resting));
var z4High = Math.round((hrr * 0.90) + parseInt(resting));
document.getElementById("z4-range").innerHTML = z4Low + " – " + z4High + " BPM";
// Zone 5: 90% to 100%
var z5Low = Math.round((hrr * 0.90) + parseInt(resting));
var z5High = maxHR;
document.getElementById("z5-range").innerHTML = z5Low + " – " + z5High + " BPM";
// Show the results table
document.getElementById("hr-results").style.display = "block";
// Smooth scroll to results
document.getElementById("hr-results").scrollIntoView({ behavior: 'smooth' });
}