{"id":66375,"date":"2026-10-05T15:55:05","date_gmt":"2026-10-05T12:55:05","guid":{"rendered":"https:\/\/wpcalc.com\/en\/?p=66375"},"modified":"2026-10-05T15:55:05","modified_gmt":"2026-10-05T12:55:05","slug":"cycling-ftp-calculator","status":"publish","type":"post","link":"https:\/\/wpcalc.com\/en\/beauty\/cycling-ftp-calculator\/","title":{"rendered":"Cycling FTP Calculator"},"content":{"rendered":"<section class=\"not-prose calculator-box\" aria-labelledby=\"calculator-title\"><div class=\"flex items-baseline sm:items-center justify-between gap-2 sm:gap-3\"><div class=\"flex flex-col sm:flex-row sm:items-center gap-2\"><span class=\"icon icon-calculator text-primary-700! text-base! dark:text-primary-300!\" aria-hidden=\"true\"><\/span><h2 id=\"calculator-title\" class=\"text-lg font-display font-bold\">Estimate Your FTP from a 20-Minute Test<\/h2><\/div><div class=\"calcdash-favorite group\">\n  <button type=\"button\" class=\"favorite\" id=\"favorite\" data-favorite-id=\"66375\" data-favorite-title=\"Cycling FTP\" data-favorite-url=\"https:\/\/wpcalc.com\/en\/beauty\/cycling-ftp-calculator\/\" data-favorite-excerpt=\"Estimate your functional threshold power (FTP) from the average power of an all-out 20-minute ride. Enter your test power in watts and get your FTP plus a suggested training value.\" aria-label=\"Add to Favorites\" data-favorite-icon=\"icon icon-fitness\">\n    <span class=\"icon icon-shape-star-empty\" aria-hidden=\"true\"><\/span>\n  <\/button>\n  <div class=\"calcdash-favorite__tip\" aria-hidden=\"true\">\n   <span class=\"favorite-tooltip\" id=\"favorite-tooltip\"><\/span>\n  <\/div>\n  <span class=\"sr-only\" role=\"status\" id=\"favorite-status\"><\/span>\n<\/div><\/div><form action=\"https:\/\/wpcalc.com\/en\/beauty\/cycling-ftp-calculator\/\" method=\"POST\" class=\"calculator\" id=\"calculator-66375\" data-post=\"66375\"><fieldset class=\"fieldset-input is-1\"><legend class=\"sr-only\">Input Fields<\/legend><div class=\"field has-term\" id=\"input-1\"><label for=\"field-1\">Average power, 20-minute test<\/label><div class=\"term\">P\u2082\u2080<\/div>  <div class=\"absolute bottom-0 left-16 top-8 w-2 h-0.5 bg-blue-500\"><\/div><input type=\"text\" name=\"average_power_20minute_test\" id=\"field-1\" aria-describedby=\"calc-unit-1 calc-info-1\" data-number inputmode=\"decimal\" autocomplete=\"off\" spellcheck=\"false\" min=\"50\" max=\"1000\" value=\"260\"\/><div class=\"unit\" id=\"calc-unit-1\">W<\/div><small id=\"calc-info-1\">Average power from an all-out 20-minute effort (indoors or on the road)<\/small><\/div><\/fieldset><div class=\"buttons\"><button type=\"submit\" data-text=\"Re-Calculate\" id=\"calculate-button\" data-post=\"66375\">Calculate<\/button><button type=\"reset\">Reset<\/button><\/div><div class=\"field is-checkbox hidden!\" id=\"field-auto-calc\"><input type=\"checkbox\" id=\"auto-calc\"><label for=\"auto-calc\">Calculate automatically<\/label><small>If enabled, the result will update automatically when you change any value.<\/small><\/div><div class=\"fieldset-result is-hidden\" aria-labelledby=\"result-title\" aria-live=\"polite\" role=\"region\"> <h3 class=\"result-title bg-gradient-to-r from-primary-50 to-gray-50 dark:from-primary-900 dark:to-gray-800\" id=\"result-title\"><span class=\"icon icon-s-pulse\" aria-hidden=\"true\"><\/span> Your Estimated FTP<\/h3><div class=\"result-box\"><div class=\"field-result\" id=\"output-1\"><span class=\"field-title\"><span>Estimated functional threshold power (FTP)<\/span><span class=\"result-term\">FTP<\/span><\/span><span class=\"field-value\" id=\"result-1\" data-unit=\"W\"><\/span><button type=\"button\" class=\"copy-result\" data-tooltip=\"Copy Result\" aria-label=\"Copy Result\"><span class=\"copy-icon icon icon-document-copy\" aria-hidden=\"true\"><\/span><\/button><\/div><div class=\"field-result\" id=\"output-2\"><span class=\"field-title\"><span>Suggested training value (rounded to nearest 5 W)<\/span><\/span><span class=\"field-value\" id=\"result-2\" data-unit=\"W\"><\/span><button type=\"button\" class=\"copy-result\" data-tooltip=\"Copy Result\" aria-label=\"Copy Result\"><span class=\"copy-icon icon icon-document-copy\" aria-hidden=\"true\"><\/span><\/button><\/div><\/div><div class=\"result-actions\"><button type=\"button\" class=\"copy-link\"><svg viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z\"\/><path d=\"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z\"\/><\/svg><span class=\"copy-link__text\">Copy link to this calculation<\/span><\/button><span class=\"sr-only\" role=\"status\" id=\"copy-link-status\"><\/span><\/div><\/div><a href=\"#respond\" class=\"hidden transition-opacity duration-300 opacity-0 w-50 text-sm justify-center items-center gap-2 px-4 py-2 rounded bg-gray-200 text-gray-700 hover:bg-gray-300\" id=\"leave-comment\"><span class=\"icon icon-comments\" aria-hidden=\"true\"><\/span>Leave a Comment<\/a><\/form><\/section><section id=\"calc-reactions\" class=\"not-prose hidden my-12 bg-gradient-to-r from-primary-50 to-gray-50 border border-indigo-100 rounded-xl px-6 py-4 shadow-sm\" data-post=\"66375\" aria-live=\"polite\" aria-labelledby=\"calc-reactions-title\"><p id=\"calc-reactions-title\" class=\"text-sm text-gray-500 text-center mb-2\">How did this result make you feel?<\/p><div role=\"group\" aria-labelledby=\"calc-reactions-title\" class=\"grid grid-cols-3 sm:flex sm:flex-row sm:justify-around gap-4 sm:items-center sm:flex-wrap\"><button type=\"button\" aria-pressed=\"false\" class=\"reaction-btn flex flex-col items-center gap-1 text-sm text-gray-700 hover:text-primary-600 cursor-pointer transition-transform hover:scale-105\" data-reaction=\"like\"><span class=\"reaction-count\" data-reaction-count=\"like\">0<\/span><span class=\"reaction text-3xl\" aria-hidden=\"true\">\ud83d\ude00 <\/span><span class=\"reaction-description font-medium\">Like <\/span><\/button><button type=\"button\" aria-pressed=\"false\" class=\"reaction-btn flex flex-col items-center gap-1 text-sm text-gray-700 hover:text-primary-600 cursor-pointer transition-transform hover:scale-105\" data-reaction=\"helpful\"><span class=\"reaction-count\" data-reaction-count=\"helpful\">0<\/span><span class=\"reaction text-3xl\" aria-hidden=\"true\">\ud83d\udca1 <\/span><span class=\"reaction-description font-medium\">Helpful <\/span><\/button><button type=\"button\" aria-pressed=\"false\" class=\"reaction-btn flex flex-col items-center gap-1 text-sm text-gray-700 hover:text-primary-600 cursor-pointer transition-transform hover:scale-105\" data-reaction=\"confused\"><span class=\"reaction-count\" data-reaction-count=\"confused\">0<\/span><span class=\"reaction text-3xl\" aria-hidden=\"true\">\ud83d\ude15 <\/span><span class=\"reaction-description font-medium\">Confused <\/span><\/button><button type=\"button\" aria-pressed=\"false\" class=\"reaction-btn flex flex-col items-center gap-1 text-sm text-gray-700 hover:text-primary-600 cursor-pointer transition-transform hover:scale-105\" data-reaction=\"disappointed\"><span class=\"reaction-count\" data-reaction-count=\"disappointed\">0<\/span><span class=\"reaction text-3xl\" aria-hidden=\"true\">\ud83d\ude1e <\/span><span class=\"reaction-description font-medium\">Disappointed <\/span><\/button><button type=\"button\" aria-pressed=\"false\" class=\"reaction-btn flex flex-col items-center gap-1 text-sm text-gray-700 hover:text-primary-600 cursor-pointer transition-transform hover:scale-105\" data-reaction=\"inaccurate\"><span class=\"reaction-count\" data-reaction-count=\"inaccurate\">0<\/span><span class=\"reaction text-3xl\" aria-hidden=\"true\">\u274c <\/span><span class=\"reaction-description font-medium\">Inaccurate <\/span><\/button><\/div><div id=\"reaction-message\" class=\"hidden mt-8 rounded-md border border-primary-100 bg-white\/50 backdrop-blur-sm px-4 py-2 text-sm text-center shadow-sm\"><\/div><\/section><div class=\"calcdash-ad not-prose calcdash-ad--calc_result calcdash-ad--in-article\"><ins class=\"adsbygoogle\" style=\"display:block\" data-ad-client=\"ca-pub-1721569815777345\" data-ad-slot=\"6317458308\" data-ad-layout=\"in-article\" data-ad-format=\"fluid\"><\/ins><script>(adsbygoogle = window.adsbygoogle || []).push({});<\/script><\/div>\n<style id=\"wpcoderpro-inline-1\">.formula-box {\r\n\tborder-bottom: none !important;\r\n}<\/style><section class=\"formula-box\" aria-labelledby=\"formula-title\">\r\n\t<div id=\"formula-title\" class=\"not-prose font-display mb-4\"><span class=\"icon icon-formula\" aria-hidden=\"true\"><\/span><h2>Cycling FTP Formula<\/h2><\/div>\r\n\t<figure class=\"not-prose formula\">\r\n\t\t<figcaption class=\"formula-title\">Formula<\/figcaption>\r\n\t\t<div class=\"text-base text-gray-800\" id=\"formula\">\n\\[ \\text{FTP} = 0.95 \\times P_{20} \\]<\/div>\r\n\t<\/figure>\r\n\t<\/p>\n<p><strong>Where:<\/strong><\/p>\n<ul>\n<li>\\(P_{20}\\) \u2014 average power sustained during an all-out 20-minute effort, in watts (W)<\/li>\n<li>\\(\\text{FTP}\\) \u2014 estimated functional threshold power, in watts (W)<\/li>\n<\/ul>\n<p>This is the widely used method from Hunter Allen and Andrew Coggan's <em>Training and Racing with a Power Meter<\/em>: multiplying 20-minute average power by 95% approximates the power a rider could hold for a full hour, which is the definition of FTP.<\/p>\n<p>\r\n<\/section>\n<style id=\"wpcoderpro-inline-459\">.calculation-box {\r\n\tborder-bottom: none !important;\r\n}<\/style><section id=\"calculation\" class=\"calculation-box\" aria-labelledby=\"calculation-title\">\r\n\t<div id=\"calculation-title\" class=\"not-prose font-display\"><span class=\"icon icon-unordered-list\" aria-hidden=\"true\"><\/span><h2>Cycling FTP \u2013 Calculation Example<\/h2><\/div>\r\n\r\n<p>{example}<\/p>\n<p><strong>Example:<\/strong> a rider completes an all-out 20-minute test on the indoor trainer and the head unit reports an average power of 260 W.<\/p>\n<p>\\[ \\text{FTP} = 0.95 \\times 260 = 247 \\text{ W} \\]<\/p>\n<p><strong>Result:<\/strong> estimated FTP is 247 W, which rounds to a suggested training value of 245 W (nearest 5 W).<\/p>\n<p>{\/example}<\/p>\n\r\n<\/section>\n<h2>How to Use the Calculator<\/h2>\n<ol>\n<li>Complete a properly paced 20-minute time-trial effort \u2014 ideally after a thorough warm-up and a short hard effort beforehand to pre-fatigue the anaerobic system.<\/li>\n<li>Check the average power figure on your bike computer or training app for the full 20-minute interval.<\/li>\n<li>Enter that value in the <strong>Average power, 20-minute test<\/strong> field (any value between 50 and 1000 W).<\/li>\n<li>Read your <strong>Estimated functional threshold power (FTP)<\/strong> in watts, along with a <strong>Suggested training value<\/strong> rounded to the nearest 5 W, which is what most training platforms expect you to enter.<\/li>\n<\/ol>\n<h2>What Is FTP and Why It Matters<\/h2>\n<p>Functional threshold power (FTP) is the highest power a cyclist can sustain for approximately one hour in a quasi-steady state without fatiguing. It is the single most useful number in power-based training because nearly every workout intensity is defined relative to it: recovery rides, endurance rides, tempo, threshold work and VO2max intervals all sit at fixed percentages of FTP.<\/p>\n<p>A direct one-hour time trial is the most accurate way to measure FTP, but it is brutally hard and impractical to do regularly. The 20-minute test with the 95% correction is a well-established compromise: it is demanding but repeatable, and research and coaching practice have shown the adjustment gives a good approximation for most trained riders.<\/p>\n<p>Knowing your FTP lets you set accurate training zones rather than training blind. If your zones are set too low, you undertrain; if too high, you accumulate fatigue and overreach. Retesting every 6\u20138 weeks during a rested week tracks your progress and keeps workout targets honest. Once you have your FTP, you can use our <a href=\"https:\/\/wpcalc.com\/en\/beauty\/cycling-ftp-power-zones-calculator\/\">Cycling Power Zones calculator<\/a> to generate the exact wattage ranges for each zone.<\/p>\n<p>FTP also gives practical numbers for pacing events: a 40 km time trial is ridden at roughly 100\u2013105% of FTP, a century at around 65\u201375%, and a short climb well above it. Many riders also track FTP per kilogram of body weight to compare climbing ability across riders.<\/p>\n<h2>Limitations and Practical Tips<\/h2>\n<ul>\n<li><strong>The 95% factor is an average, not a law.<\/strong> Sprinters with large anaerobic capacity may overestimate their true one-hour power, while pure time trialists may underestimate it. Treat the result as a starting point, then adjust if workouts in the threshold zone feel consistently too easy or too hard.<\/li>\n<li><strong>Pacing matters.<\/strong> Starting too hard and fading, or finishing with too much left in the tank, distorts the result. Aim for the hardest power you can hold evenly across all 20 minutes \u2014 a slight negative split in the final minutes is ideal.<\/li>\n<li><strong>Warm up properly.<\/strong> A good warm-up including a few hard efforts makes the 20-minute figure more representative; testing cold usually produces a lower number.<\/li>\n<li><strong>Keep conditions comparable.<\/strong> Retest on the same course or trainer, at a similar time of day and state of freshness, so changes in FTP reflect fitness rather than circumstances.<\/li>\n<li><strong>Use the rounded value.<\/strong> Training platforms such as Zwift, TrainerRoad and Sufferfest ask for a whole number, and rounding to the nearest 5 W keeps your zones stable between tests.<\/li>\n<li><strong>FTP is not the whole picture.<\/strong> Recovery ability, sprint power, and aerobic efficiency all matter for performance. Pairing FTP with markers like <a href=\"https:\/\/wpcalc.com\/en\/beauty\/heart-rate-recovery-calculator\/\">heart rate recovery<\/a> gives a fuller view of your conditioning, and tracking your <a href=\"https:\/\/wpcalc.com\/en\/beauty\/sweat-rate-calculator\/\">sweat rate<\/a> helps you plan hydration for long threshold sessions.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Estimate your functional threshold power (FTP) from the average power of an all-out 20-minute ride. Enter your test power in watts and get your FTP plus a suggested training value.<\/p>\n","protected":false},"author":3168,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2],"tags":[38],"class_list":["post-66375","post","type-post","status-publish","format-standard","hentry","category-beauty","tag-fitness"],"acf":[],"_links":{"self":[{"href":"https:\/\/wpcalc.com\/en\/wp-json\/wp\/v2\/posts\/66375","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wpcalc.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wpcalc.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wpcalc.com\/en\/wp-json\/wp\/v2\/users\/3168"}],"replies":[{"embeddable":true,"href":"https:\/\/wpcalc.com\/en\/wp-json\/wp\/v2\/comments?post=66375"}],"version-history":[{"count":1,"href":"https:\/\/wpcalc.com\/en\/wp-json\/wp\/v2\/posts\/66375\/revisions"}],"predecessor-version":[{"id":66404,"href":"https:\/\/wpcalc.com\/en\/wp-json\/wp\/v2\/posts\/66375\/revisions\/66404"}],"wp:attachment":[{"href":"https:\/\/wpcalc.com\/en\/wp-json\/wp\/v2\/media?parent=66375"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wpcalc.com\/en\/wp-json\/wp\/v2\/categories?post=66375"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wpcalc.com\/en\/wp-json\/wp\/v2\/tags?post=66375"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}