Heart-rate zones calculator template
Maximum heart rate and the five training zones from age and resting heart rate, by Karvonen or percent of maximum. Three inputs, eleven calculation fields, no submit.
Try the live Heart-rate zones calculator first- Import-ready Gravity Forms JSON
- One-page install guide
- The plugins it needs, with links
- Everything in Template
- Step-by-step PDF with screenshots of every field and formula
- The CSS skin from this site, with notes on matching your brand
What you'll need
Check these before you buy so there are no surprises. Links may be affiliate links.
- Required Gravity Forms (any license) Calculation fields and radio values are in core.
Free build guide: Heart-rate zones calculator for WordPress
This guide rebuilds the Heart-rate zones calculator from this site in Gravity Forms: 3 inputs, 11 live results and no submit button. Expect about 42 minutes by hand. The template above is the same form as an import file, and the bundle adds a PDF version of this guide with a screenshot of every setting, plus the stylesheet.
You will end up with:
- Maximum heart rate (bpm)
- Zone 1 from (50%)
- Zone 1 to (60%)
- Zone 2 from (60%)
- Zone 2 to (70%)
- Zone 3 from (70%)
- Zone 3 to (80%)
- Zone 4 from (80%)
- Zone 4 to (90%)
- Zone 5 from (90%)
- Zone 5 to (100%)
What you need
- Gravity Forms (any license) — Calculation fields and radio values are in core.
Everything here is core Gravity Forms. No add-ons.
1. Create the form
- Go to Forms → New Form and name it Heart-rate zones.
- In Form Settings → Form Layout, set the CSS Class Name to
fo-live-only. Step 3 uses it to hide the submit button. - Leave the form open in the editor; the fields come next.
2. Add the fields, in this order
Field IDs are assigned as you add fields. If yours come out differently, change the {Label:ID} references in the formulas to match your IDs. Settings not mentioned stay at their defaults.
1. Age · Number · ID 1
Number Format 9,999.99; Default Value 40; Layout: half width, on the same row as its neighbour (drag the field beside it in the editor; no CSS class needed).
2. Resting heart rate (bpm) · Number · ID 2
Number Format 9,999.99; Default Value 60; Description “Count it in bed before getting up, or read it off a watch. 60–70 is typical; fit people run lower.”; Layout: half width, on the same row as its neighbour (drag the field beside it in the editor; no CSS class needed).
3. Method · Radio Buttons · ID 3
Custom CSS Class (Appearance tab) fo-segmented.
Choices (tick show values and enter each value):
- Heart-rate reserve (Karvonen) — value
1(selected by default) - Percent of maximum — value
0
4. Maximum heart rate (bpm) · Number · ID 4
Number Format 9,999.99; Description “220 minus age. A measured maximum from a hard test is better if you have one.”; Custom CSS Class (Appearance tab) fo-result; tick Enable Calculation, Rounding 0.
( 220 - {Age:1} )
5. Zone 1 from (50%) · Number · ID 5
Number Format 9,999.99; Description “Recovery, very easy.”; Layout: half width, on the same row as its neighbour (drag the field beside it in the editor; no CSS class needed); Custom CSS Class (Appearance tab) fo-result fo-result--sub; tick Enable Calculation, Rounding 0.
( {Method:3} * ( {Resting:2} + ( ( 220 - {Age:1} ) - {Resting:2} ) * 0.5 ) + ( 1 - {Method:3} ) * ( 220 - {Age:1} ) * 0.5 )
6. Zone 1 to (60%) · Number · ID 6
Number Format 9,999.99; Layout: half width, on the same row as its neighbour (drag the field beside it in the editor; no CSS class needed); Custom CSS Class (Appearance tab) fo-result fo-result--sub; tick Enable Calculation, Rounding 0.
( {Method:3} * ( {Resting:2} + ( ( 220 - {Age:1} ) - {Resting:2} ) * 0.6 ) + ( 1 - {Method:3} ) * ( 220 - {Age:1} ) * 0.6 )
7. Zone 2 from (60%) · Number · ID 7
Number Format 9,999.99; Description “Easy aerobic, conversational. Most of your training time.”; Layout: half width, on the same row as its neighbour (drag the field beside it in the editor; no CSS class needed); Custom CSS Class (Appearance tab) fo-result fo-result--sub; tick Enable Calculation, Rounding 0.
( {Method:3} * ( {Resting:2} + ( ( 220 - {Age:1} ) - {Resting:2} ) * 0.6 ) + ( 1 - {Method:3} ) * ( 220 - {Age:1} ) * 0.6 )
8. Zone 2 to (70%) · Number · ID 8
Number Format 9,999.99; Layout: half width, on the same row as its neighbour (drag the field beside it in the editor; no CSS class needed); Custom CSS Class (Appearance tab) fo-result fo-result--sub; tick Enable Calculation, Rounding 0.
( {Method:3} * ( {Resting:2} + ( ( 220 - {Age:1} ) - {Resting:2} ) * 0.7 ) + ( 1 - {Method:3} ) * ( 220 - {Age:1} ) * 0.7 )
9. Zone 3 from (70%) · Number · ID 9
Number Format 9,999.99; Description “Steady tempo, short sentences.”; Layout: half width, on the same row as its neighbour (drag the field beside it in the editor; no CSS class needed); Custom CSS Class (Appearance tab) fo-result fo-result--sub; tick Enable Calculation, Rounding 0.
( {Method:3} * ( {Resting:2} + ( ( 220 - {Age:1} ) - {Resting:2} ) * 0.7 ) + ( 1 - {Method:3} ) * ( 220 - {Age:1} ) * 0.7 )
10. Zone 3 to (80%) · Number · ID 10
Number Format 9,999.99; Layout: half width, on the same row as its neighbour (drag the field beside it in the editor; no CSS class needed); Custom CSS Class (Appearance tab) fo-result fo-result--sub; tick Enable Calculation, Rounding 0.
( {Method:3} * ( {Resting:2} + ( ( 220 - {Age:1} ) - {Resting:2} ) * 0.8 ) + ( 1 - {Method:3} ) * ( 220 - {Age:1} ) * 0.8 )
11. Zone 4 from (80%) · Number · ID 11
Number Format 9,999.99; Description “Threshold, hard, a few words at a time.”; Layout: half width, on the same row as its neighbour (drag the field beside it in the editor; no CSS class needed); Custom CSS Class (Appearance tab) fo-result fo-result--sub; tick Enable Calculation, Rounding 0.
( {Method:3} * ( {Resting:2} + ( ( 220 - {Age:1} ) - {Resting:2} ) * 0.8 ) + ( 1 - {Method:3} ) * ( 220 - {Age:1} ) * 0.8 )
12. Zone 4 to (90%) · Number · ID 12
Number Format 9,999.99; Layout: half width, on the same row as its neighbour (drag the field beside it in the editor; no CSS class needed); Custom CSS Class (Appearance tab) fo-result fo-result--sub; tick Enable Calculation, Rounding 0.
( {Method:3} * ( {Resting:2} + ( ( 220 - {Age:1} ) - {Resting:2} ) * 0.9 ) + ( 1 - {Method:3} ) * ( 220 - {Age:1} ) * 0.9 )
13. Zone 5 from (90%) · Number · ID 13
Number Format 9,999.99; Description “Maximal, intervals of a few minutes at most.”; Layout: half width, on the same row as its neighbour (drag the field beside it in the editor; no CSS class needed); Custom CSS Class (Appearance tab) fo-result fo-result--sub; tick Enable Calculation, Rounding 0.
( {Method:3} * ( {Resting:2} + ( ( 220 - {Age:1} ) - {Resting:2} ) * 0.9 ) + ( 1 - {Method:3} ) * ( 220 - {Age:1} ) * 0.9 )
14. Zone 5 to (100%) · Number · ID 14
Number Format 9,999.99; Layout: half width, on the same row as its neighbour (drag the field beside it in the editor; no CSS class needed); Custom CSS Class (Appearance tab) fo-result fo-result--sub; tick Enable Calculation, Rounding 0.
( {Method:3} * ( {Resting:2} + ( ( 220 - {Age:1} ) - {Resting:2} ) * 1 ) + ( 1 - {Method:3} ) * ( 220 - {Age:1} ) * 1 )
3. Hide the submit button
The results are live, so nothing needs submitting. Add this filter to your theme’s functions.php or a code-snippets plugin; it hides the button on any form carrying the fo-live-only class:
add_filter( 'gform_submit_button', function ( $button, $form ) {
return str_contains( (string) rgar( $form, 'cssClass' ), 'fo-live-only' ) ? '' : $button;
}, 10, 2 );
Or with CSS alone: .fo-live-only_wrapper .gform_footer { display: none; }
4. Put it on a page and make it look like this
Add the form to any page with the Gravity Forms block, or the shortcode [gravityform id="X" title="false" ajax="false"]. The form inherits your theme’s styles; the classes you set in step 2 are hooks for the look you see on this site:
fo-resulton a calculation field makes it the big teal result panel.fo-result fo-result--submakes the smaller secondary figures.fo-segmentedon a radio field turns it into a segmented switch.- Two fields on one row is the editor’s own column layout: drag a field beside another and the row splits in half. No CSS class is needed, and the old
gf_left_halfReady Classes are deprecated.
The bundle includes the two stylesheets that implement those classes, with notes on matching your brand colours. Without them the form still works; it just looks like your theme’s default Gravity Forms styling.
How the maths works is explained under “How it’s calculated” on the live Heart-rate zones calculator.