Calculate your training zones using the Karvonen Formula.
Estimate Max HR based on Age
I know my specific Max HR
Your Training Zones
Based on Max HR: BPM | Resting HR: BPM
Zone
Name
Intensity (%)
Heart Rate Range (BPM)
Note for Triathletes: Your cycling Max HR is typically 5-10 beats lower than your running Max HR due to non-weight bearing mechanics. Consider subtracting 5-8 BPM from these ranges for bike training sessions.
Why Heart Rate Training is Critical for Triathlon Success
In the world of triathlon—whether you are training for a Sprint, Olympic, 70.3, or full Ironman distance—pacing is everything. While power meters are standard for cycling and GPS pace is common for running, heart rate (HR) remains the most accessible and honest metric of your body's internal load.
Using a Triathlon Heart Rate Zones Calculator allows you to train specifically for the metabolic demands of your race. Training blindly without zones often leads to the "grey zone"—training too hard to recover but too easy to elicit significant aerobic adaptations.
Understanding the Karvonen Formula
This calculator utilizes the Karvonen Method (Heart Rate Reserve), widely considered superior for athletes compared to simple percentage-of-max calculations. Why? Because it factors in your fitness level via your Resting Heart Rate (RHR).
The formula is: Target HR = ((Max HR − Resting HR) × % Intensity) + Resting HR
By including your resting heart rate, the zones scale up as you get fitter (and your resting heart rate drops), ensuring your training data evolves with your fitness.
The 5 Heart Rate Zones Explained
Zone 1: Active Recovery (50-60%)
Feeling: Very easy, conversational.
Purpose: Used for warm-ups, cool-downs, and recovery sessions between hard days. This promotes blood flow to flush out metabolic waste without adding stress.
Zone 2: Aerobic Endurance (60-70%)
Feeling: Comfortable, can maintain a conversation but breathing is rhythmic.
Purpose: The "Bread and Butter" of triathlon training. Spending 70-80% of your training time here builds mitochondrial density, fat oxidation efficiency, and capillary networks. This is your primary Ironman race pace zone.
Zone 3: Tempo / Sweet Spot (70-80%)
Feeling: Comfortable hard. Conversation is possible but in short sentences.
Purpose: Improves aerobic capacity and muscular endurance. Often used for 70.3 race pacing intervals. However, spending too much time here can cause excessive fatigue without the top-end benefits of Zone 4/5.
Zone 4: Threshold (80-90%)
Feeling: Hard. "Burning" sensation in legs begins. One or two word answers only.
Purpose: Raises your Lactate Threshold (LT). This allows you to go faster before lactate begins to accumulate uncontrollably in the blood. Critical for Sprint and Olympic distance speed.
Zone 5: VO2 Max (90-100%)
Feeling: Max effort. Gasping for air.
Purpose: Top-end speed and power. Used sparingly in triathlon training (e.g., short hill repeats or swim sprints) to raise the ceiling of your aerobic engine.
Adjusting Zones for Swim, Bike, and Run
Triathlon is unique because your heart rate response differs by discipline. Gravity and muscle mass recruitment play a major role:
Run: Usually elicits the highest Max HR (weight-bearing, whole body). Use the calculated zones above as your baseline.
Bike: Max HR is typically 5-10 beats lower than running because the bike supports your weight. You may need to shift your zones down slightly (e.g., if your Run Z2 top is 145, your Bike Z2 top might be 138).
Swim: Max HR is often 10-15 beats lower than running due to the horizontal body position (easier for the heart to pump blood) and the cooling effect of the water.
To be most accurate, advanced athletes should perform a field test (like a 20-minute time trial) for running and cycling separately to establish sport-specific zones.
function toggleMaxHrInput() {
var mode = document.getElementById("calcMode").value;
var ageInput = document.getElementById("athleteAge");
var maxHrContainer = document.getElementById("maxHrContainer");
if (mode === "custom") {
maxHrContainer.style.display = "block";
ageInput.parentElement.parentElement.style.display = "none";
} else {
maxHrContainer.style.display = "none";
ageInput.parentElement.parentElement.style.display = "block";
}
}
function calculateTriZones() {
// 1. Get Inputs
var mode = document.getElementById("calcMode").value;
var age = parseFloat(document.getElementById("athleteAge").value);
var restHR = parseFloat(document.getElementById("restingHR").value);
var customMaxHR = parseFloat(document.getElementById("knownMaxHR").value);
var maxHR = 0;
// 2. Validate Inputs
if (isNaN(restHR)) {
alert("Please enter a valid Resting Heart Rate.");
return;
}
if (mode === "age") {
if (isNaN(age) || age 100) {
alert("Please enter a valid age.");
return;
}
// Standard formula usually 220-age.
// For active adults, Tanaka (208 – 0.7*age) is often better, but let's stick to the standard widely known logic
// or provide Tanaka. Let's use the standard 220-age for broad compatibility in this simple tool.
maxHR = 220 – age;
} else {
if (isNaN(customMaxHR) || customMaxHR 250) {
alert("Please enter a valid Max Heart Rate (typically between 150-220).");
return;
}
maxHR = customMaxHR;
}
if (restHR >= maxHR) {
alert("Resting Heart Rate cannot be higher than or equal to Max Heart Rate.");
return;
}
// 3. Calculation Logic (Karvonen)
// HRR = HRmax – HRrest
// Target = (HRR * %) + HRrest
var hrr = maxHR – restHR;
var zones = [
{ id: 1, name: "Recovery", minPct: 0.50, maxPct: 0.60, class: "zone-1" },
{ id: 2, name: "Endurance", minPct: 0.60, maxPct: 0.70, class: "zone-2" },
{ id: 3, name: "Tempo", minPct: 0.70, maxPct: 0.80, class: "zone-3" },
{ id: 4, name: "Threshold", minPct: 0.80, maxPct: 0.90, class: "zone-4" },
{ id: 5, name: "VO2 Max", minPct: 0.90, maxPct: 1.00, class: "zone-5" }
];
var tableHtml = "";
for (var i = 0; i < zones.length; i++) {
var z = zones[i];
var minBpm = Math.round((hrr * z.minPct) + restHR);
var maxBpm = Math.round((hrr * z.maxPct) + restHR);
tableHtml += "