Cycling VO2 max calculator
Estimate VO2 max from a power test and your body weight.
Enter your best 5-minute power and your weight to see your estimate.
The example from the write-up
Same charts as the post, drawn for a 74.6 kg rider who held 288 W for 5 minutes. A steady ride for that rider lands near 49.
Best 5 minutes: a prediction and a floor
Heart rate vs power: following the line to max
What each method gives you
How the calculation works
Divide your best 5-minute average power by your body weight in kilograms. The Sitko equation is VO₂ max = 16.6 + 8.87 × watts per kilogram. Sitko and colleagues built it from lab tests of 46 road cyclists who also rode a maximal 5-minute effort. That power explained about 60 to 77 percent of the variation in measured VO₂ max.
The equation reads low. Borszcz and colleagues tested it on 49 male cyclists and found it underestimated measured VO₂ max by 6.6 ml/kg/min on average. For 95 percent of those riders, the measured value sat between 3.8 below the prediction and 17.2 above it. The floor is the prediction minus 3.8. The line under the result uses the whole number at or below that floor. A prediction of 50.8 has a floor of 47.0, so it reads Likely 47 or higher. A floor of 47.9 still reads Likely 47 or higher.
Those 5 minutes have to be close to all-out. Five easy minutes predict a low VO₂ max, because the equation assumes you were at your limit. A fair check is heart rate in the last minute reaching at least 90 percent of your max. In professional riders, the best efforts of 5 minutes or longer from training and racing came within 5 percent of formal time trials (Pallarés et al., 2022), so a genuine best effort from a ride is a fair stand-in.
Most rides are steady. Heart rate climbs in a near-straight line with power, which is the idea behind the Åstrand bike test and the cycling estimate Firstbeat built (Garmin uses that one). Convert the steady power to an oxygen cost with the ACSM leg-cycling equation: VO₂ = 10.8 × watts per kilogram + 7 (Swain, 2000). Draw a line from rest, your resting heart rate at 3.5 ml/kg/min, through that effort and extend it to your max heart rate. The share of your heart-rate range matches the share of your oxygen range (Swain and Leutholtz, 1997). Here, one steady power and one heart rate give that equation for a single minute, so pick a stretch that actually was steady, with heart rate between 70 and 95 percent of max.
The steady result is a range around the estimate. It is 10 percent either side when you enter a max heart rate you have reached and a resting heart rate. It is 15 percent when max heart rate comes from 208 minus 0.7 times your age (Tanaka et al., 2001), because an age formula can miss for any one person. Leave resting heart rate blank and the page assumes 60, which adds 3 percentage points. A bike that estimates watts from resistance and cadence adds 5 more. Heat, dehydration, caffeine, and fatigue push heart rate up at the same power, and the estimate reads low.
Firstbeat's check of 29 riders on power meters reported about a 5 percent average error when max heart rate was known, and about 9 percent when it was set 15 beats too low. A Swedish study of the classic Åstrand test found a coefficient of variation of 18 percent, and 9 percent for an improved model (Ekblom-Bak et al., 2014).
A worked example
A 74.6 kg rider who holds 288 W for 5 minutes is at 3.86 W/kg. The Sitko equation gives 50.8 ml/kg/min, and the line reads Likely 47 or higher. The same kind of rider holding a steady 180 W at 145 bpm, at 75 kg, with a resting heart rate of 60 and a max of 190, gets 48 ml/kg/min, shown as Likely between 44 and 53.
Sources checked October 29, 2026: Sitko et al., 2022; Borszcz et al., 2024; Swain, 2000; Swain and Leutholtz, 1997; Tanaka et al., 2001; Pallarés et al., 2022; Ekblom-Bak et al., 2014; Firstbeat, fitness level; Apple, cardio fitness.
Keep going
Questions
Why does it say "likely 47 or higher"?
The Sitko equation came out low when another group tested it. In 49 male cyclists, Borszcz et al. (2024) found it 6.6 ml/kg/min low on average, and 95 percent of measured values fell between 3.8 below the prediction and 17.2 above it. The calculator keeps the lower edge and drops the wide band above it. For the 74.6 kg rider at 288 W, 50.8 minus 3.8 is 47.0, which reads Likely 47 or higher. The measured value can sit well above that floor. The equation does not say how far above.
What if those 5 minutes were not all-out?
The estimate will be low. The equation assumes a maximal effort. If heart rate in the last minute stayed under about 90 percent of your max, the effort was probably not all-out. Use the hardest 5 minutes you have, or the steady ride tab.
Where does the steady-ride number come from?
It follows heart rate up the line to your max, which is the idea behind the Åstrand bike test and Firstbeat's cycling estimate. Oxygen cost comes from the ACSM leg-cycling equation. The line uses the finding that heart-rate reserve matches VO₂ reserve. Enter power and heart rate from a steady stretch, at least 50 watts, with heart rate between 70 and 95 percent of max. Intervals and stop-start riding do not fit. One average here is the math for a single minute; across a long steady ride, the middle value of many minutes is steadier.
How wide is the range?
10 percent either side with a max heart rate you enter and a resting heart rate. 15 percent when max heart rate comes from your age. Assuming a resting heart rate of 60 adds 3 percentage points. A bike that estimates power from resistance and cadence adds 5. The edges come from the unrounded estimate. The 180 W example is about 48.5 before rounding, so the page shows 48 and Likely between 44 and 53.
Why does my Apple Watch skip rides?
Apple estimates cardio fitness during outdoor walks, runs, and hikes. Apple says indoor workouts and gym equipment do not count. If your hard efforts are on the bike, the watch can go a long time without a new reading. A ride-based estimate like this one fills that gap.
Can I enter pounds?
Yes. Both equations use kilograms. The kilogram and pound switch converts the weight you have already typed.