Measure your pulse for 60 seconds while sitting quietly.
Heart Health Assessment
Your Category:Calculating…
Max Heart Rate (Est.):0 BPM
Target Zone (Moderate):0 – 0 BPM
Target Zone (Vigorous):0 – 0 BPM
Note: This assessment is based on general population data. Always consult a cardiologist for medical advice.
Understanding Your Age-Adjusted Resting Heart Rate
Your Resting Heart Rate (RHR) is one of the most accessible metrics for gauging your general cardiovascular fitness. Unlike blood pressure or cholesterol, which require equipment or labs, your RHR can be measured with nothing more than your fingers and a stopwatch. This calculator compares your beats per minute (BPM) against age and gender-specific norms to help you understand where you stand.
Why Age Matters for Heart Rate
As we age, our cardiovascular system undergoes changes. While the resting heart rate of a healthy individual doesn't significantly change with age alone, our maximum heart rate decreases steadily. Furthermore, the range of what is considered "normal" or "athletic" shifts slightly based on metabolic changes and muscle mass reduction associated with aging.
Monitoring your RHR over time is crucial because a rising trend can indicate overtraining, stress, illness, or developing heart conditions, while a lowering trend usually indicates improved cardiovascular efficiency.
How to Measure Your Resting Heart Rate Accurately
To get the most accurate result to input into the calculator above, follow these steps:
Timing: The best time to measure is first thing in the morning, before you get out of bed or drink caffeine.
Position: Lie down or sit comfortably for at least 5 minutes before measuring.
Technique: Place your index and middle fingers on your wrist (radial artery) or the side of your neck (carotid artery).
Counting: Count the beats for a full 60 seconds, or count for 30 seconds and multiply by 2.
Resting Heart Rate Reference Chart (BPM)
The following table outlines the general standards used by this calculator to assess your fitness level based on age and gender.
Age
Athlete
Average
Poor
Men
Women
Men
Women
Men
Women
18-25
49-55
54-60
70-73
74-78
82+
85+
26-35
49-54
54-59
71-74
73-76
82+
83+
36-45
50-56
54-59
71-75
74-78
83+
85+
46-55
50-57
54-60
72-76
74-77
84+
84+
56-65
51-56
54-59
72-75
74-77
82+
84+
65+
50-55
54-59
70-73
73-76
80+
84+
Interpreting Your Results
Athlete / Excellent
A low resting heart rate (often below 60 bpm) usually indicates a highly efficient heart that pumps more blood with every beat. This is common in endurance athletes.
Average
For most adults, a resting heart rate between 60 and 100 bpm is considered normal clinically, though for fitness standards, 70-75 is typically the average. If you are at the higher end of the average, you might benefit from more aerobic activity.
Below Average / Poor
A higher resting heart rate suggests the heart has to work harder to maintain bodily functions while at rest. This can be caused by lack of exercise, smoking, stress, dehydration, or underlying health issues. If your resting rate is consistently above 100 bpm (Tachycardia), consult a doctor.
Target Heart Rate Zones
The calculator also provides your estimated maximum heart rate (calculated as 220 minus your age) and your target training zones:
Moderate Intensity (50-70% Max HR): Good for weight management and building a base level of fitness.
Vigorous Intensity (70-85% Max HR): Improves aerobic capacity and cardiovascular performance.
function calculateHeartRate() {
// 1. Get Inputs
var ageInput = document.getElementById('age');
var genderInput = document.getElementById('gender');
var rhrInput = document.getElementById('rhr');
var age = parseInt(ageInput.value);
var gender = genderInput.value;
var rhr = parseInt(rhrInput.value);
var resultDiv = document.getElementById('results');
// 2. Validate Inputs
if (!age || isNaN(age) || age 120) {
alert("Please enter a valid age between 1 and 120.");
return;
}
if (!rhr || isNaN(rhr) || rhr 250) {
alert("Please enter a valid resting heart rate (typically between 30 and 150).");
return;
}
// 3. Logic for Assessment (Based on YMCA norms or similar aggregate data)
var rating = "Average";
var ratingClass = "status-average";
// Define function to set rating
function setRating(r, css) {
rating = r;
ratingClass = css;
}
// Logic branching based on Gender and Age
if (gender === 'male') {
if (age >= 18 && age <= 25) {
if (rhr <= 55) setRating("Athlete", "status-athlete");
else if (rhr <= 61) setRating("Excellent", "status-excellent");
else if (rhr <= 65) setRating("Good", "status-good");
else if (rhr <= 69) setRating("Above Average", "status-good");
else if (rhr <= 73) setRating("Average", "status-average");
else if (rhr <= 81) setRating("Below Average", "status-average");
else setRating("Poor", "status-poor");
} else if (age <= 35) {
if (rhr <= 54) setRating("Athlete", "status-athlete");
else if (rhr <= 61) setRating("Excellent", "status-excellent");
else if (rhr <= 65) setRating("Good", "status-good");
else if (rhr <= 70) setRating("Above Average", "status-good");
else if (rhr <= 74) setRating("Average", "status-average");
else if (rhr <= 81) setRating("Below Average", "status-average");
else setRating("Poor", "status-poor");
} else if (age <= 45) {
if (rhr <= 56) setRating("Athlete", "status-athlete");
else if (rhr <= 62) setRating("Excellent", "status-excellent");
else if (rhr <= 66) setRating("Good", "status-good");
else if (rhr <= 70) setRating("Above Average", "status-good");
else if (rhr <= 75) setRating("Average", "status-average");
else if (rhr <= 82) setRating("Below Average", "status-average");
else setRating("Poor", "status-poor");
} else if (age <= 55) {
if (rhr <= 57) setRating("Athlete", "status-athlete");
else if (rhr <= 63) setRating("Excellent", "status-excellent");
else if (rhr <= 67) setRating("Good", "status-good");
else if (rhr <= 71) setRating("Above Average", "status-good");
else if (rhr <= 76) setRating("Average", "status-average");
else if (rhr <= 83) setRating("Below Average", "status-average");
else setRating("Poor", "status-poor");
} else if (age <= 65) {
if (rhr <= 56) setRating("Athlete", "status-athlete");
else if (rhr <= 61) setRating("Excellent", "status-excellent");
else if (rhr <= 67) setRating("Good", "status-good");
else if (rhr <= 71) setRating("Above Average", "status-good");
else if (rhr <= 75) setRating("Average", "status-average");
else if (rhr <= 81) setRating("Below Average", "status-average");
else setRating("Poor", "status-poor");
} else { // 65+
if (rhr <= 55) setRating("Athlete", "status-athlete");
else if (rhr <= 61) setRating("Excellent", "status-excellent");
else if (rhr <= 65) setRating("Good", "status-good");
else if (rhr <= 69) setRating("Above Average", "status-good");
else if (rhr <= 73) setRating("Average", "status-average");
else if (rhr = 18 && age <= 25) {
if (rhr <= 60) setRating("Athlete", "status-athlete");
else if (rhr <= 65) setRating("Excellent", "status-excellent");
else if (rhr <= 69) setRating("Good", "status-good");
else if (rhr <= 73) setRating("Above Average", "status-good");
else if (rhr <= 78) setRating("Average", "status-average");
else if (rhr <= 84) setRating("Below Average", "status-average");
else setRating("Poor", "status-poor");
} else if (age <= 35) {
if (rhr <= 59) setRating("Athlete", "status-athlete");
else if (rhr <= 64) setRating("Excellent", "status-excellent");
else if (rhr <= 68) setRating("Good", "status-good");
else if (rhr <= 72) setRating("Above Average", "status-good");
else if (rhr <= 76) setRating("Average", "status-average");
else if (rhr <= 82) setRating("Below Average", "status-average");
else setRating("Poor", "status-poor");
} else if (age <= 45) {
if (rhr <= 59) setRating("Athlete", "status-athlete");
else if (rhr <= 64) setRating("Excellent", "status-excellent");
else if (rhr <= 69) setRating("Good", "status-good");
else if (rhr <= 73) setRating("Above Average", "status-good");
else if (rhr <= 78) setRating("Average", "status-average");
else if (rhr <= 84) setRating("Below Average", "status-average");
else setRating("Poor", "status-poor");
} else if (age <= 55) {
if (rhr <= 60) setRating("Athlete", "status-athlete");
else if (rhr <= 65) setRating("Excellent", "status-excellent");
else if (rhr <= 69) setRating("Good", "status-good");
else if (rhr <= 73) setRating("Above Average", "status-good");
else if (rhr <= 77) setRating("Average", "status-average");
else if (rhr <= 83) setRating("Below Average", "status-average");
else setRating("Poor", "status-poor");
} else if (age <= 65) {
if (rhr <= 59) setRating("Athlete", "status-athlete");
else if (rhr <= 64) setRating("Excellent", "status-excellent");
else if (rhr <= 68) setRating("Good", "status-good");
else if (rhr <= 73) setRating("Above Average", "status-good");
else if (rhr <= 77) setRating("Average", "status-average");
else if (rhr <= 84) setRating("Below Average", "status-average");
else setRating("Poor", "status-poor");
} else { // 65+
if (rhr <= 59) setRating("Athlete", "status-athlete");
else if (rhr <= 64) setRating("Excellent", "status-excellent");
else if (rhr <= 68) setRating("Good", "status-good");
else if (rhr <= 72) setRating("Above Average", "status-good");
else if (rhr <= 76) setRating("Average", "status-average");
else if (rhr <= 84) setRating("Below Average", "status-average");
else setRating("Poor", "status-poor");
}
}
// Handle under 18 generic fallback (optional, but good for edge cases)
if (age < 18) {
rating = "Chart applies to 18+";
ratingClass = "status-average";
}
// 4. Calculate Zones
var maxHR = 220 – age;
var modLow = Math.round(maxHR * 0.50);
var modHigh = Math.round(maxHR * 0.70);
var vigLow = Math.round(maxHR * 0.70);
var vigHigh = Math.round(maxHR * 0.85);
// 5. Output Results
var fitnessLevelSpan = document.getElementById('fitness-level');
fitnessLevelSpan.innerText = rating;
fitnessLevelSpan.className = "status-badge " + ratingClass;
document.getElementById('max-hr').innerText = maxHR;
document.getElementById('target-mod').innerText = modLow + " – " + modHigh;
document.getElementById('target-vig').innerText = vigLow + " – " + vigHigh;
// Show results
resultDiv.style.display = "block";
}