Heart Rate Zone Calculator British Cycling

.bc-hr-calculator-wrapper { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; max-width: 800px; margin: 20px auto; padding: 25px; border: 1px solid #e1e1e1; border-radius: 8px; background-color: #ffffff; color: #333; box-shadow: 0 4px 6px rgba(0,0,0,0.05); } .bc-hr-calculator-wrapper h2 { color: #d71920; margin-top: 0; text-align: center; font-size: 28px; text-transform: uppercase; } .bc-input-group { margin-bottom: 20px; } .bc-input-group label { display: block; margin-bottom: 8px; font-weight: 600; color: #222; } .bc-input-group input, .bc-input-group select { width: 100%; padding: 12px; border: 2px solid #ddd; border-radius: 4px; font-size: 16px; box-sizing: border-box; } .bc-input-group input:focus { border-color: #d71920; outline: none; } .bc-calculate-btn { width: 100%; background-color: #d71920; color: white; padding: 15px; border: none; border-radius: 4px; font-size: 18px; font-weight: bold; cursor: pointer; transition: background 0.3s ease; } .bc-calculate-btn:hover { background-color: #b3151a; } #bc-results-container { margin-top: 30px; display: none; } .bc-table { width: 100%; border-collapse: collapse; margin-top: 15px; } .bc-table th, .bc-table td { padding: 12px; text-align: left; border-bottom: 1px solid #eee; } .bc-table th { background-color: #f8f8f8; color: #d71920; } .zone-1 { border-left: 5px solid #cccccc; } .zone-2 { border-left: 5px solid #3498db; } .zone-3 { border-left: 5px solid #2ecc71; } .zone-4 { border-left: 5px solid #f1c40f; } .zone-5 { border-left: 5px solid #e67e22; } .zone-6 { border-left: 5px solid #e74c3c; } .bc-article-section { margin-top: 40px; line-height: 1.6; color: #444; } .bc-article-section h3 { color: #222; border-bottom: 2px solid #d71920; padding-bottom: 5px; display: inline-block; } .bc-article-section p { margin-bottom: 15px; } .bc-info-box { background: #fdf2f2; padding: 15px; border-left: 4px solid #d71920; margin: 20px 0; }

British Cycling Heart Rate Zone Calculator

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

This is your average heart rate during a consistent 20-minute maximum effort (time trial).

Your Training Zones

Zone Description BPM Range

Understanding British Cycling Training Zones

Training with heart rate is one of the most effective ways for cyclists to monitor intensity and ensure they are hitting the specific physiological adaptations required for improvement. The British Cycling model focuses on the Functional Threshold Heart Rate (FTHR) as the primary anchor point, rather than a generic "Maximum Heart Rate" formula like 220-minus-age.

How to find your FTHR: Perform a 20-minute time trial (maximum steady effort). Your average heart rate for those 20 minutes is your FTHR. This is the intensity you can theoretically sustain for about an hour of racing.

The Six Training Zones Explained

Zone 1: Active Recovery ( < 68% FTHR )
Used for recovery rides after hard days or racing. It stimulates blood flow to the muscles without adding fatigue.

Zone 2: Endurance ( 68% – 83% FTHR )
The "bread and butter" of cycling. This builds aerobic capacity, efficiency, and teaches the body to burn fat more effectively as fuel.

Zone 3: Tempo ( 84% – 94% FTHR )
A "comfortably hard" pace. Training here improves aerobic power and prepares the body for more intense threshold work.

Zone 4: Threshold ( 95% – 105% FTHR )
The critical zone for time-trialling and climbing. Working at or near your FTHR increases the intensity you can maintain before lactate accumulates rapidly.

Zone 5: VO2 Max ( > 106% FTHR )
Extremely high intensity. These are short, sharp intervals designed to increase your maximum oxygen uptake and ceiling for performance.

Why Accuracy Matters

If you set your heart rate zones too high, you risk overtraining and burnout. If they are too low, you won't provide a sufficient stimulus for your body to adapt. Using the British Cycling method ensures your training is tailored specifically to your current fitness level rather than an age-based average.

Example Calculation

If a cyclist has a measured FTHR of 170 BPM, their zones would be:

  • Zone 1: Below 116 BPM
  • Zone 2: 116 – 141 BPM
  • Zone 3: 143 – 160 BPM
  • Zone 4: 162 – 179 BPM
  • Zone 5: Above 180 BPM
function calculateBCZones() { var fthr = parseFloat(document.getElementById('fthrInput').value); var tableBody = document.getElementById('bc-table-body'); var resultsContainer = document.getElementById('bc-results-container'); if (!fthr || fthr 225) { alert('Please enter a valid Functional Threshold Heart Rate (usually between 120 and 190 bpm).'); return; } // Calculation Logic based on British Cycling percentages // Zone 1: < 68% // Zone 2: 68-83% // Zone 3: 84-94% // Zone 4: 95-105% // Zone 5: 106%+ var z1_max = Math.round(fthr * 0.68); var z2_min = Math.round(fthr * 0.69); var z2_max = Math.round(fthr * 0.83); var z3_min = Math.round(fthr * 0.84); var z3_max = Math.round(fthr * 0.94); var z4_min = Math.round(fthr * 0.95); var z4_max = Math.round(fthr * 1.05); var z5_min = Math.round(fthr * 1.06); var zones = [ { id: "1", name: "Recovery", desc: "Easy spinning, conversation pace", range: "Under " + z1_max + " bpm", cls: "zone-1" }, { id: "2", name: "Endurance", desc: "Long steady rides, base building", range: z2_min + " – " + z2_max + " bpm", cls: "zone-2" }, { id: "3", name: "Tempo", desc: "Sustained aerobic effort", range: z3_min + " – " + z3_max + " bpm", cls: "zone-3" }, { id: "4", name: "Threshold", desc: "Time trial intensity / Race pace", range: z4_min + " – " + z4_max + " bpm", cls: "zone-4" }, { id: "5", name: "VO2 Max", desc: "Very hard intervals (3-8 mins)", range: z5_min + " bpm +", cls: "zone-5" } ]; var html = ""; for (var i = 0; i < zones.length; i++) { html += ""; html += "Zone " + zones[i].id + ""; html += "" + zones[i].name + "" + zones[i].desc + ""; html += "" + zones[i].range + ""; html += ""; } tableBody.innerHTML = html; resultsContainer.style.display = 'block'; // Scroll to results smoothly resultsContainer.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }

Leave a Comment