| Zone | Percent of LTHR | BPM range | Purpose | Copy |
|---|---|---|---|---|
| {{ z.id }} | {{ z.percent_display }} | {{ z.bpm_display }} | {{ z.cue }} |
| Zone | Minutes | Percent | Intent | Copy |
|---|---|---|---|---|
| Set a session duration to build a plan. | ||||
| {{ row.id }} | {{ row.minutes_display }} | {{ row.percent_display }} | {{ row.intent }} | |
Heart rate training zones are intensity ranges that tie a pulse reading to how hard you are working and how it should feel over time. They are often anchored to a threshold heart rate, so lactate threshold heart rate zones for running and cycling stay personal even when pace varies. When the ranges are realistic, they help you keep easy days truly easy, place hard efforts with intent, and compare weeks without overthinking numbers.
Start with a threshold value and a sport, and the calculator converts that anchor into seven zones with beats per minute ranges plus a plain language purpose cue. If you know the average heart rate from a recent test, you can let it estimate the threshold for you and apply a small offset when switching sports. Optionally add a current heart rate to see which zone you are in right now, then add a planned duration to shape a simple session plan.
For example, a cyclist with a threshold around 165 beats per minute might see an endurance range near the mid 130s to mid 140s for steady long rides. With a 60 minute endurance focused workout, the plan can apportion about 33 minutes to endurance and 12 minutes to recovery, with the rest split across moderate zones.
Treat boundaries as guide rails rather than hard walls, since fatigue, heat, caffeine, altitude, and sensor fit can all shift readings on a given day. Retest your threshold periodically and keep the same strap or optical sensor placement when you want week to week comparisons to stay meaningful. If you share a screenshot or exported file, remember heart rate data can be personal.
A zone that matches the math does not guarantee a safe intensity, especially if you have symptoms, illness, or a new training load.
This tool provides informational estimates and does not substitute professional advice.
Lactate Threshold Heart Rate (LTHR) is a practical intensity anchor that approximates the highest heart rate you can sustain for a long steady effort before fatigue rises quickly. Because heart rate responds to heat, recovery, hydration, and pacing choices, anchoring zones to LTHR helps targets stay personal.
Friel Training Zones define each zone as a percentage band of LTHR, with slightly different bands for cycling and running. The UI note reflects this discipline difference by pointing out that running heart rates often trend a few beats higher than cycling for a similar effort.
The app computes an applied threshold by using either a manual LTHR value or an estimated LTHR derived from a field test average multiplied by a discipline specific factor. An optional offset in beats per minute is then added, and the applied threshold is clamped between 0 and 260 bpm.
Zone boundaries are computed by multiplying the applied threshold by each band limit and rounding to whole beats per minute. If you also provide a session duration and a focus preset, the session plan allocates minutes across zones using a fixed distribution.
| Symbol | Meaning | Unit or Datatype | Source |
|---|---|---|---|
T_manual |
Manually entered threshold heart rate | bpm | Input |
HR_test |
Average heart rate from a field test | bpm | Input |
f_test |
Multiplier chosen by test method and discipline | number | Constant |
o_bpm |
Offset added to the derived threshold | bpm | Input |
T_effective |
Applied threshold used to compute zone ranges | bpm | Derived |
p_low, p_high |
Lower and upper zone proportions of LTHR | number | Constant |
HR_low, HR_high |
Zone boundary heart rates after rounding | bpm | Derived |
HR_current |
Current heart rate used for zone lookup | bpm | Input |
M_session |
Planned workout duration | min | Input |
w_z |
Focus preset weight for zone z | number | Constant |
m_z |
Allocated minutes in zone z | min | Derived |
Assume cycling, test override on, test average 170 bpm, test method 20 minute field test with factor 0.95, and an offset of +3 bpm.
Cycling zone Z2 uses 82% to 89% of LTHR, and the boundaries are rounded to whole beats per minute.
For a 60 minute endurance base session, the preset assigns 55% to Z2.
In this example, Z2 is 135 to 146 bpm, and the plan suggests about 33 minutes in that zone during an endurance base workout.
The zone table is built by multiplying the applied threshold by each band limit, then rounding each boundary to the nearest whole beat per minute. The app uses percent bands to explain the intent of each zone, and uses the rounded bpm boundaries as the daily target.
| Zone | Cycling low % | Cycling high % | Running low % | Running high % | Training emphasis |
|---|---|---|---|---|---|
| Z1 | 65 | 81 | 65 | 85 | Recovery and aerobic base |
| Z2 | 82 | 89 | 86 | 89 | Endurance cruising and durability |
| Z3 | 90 | 93 | 90 | 94 | Tempo and muscular endurance |
| Z4 | 94 | 99 | 95 | 99 | Sub threshold race specific work |
| Z5a | 100 | 102 | 100 | 102 | Super threshold cruise intervals |
| Z5b | 103 | 106 | 103 | 106 | VO2 max (maximal oxygen uptake) intervals |
| Z5c | 107 | 112 | 107 | 112 | Anaerobic capacity and short sprints |
Values close to a boundary are best interpreted with context, since heart rate can drift upward during longer efforts and can lag during short intervals.
The session plan is a time in zone template. It multiplies your planned duration by a focus preset distribution, then formats minutes to one decimal place.
| Focus preset | Z1 % | Z2 % | Z3 % | Z4 % | Z5a % | Z5b % |
|---|---|---|---|---|---|---|
| Recovery | 70 | 30 | 0 | 0 | 0 | 0 |
| Endurance base | 20 | 55 | 15 | 10 | 0 | 0 |
| Tempo | 15 | 25 | 40 | 15 | 5 | 0 |
| Threshold | 10 | 20 | 25 | 25 | 15 | 5 |
| VO2 and 5K | 10 | 15 | 15 | 20 | 20 | 20 |
When test override is enabled and a positive test average is provided, the app converts the field test average into an estimated LTHR using a discipline specific multiplier.
| Test method | Cycling factor | Running factor |
|---|---|---|
| 20 minute field test | 0.95 | 0.98 |
| 30 to 60 minute time trial or race | 1.00 | 1.00 |
| Long steady tempo | 0.93 | 0.97 |
| Lab or direct LTHR | 1.00 | 1.00 |
| Parameter | Meaning | Unit or Datatype | Practical range | Sensitivity | Notes |
|---|---|---|---|---|---|
| Threshold HR | Your LTHR anchor for the zone model | bpm | 90 to 230 | High | Used directly when test override is off. |
| Test average | Average HR from a steady field test | bpm | 0 to 240 | High | Used only when override is on and value is positive. |
| Test method | Defines the multiplier that estimates LTHR | enum | tt20, tt30, steady, lab | Medium | Factors differ slightly by discipline. |
| Discipline offset | Bpm adjustment applied after threshold estimation | bpm | Any number | Medium | Useful when running and cycling thresholds differ. |
| Current HR | Instant HR used to label the current zone | bpm | 0 to 260 | Low | Zone lookup is inclusive on both boundaries. |
| Session duration | Total minutes for the time in zone plan | min | 0 and above | Low | Minutes are allocated only when duration is positive. |
round(x) behavior for positive numbers.| Field | Type | Min | Max | Step or Pattern | Error text | Placeholder |
|---|---|---|---|---|---|---|
| Discipline | enum | — | — | cycling, running | — | — |
| Threshold HR | number | 90 | 230 | step 1 | Enter a threshold heart rate above 0 bpm. Threshold looks high. Keep it below 230 bpm. | — |
| Current HR | number | 0 | 240 | step 1 | Current heart rate must be 260 bpm or less. | — |
| Session duration | number | 0 | — | step 1 | Session duration cannot be negative. | 60 |
| Session focus | enum | — | — | recovery, endurance, tempo, threshold, vo2 | — | — |
| Test average | number | 0 | 240 | step 1 | Test average cannot be negative. | — |
| Test method | enum | — | — | tt20, tt30, steady, lab | — | — |
| Apply test override | boolean | — | — | true or false | — | — |
| Discipline offset | number | — | — | step 1 | Offset must be a number. | 0 |
| Output | Formats | What it contains |
|---|---|---|
| Zones | Table, CSV, DOCX | Zone id, percent of LTHR, bpm range, and a purpose cue. |
| Session plan | Table, CSV, DOCX | Zone id, allocated minutes, percent, and intent text. |
| Zones chart | PNG, WebP, JPEG, CSV | Bar ranges plus reference lines for LTHR and optional current HR. |
| JSON summary | JSON | Discipline label, applied threshold, source label, zones, and session allocation. |
The provided logic performs all calculations locally and does not call any network endpoints. It also does not write values to local storage or session storage, and identical inputs produce identical zone ranges and allocations.
Downloaded filenames include an ISO timestamp, so filenames differ even when the computed results are the same.
The underlying concepts are the lactate threshold anchor used in endurance physiology, the lab assessed or time trial derived threshold estimates offered as inputs, and the Friel discipline guidance reflected in the zone bands.
Heart rate values can be sensitive, and this page computes and formats results locally with no server side storage in the provided logic.
Heart rate zones turn a threshold anchor into clear intensity targets and a practical time split for a workout.
Example: Cycling, Threshold HR 165 bpm, Session duration 60 min, Session focus Endurance base.
You will get seven bpm ranges and a plan that allocates 33 min to Z2 and 12 min to Z1, with the remaining minutes split across higher zones.
Pro tip: retest threshold every few weeks during a training block, and avoid comparing hot weather rides to cool weather runs without adjusting expectations.
Once your zones look reasonable, use them to pace easy days and keep harder sessions inside the intended band.
The provided code computes results locally and does not send your values to a server or save them in local storage or session storage. If you copy or download outputs, those files live on your device.
Accuracy depends on how close your threshold estimate is to a true sustained effort threshold. A mismatched test, fatigue, heat, or sensor noise can shift heart rate, so treat zones as guidance and retest periodically.
Boundaries are rounded to whole bpm, so values near an edge can feel ambiguous.Heart rate is in beats per minute, zone definitions are percentages of LTHR, and session allocations are minutes. Minutes are rounded to 0.1 and shown without a trailing .0 when they land on a whole minute.
Zone math and exports do not call any endpoints. The chart view relies on a separate charting file, so that file must be available in your environment for charts to render.
This package does not include payments, accounts, or licensing text in the UI. Any pricing or licensing terms are determined by the site that hosts the page.
You cannot validate certificate signing requests here. This calculator focuses on heart rate training zones and time in zone planning.
If you meant a different type of check, look for a dedicated security utility.A borderline result usually means your current heart rate is near a zone boundary. Because boundaries are rounded to whole bpm, the safest interpretation is that you are straddling two zones and should use feel and breathing to decide.
If test override is enabled and a positive test average is entered, the app replaces the manual threshold with the test average multiplied by the selected factor. The discipline offset is then added to the derived threshold.
Blocking issue: If an error banner is shown, results are intentionally suppressed until all listed errors are resolved.