The Myzone system creates a level playing field for fitness by measuring effort rather than just pure speed or strength. This calculator helps you determine your personal Maximum Heart Rate (MHR) and the specific Beats Per Minute (BPM) required to hit the different Myzone color zones.
How Maximum Heart Rate is Calculated
Myzone typically utilizes the Hunt Formula (211 – 0.64 × age) to estimate your Maximum Heart Rate, which is often more accurate for active populations than the standard "220 minus age" equation. However, if you have performed a clinical stress test or a specific Myzone Max verification, you can input your known max manually above.
The 5 Myzone Zones Explained
Your effort points (MEPs) are awarded based on the zone you are working in. The harder you work relative to your personal max, the more points you earn:
Gray Zone (50-59%): 1 MEP per minute. Warm-up and recovery.
Blue Zone (60-69%): 2 MEPs per minute. Steady state aerobic.
Green Zone (70-79%): 3 MEPs per minute. Tempo training.
Yellow Zone (80-89%): 4 MEPs per minute. Threshold training.
Red Zone (90-100%): 4 MEPs per minute. Peak effort.
Why Monitor MEPs?
The World Health Organization guidelines recommend 150 minutes of moderate activity or 75 minutes of vigorous activity per week. Myzone aligns with this by suggesting a goal of 1300 MEPs per month. Using this calculator allows you to plan your workouts effectively to hit your monthly targets.
function calculateMyzone() {
// 1. Get Input Values
var ageInput = document.getElementById('mz-age').value;
var customMaxInput = document.getElementById('mz-custom-max').value;
var currentBpmInput = document.getElementById('mz-current-bpm').value;
var durationInput = document.getElementById('mz-duration').value;
// 2. Validation
var age = parseFloat(ageInput);
var duration = parseFloat(durationInput);
if (!duration || duration Hunt Formula (211 – 0.64 * age)
var maxHR;
if (customMaxInput && parseFloat(customMaxInput) > 0) {
maxHR = parseFloat(customMaxInput);
} else {
// Using Hunt Formula which Myzone uses as baseline
maxHR = 211 – (0.64 * age);
}
maxHR = Math.round(maxHR);
// 4. Calculate Current Status (if BPM provided)
var currentBPM = parseFloat(currentBpmInput);
var percentage = 0;
var currentZoneName = "Rest";
var currentZoneClass = "zone-none";
var mepsRate = 0;
if (!isNaN(currentBPM) && currentBPM > 0) {
percentage = (currentBPM / maxHR) * 100;
// Determine Zone Logic
if (percentage < 50) {
currentZoneName = "Below Zones (< 50%)";
currentZoneClass = "zone-none";
mepsRate = 0;
} else if (percentage < 60) {
currentZoneName = "GRAY ZONE";
currentZoneClass = "zone-gray";
mepsRate = 1;
} else if (percentage < 70) {
currentZoneName = "BLUE ZONE";
currentZoneClass = "zone-blue";
mepsRate = 2;
} else if (percentage < 80) {
currentZoneName = "GREEN ZONE";
currentZoneClass = "zone-green";
mepsRate = 3;
} else if (percentage 0) {
document.getElementById('result-percent').innerText = percentage.toFixed(1) + "%";
document.getElementById('result-meps').innerText = totalMeps + " MEPs";
var zoneDisplay = document.getElementById('result-zone-display');
zoneDisplay.className = "mz-zone-indicator " + currentZoneClass;
zoneDisplay.innerText = currentZoneName + " (" + mepsRate + " MEPs/min)";
} else {
document.getElementById('result-percent').innerText = "–";
document.getElementById('result-meps').innerText = "–";
document.getElementById('result-zone-display').className = "mz-zone-indicator zone-none";
document.getElementById('result-zone-display').innerText = "Enter Current BPM to see Zone";
}
// 6. Generate Zone Table
var tableBody = document.getElementById('mz-zone-table-body');
tableBody.innerHTML = ""; // Clear previous
// Define Zones Data
var zones = [
{ name: "Gray", colorClass: "zone-gray", minPct: 0.50, maxPct: 0.59, meps: 1 },
{ name: "Blue", colorClass: "zone-blue", minPct: 0.60, maxPct: 0.69, meps: 2 },
{ name: "Green", colorClass: "zone-green", minPct: 0.70, maxPct: 0.79, meps: 3 },
{ name: "Yellow", colorClass: "zone-yellow", minPct: 0.80, maxPct: 0.89, meps: 4 },
{ name: "Red", colorClass: "zone-red", minPct: 0.90, maxPct: 1.00, meps: 4 }
];
for (var i = 0; i < zones.length; i++) {
var z = zones[i];
var minBpm = Math.round(maxHR * z.minPct);
var maxBpm = Math.round(maxHR * z.maxPct);
// For Red zone, upper limit is technically maxHR, but can go over slightly
if (z.name === "Red") maxBpm = maxHR + "+";
var row = "