Optimize your training using the Karvonen Formula (Heart Rate Reserve)
Please enter valid numbers for Age and Resting Heart Rate.
Karvonen (Most Accurate)
Percentage of Max HR
Your Personalized Training Zones
Based on a Maximum Heart Rate of BPM.
Zone
Range (BPM)
Training Benefit
How to Use This Cycling HR Calculator
Training by heart rate is one of the most effective ways for cyclists to improve endurance, increase speed, and avoid overtraining. This calculator utilizes the Karvonen Formula, which considers your Heart Rate Reserve (HRR)—the difference between your maximum and resting heart rate. This is generally more accurate than simple percentages because it accounts for individual fitness levels reflected in your resting heart rate.
The Five Cycling Intensity Zones
Zone 1 (Recovery): Very light intensity. Used for active recovery after hard efforts or long rides. Improves blood flow without causing fatigue.
Zone 2 (Endurance/Base): The "bread and butter" of cycling. This is where you build aerobic capacity and train your body to burn fat efficiently. You should be able to hold a conversation.
Zone 3 (Tempo): Moderate intensity. Requires more focus. It improves aerobic power but requires more recovery time than Zone 2.
Zone 4 (Lactate Threshold): High intensity. This is your "Time Trial" effort. Training here increases the point at which your muscles start to burn from lactic acid.
Zone 5 (Anaerobic): Maximum effort. Used for sprints and short climbs. Improves top-end speed and VO2 max.
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 (60% to 70%): (120 * 0.6) + 60 = 132 BPM to (120 * 0.7) + 60 = 144 BPM.
Important Considerations
While formulas like "220 minus age" provide a baseline, they can vary by 10-20 beats per minute. For the most accurate cycling zones, perform a Functional Threshold Heart Rate (FTHR) test or a maximum effort ramp test on your bike. Always consult a physician before starting a high-intensity training program.
function calculateZones() {
var age = parseFloat(document.getElementById("userAge").value);
var restingHR = parseFloat(document.getElementById("restingHR").value);
var manualMaxHR = parseFloat(document.getElementById("maxHR").value);
var method = document.getElementById("method").value;
var errorBox = document.getElementById("errorBox");
var resultsSection = document.getElementById("resultsSection");
var zoneBody = document.getElementById("zoneBody");
var displayMaxHR = document.getElementById("displayMaxHR");
// Reset view
errorBox.style.display = "none";
resultsSection.style.display = "none";
zoneBody.innerHTML = "";
// Validation
if (isNaN(age) || age 110) {
errorBox.textContent = "Please enter a valid age.";
errorBox.style.display = "block";
return;
}
if (isNaN(restingHR) || restingHR 120) {
errorBox.textContent = "Please enter a realistic resting heart rate (30-120 BPM).";
errorBox.style.display = "block";
return;
}
var mhr;
if (!isNaN(manualMaxHR) && manualMaxHR > 100) {
mhr = manualMaxHR;
} else {
mhr = 220 – age;
}
displayMaxHR.textContent = Math.round(mhr);
var hrr = mhr – restingHR;
var zones = [
{ name: "Zone 1: Active Recovery", low: 0.50, high: 0.60, class: "zone-1", benefit: "Recovery & Metabolism" },
{ name: "Zone 2: Endurance", low: 0.60, high: 0.70, class: "zone-2", benefit: "Aerobic Base & Fat Burn" },
{ name: "Zone 3: Tempo", low: 0.70, high: 0.80, class: "zone-3", benefit: "Aerobic Power" },
{ name: "Zone 4: Threshold", low: 0.80, high: 0.90, class: "zone-4", benefit: "Lactate Threshold / Speed" },
{ name: "Zone 5: Anaerobic", low: 0.90, high: 1.00, class: "zone-5", benefit: "Max Performance / VO2 Max" }
];
var html = "";
for (var i = 0; i < zones.length; i++) {
var zLow, zHigh;
if (method === "karvonen") {
zLow = (hrr * zones[i].low) + restingHR;
zHigh = (hrr * zones[i].high) + restingHR;
} else {
zLow = mhr * zones[i].low;
zHigh = mhr * zones[i].high;
}
html += "