British Cycling Heart Rate Zones Calculator

British Cycling Heart Rate Zones Calculator body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; line-height: 1.6; color: #333; margin: 0; padding: 0; } .calculator-container { max-width: 800px; margin: 40px auto; padding: 30px; background: #f9f9f9; border-radius: 8px; box-shadow: 0 4px 15px rgba(0,0,0,0.1); border: 1px solid #e1e1e1; } .calculator-header { text-align: center; margin-bottom: 30px; } .calculator-header h2 { color: #d01c2d; /* British Cycling Red-ish */ margin-bottom: 10px; } .input-group { margin-bottom: 20px; } .input-group label { display: block; font-weight: 600; margin-bottom: 8px; color: #444; } .input-group input, .input-group select { width: 100%; padding: 12px; border: 1px solid #ddd; border-radius: 4px; font-size: 16px; box-sizing: border-box; } .input-group input:focus, .input-group select:focus { border-color: #d01c2d; outline: none; } .btn-calculate { display: block; width: 100%; padding: 15px; background-color: #002664; /* British Cycling Blue-ish */ color: white; border: none; border-radius: 4px; font-size: 18px; font-weight: bold; cursor: pointer; transition: background 0.3s; } .btn-calculate:hover { background-color: #001a4d; } #results-area { margin-top: 30px; display: none; } .fthr-display { background: #eef2f7; padding: 15px; border-left: 5px solid #002664; margin-bottom: 20px; border-radius: 4px; } .fthr-display strong { font-size: 1.2em; color: #002664; } table.zones-table { width: 100%; border-collapse: collapse; margin-top: 10px; background: white; } table.zones-table th, table.zones-table td { border: 1px solid #ddd; padding: 12px; text-align: left; } table.zones-table th { background-color: #002664; color: white; font-weight: 600; } table.zones-table tr:nth-child(even) { background-color: #f8f8f8; } .zone-badge { display: inline-block; padding: 4px 8px; border-radius: 4px; font-size: 0.85em; font-weight: bold; color: white; } .badge-z1 { background-color: #888; } .badge-z2 { background-color: #3b82f6; } .badge-z3 { background-color: #10b981; } .badge-z4 { background-color: #f59e0b; } .badge-z5 { background-color: #ef4444; } .badge-z6 { background-color: #7f1d1d; } .article-container { max-width: 800px; margin: 50px auto; padding: 0 20px; } .article-container h2 { color: #002664; border-bottom: 2px solid #d01c2d; padding-bottom: 10px; margin-top: 40px; } .article-container h3 { color: #333; margin-top: 30px; } .article-container p, .article-container ul, .article-container li { color: #555; font-size: 1.05em; } .info-box { background-color: #fff8e1; border-left: 5px solid #f59e0b; padding: 15px; margin: 20px 0; }

British Cycling Heart Rate Zones Calculator

Determine your training zones based on your Functional Threshold Heart Rate (FTHR).

I know my FTHR (Threshold HR) 20-Minute Test Average HR
Enter your established threshold heart rate.
Calculated FTHR: 0 bpm
Zone Name Heart Rate Range (bpm)
*Based on British Cycling / Coggan power & heart rate adaptation guidelines.

Understanding British Cycling Heart Rate Zones

Effective cycling training relies on specificity. Rather than simply riding "hard" or "easy," British Cycling advocates for a structured approach using training zones. These zones allow cyclists to target specific physiological systems, from basic endurance to neuromuscular power.

This calculator uses the Functional Threshold Heart Rate (FTHR) method, which is generally considered more accurate for trained cyclists than the age-based "220 minus age" formula.

What is FTHR?

Functional Threshold Heart Rate is the average heart rate a cyclist can sustain during a maximum effort time trial over one hour. However, doing a full hour test is physically and mentally exhausting.

The 20-Minute Test: Most cyclists determine their FTHR by performing a 20-minute time trial effort. Because a 20-minute effort is slightly more intense than a 60-minute effort, you typically take 95% of your average heart rate from the 20-minute test to estimate your FTHR.

The 6 Training Zones Explained

Once you have established your FTHR, you can define your training zones. Here is what each zone achieves:

  • Zone 1: Active Recovery (< 81% FTHR)
    Used for easy spins between hard days or during warm-ups. It promotes blood flow and aids recovery without inducing fatigue.
  • Zone 2: Endurance (81% – 89% FTHR)
    The "bread and butter" of cycling training. Riding in Zone 2 builds mitochondrial density, improves fat oxidation, and builds the aerobic base necessary for long rides.
  • Zone 3: Tempo (90% – 93% FTHR)
    Often called "sweet spot" training (though sweet spot is technically high Z3/low Z4). This intensity requires concentration but can be sustained for 1-2 hours by fit riders. It improves aerobic fitness and muscle glycogen storage.
  • Zone 4: Threshold (94% – 99% FTHR)
    This is riding right at your limit where your body can just barely clear lactate as fast as it is produced. Intervals here are mentally taxing and usually last 8 to 20 minutes. This raises your FTHR over time.
  • Zone 5: VO2 Max (100% – 106% FTHR)
    Severe intensity. You are gasping for air. These intervals typically last 3 to 8 minutes and are designed to increase the maximum amount of oxygen your body can process.
  • Zone 6: Anaerobic Capacity (> 106% FTHR)
    Short, explosive efforts (sprints, short climbs) lasting 30 seconds to 3 minutes. Heart rate lags behind effort here, so power meters are often preferred, but high HR indicates you are maxing out your system.

