Used for Heart Rate Reserve (Karvonen) calculation.
Tanaka (Recommended for Active)
Fox (220 – Age)
Hunt (Active Adults)
Gulati (Women Specific)
Estimated Max Heart Rate (MHR):– bpm
Heart Rate Reserve (HRR):– bpm
Cycling Training Zones
Zone
Intensity
Heart Rate Range (bpm)
Cycling Focus
Master Your Training with the Cycling Max Heart Rate Calculator
Understanding your Maximum Heart Rate (MHR) is the cornerstone of effective cycling training. Whether you are training for a century ride, a criterium, or simply trying to improve your cardiovascular fitness, knowing your numbers allows you to train in the correct energy systems. This calculator uses scientifically validated formulas to estimate your MHR and generates specific cycling training zones.
Why Max Heart Rate Matters for Cyclists
Cycling is an aerobic sport that requires precision. Unlike running, where perceived exertion is often higher due to impact, cycling efficiency relies heavily on sustained power output within specific heart rate zones. By calculating your MHR, you can define these zones (Z1 to Z5) to ensure you aren't riding too hard on recovery days or too easy on interval days.
It is important to note that your Cycling Max Heart Rate is often 5-10 beats lower than your running max heart rate. This is because cycling is non-weight bearing and engages less total muscle mass than running. Our calculator provides a physiological ceiling estimate, which serves as an excellent baseline for setting your zones.
The Formulas Explained
We offer several formulas to tailor the estimation to your profile:
Tanaka (208 – 0.7 × Age): Widely considered the most accurate general formula for healthy adults. It smooths out the inaccuracies of the old "220-age" rule.
Fox (220 – Age): The traditional standard. While simple, it often underestimates MHR for older athletes and overestimates for younger ones.
Hunt (211 – 0.64 × Age): Specifically developed for active, fit individuals. If you are a regular cyclist, this may be more accurate.
Gulati (206 – 0.88 × Age): A formula derived specifically for women, offering better precision for female physiology.
Heart Rate Reserve (Karvonen Method)
If you know your Resting Heart Rate (RHR), enter it! The calculator will switch to the Karvonen Method. This is superior for cyclists because it accounts for your fitness level. It calculates zones based on your "Heart Rate Reserve" (Max HR minus Resting HR). A fit cyclist with a low resting heart rate has a larger reserve, and the Karvonen method adjusts the training zones upwards to reflect this capacity.
Understanding Your Cycling Zones
Zone 1 (Active Recovery): Very light spinning. Promotes blood flow and recovery without fatigue.
Zone 2 (Endurance): The "all day" pace. Builds mitochondrial efficiency and fat-burning capability.
Zone 3 (Tempo): Spirited riding. Improves aerobic capacity but generates some fatigue.
Zone 4 (Threshold): The "race pace" or time trial effort. Improves your ability to sustain high power and clear lactate.
Zone 5 (VO2 Max): Maximum effort sprints and short climbs. Increases top-end power and cardiac output.
function calculateCyclingZones() {
// 1. Get Inputs
var ageInput = document.getElementById('cyc_age');
var genderInput = document.getElementById('cyc_gender');
var rhrInput = document.getElementById('cyc_rhr');
var formulaInput = document.getElementById('cyc_formula');
var age = parseFloat(ageInput.value);
var gender = genderInput.value;
var rhr = parseFloat(rhrInput.value);
var formula = formulaInput.value;
// 2. Validation
if (isNaN(age) || age 120) {
alert("Please enter a valid age between 10 and 120.");
return;
}
// 3. Calculate MHR based on formula
var mhr = 0;
if (formula === 'fox') {
mhr = 220 – age;
} else if (formula === 'hunt') {
mhr = 211 – (0.64 * age);
} else if (formula === 'gulati') {
// Gulati is specifically for women, but if a man selects it, we apply it mathematically or fallback
if (gender === 'female') {
mhr = 206 – (0.88 * age);
} else {
// Fallback for male if they select Gulati (notify or switch to Tanaka)
// For simplicity in this logic, we use Tanaka for men if Gulati is selected
mhr = 208 – (0.7 * age);
}
} else {
// Default Tanaka
mhr = 208 – (0.7 * age);
}
mhr = Math.round(mhr);
// 4. Calculate Zones
// Define Zone Percentages (Standard Cycling Zones)
// Z1: 50-60%, Z2: 60-70%, Z3: 70-80%, Z4: 80-90%, Z5: 90-100%
var zones = [];
var useKarvonen = !isNaN(rhr) && rhr > 25 && rhr < mhr;
var methodText = "";
var hrr = 0;
if (useKarvonen) {
hrr = mhr – rhr;
methodText = "Zones calculated using Heart Rate Reserve (Karvonen method). Formula: ((MHR – RHR) × %) + RHR";
document.getElementById('display_hrr').innerText = hrr + " bpm";
document.getElementById('reserve_row').style.display = "flex";
// Karvonen Calculation
// Note: Karvonen percentages are often slightly different, but we map standard intensities to HRR
zones = [
{ name: "Zone 1", desc: "Active Recovery", minPct: 0.50, maxPct: 0.60, class: "cyc-zone-row-1" },
{ name: "Zone 2", desc: "Endurance", minPct: 0.60, maxPct: 0.70, class: "cyc-zone-row-2" },
{ name: "Zone 3", desc: "Tempo", minPct: 0.70, maxPct: 0.80, class: "cyc-zone-row-3" },
{ name: "Zone 4", desc: "Threshold", minPct: 0.80, maxPct: 0.90, class: "cyc-zone-row-4" },
{ name: "Zone 5", desc: "VO2 Max", minPct: 0.90, maxPct: 1.00, class: "cyc-zone-row-5" }
];
for (var i = 0; i < zones.length; i++) {
zones[i].minVal = Math.round((hrr * zones[i].minPct) + rhr);
zones[i].maxVal = Math.round((hrr * zones[i].maxPct) + rhr);
}
} else {
methodText = "Zones calculated based on % of Max Heart Rate.";
document.getElementById('reserve_row').style.display = "none";
zones = [
{ name: "Zone 1", desc: "Active Recovery", minPct: 0.50, maxPct: 0.60, class: "cyc-zone-row-1" },
{ name: "Zone 2", desc: "Endurance", minPct: 0.60, maxPct: 0.70, class: "cyc-zone-row-2" },
{ name: "Zone 3", desc: "Tempo", minPct: 0.70, maxPct: 0.80, class: "cyc-zone-row-3" },
{ name: "Zone 4", desc: "Threshold", minPct: 0.80, maxPct: 0.90, class: "cyc-zone-row-4" },
{ name: "Zone 5", desc: "VO2 Max", minPct: 0.90, maxPct: 1.00, class: "cyc-zone-row-5" }
];
for (var i = 0; i < zones.length; i++) {
zones[i].minVal = Math.round(mhr * zones[i].minPct);
zones[i].maxVal = Math.round(mhr * zones[i].maxPct);
}
}
// 5. Update UI
document.getElementById('display_mhr').innerText = mhr + " bpm";
document.getElementById('method_explanation').innerText = methodText;
document.getElementById('cyc_result_area').style.display = "block";
var tbody = document.getElementById('cyc_zones_body');
tbody.innerHTML = ""; // Clear previous
for (var j = 0; j < zones.length; j++) {
var zone = zones[j];
var row = '