How to Conduct a FTHR Field Test

To get accurate numbers for the calculator above, follow this simple protocol:

  1. Warm-up: 20 minutes of easy riding with a few 1-minute high-cadence spin-ups.
  2. Pre-effort: 5 minutes all-out to clear anaerobic energy stores (optional but recommended by some coaches), followed by 10 minutes recovery.
  3. The Test: Ride for exactly 20 minutes at the highest consistent average pace you can sustain. Do not start too hard and fade; try to hold a steady, high intensity.
  4. Cool-down: 15 minutes easy spinning.
  5. Calculate: Take the average HR of the 20-minute test segment and enter it into the calculator using the "20-Minute Test Average" option.

Why Not Use Max Heart Rate?

While Maximum Heart Rate (MHR) is a common metric, it can vary day-to-day based on hydration, caffeine, and stress. Furthermore, two riders with the same max heart rate might have vastly different fitness levels. FTHR correlates much better with your actual performance threshold (FTP), making it a superior metric for setting training intensities.

function toggleInputLabel() { var method = document.getElementById('inputMethod').value; var label = document.getElementById('hrInputLabel'); var helper = document.getElementById('helperText'); if (method === 'fthr') { label.innerText = "Functional Threshold Heart Rate (bpm)"; helper.innerText = "Enter your established threshold heart rate."; } else { label.innerText = "Average HR from 20-Min Test (bpm)"; helper.innerText = "Enter the average heart rate recorded during your 20-minute max effort."; } } function calculateCyclingZones() { // 1. Get Input Values var hrValueInput = document.getElementById('heartRateValue').value; var method = document.getElementById('inputMethod').value; var resultsArea = document.getElementById('results-area'); var displayFTHR = document.getElementById('displayFTHR'); var tableBody = document.getElementById('zonesTableBody'); // 2. Validate Input var hrValue = parseFloat(hrValueInput); if (isNaN(hrValue) || hrValue 250) { alert("Please enter a valid heart rate between 40 and 250 bpm."); return; } // 3. Calculate FTHR var fthr = 0; if (method === 'test_avg') { // 95% of 20 min average fthr = Math.round(hrValue * 0.95); } else { // Direct entry fthr = Math.round(hrValue); } // 4. Calculate Zones (British Cycling / Coggan based on FTHR) // Zone 1: 106% var z1_limit = Math.floor(fthr * 0.81) – 1; // Upper limit of Z1 var z2_start = Math.floor(fthr * 0.81); var z2_end = Math.floor(fthr * 0.89); var z3_start = Math.floor(fthr * 0.90); var z3_end = Math.floor(fthr * 0.93); var z4_start = Math.floor(fthr * 0.94); var z4_end = Math.floor(fthr * 0.99); var z5_start = Math.floor(fthr * 1.00); var z5_end = Math.floor(fthr * 1.06); var z6_start = Math.floor(fthr * 1.06) + 1; // Start of Z6 // 5. Update UI displayFTHR.innerHTML = fthr; resultsArea.style.display = "block"; // Clear previous rows tableBody.innerHTML = ""; // Helper function to create rows function createRow(zone, name, badgeClass, range) { return ` ${zone} ${name} ${range} `; } var htmlContent = ""; htmlContent += createRow("Zone 1", "Active Recovery", "badge-z1", "Below " + (z1_limit + 1) + " bpm"); htmlContent += createRow("Zone 2", "Endurance", "badge-z2″, z2_start + " – " + z2_end + " bpm"); htmlContent += createRow("Zone 3", "Tempo", "badge-z3″, z3_start + " – " + z3_end + " bpm"); htmlContent += createRow("Zone 4", "Threshold", "badge-z4″, z4_start + " – " + z4_end + " bpm"); htmlContent += createRow("Zone 5", "VO2 Max", "badge-z5″, z5_start + " – " + z5_end + " bpm"); htmlContent += createRow("Zone 6", "Anaerobic", "badge-z6", z6_start + "+ bpm"); tableBody.innerHTML = htmlContent; // Scroll to results resultsArea.scrollIntoView({behavior: "smooth"}); }

Leave a Comment