Building workout using zone number instead of percentage range

Hello, I have read through the post regarding workout building, and I wondered if it is possible to specify an intensity using zones?


  • 10m Z1 LTHR
  • 1h10m Z2 LTHR
  • 10m Z1 LTHR

If not, do people generally memorize the percentages of their zones, or look them up in the settings view?


I have added that to the todo list. I think people tend to use percentages because the zones are quite wide e.g. there is a huge difference between 106% and 120% and thats all Z5 for me (power zones).

1 Like

Yeah that makes sense. Perhaps a nice improvement would be to show the power and HR ranges in a tooltip or popup on the workout builder modal.

Thats a good idea. Will do soon.


In triathlon people use zones all the time. (Also, intervals defined by distance instead of time)

The ability to quickly create a workout using zones and then specify the percentages if necessary would be nice

1 Like

How would your ERG trainer react in this situation? The range of power in L4 is 90-105%, so the Garmin workout pegs it in the middle, i.e. 97%.

As someone that uses a non-smart trainer, it’s easy to increase/decrease power based on how average HR is tracking; the goal would be to have minimal cardiac drift.

There’s a good argument for having a “range” of values within a zone/level. If my athletes are supposed to do a workout at VO2max power, and they struggled on the previous workouts, or are feeling a little fatigued, I’ll tell them to keep it closer to 106% and see how they react; the first and last interval needs to be the same for it to be effective. Likewise, if they’re feeling good, then I’ll ask them to push it closer to 120% for all intervals. It’s still within the same “zone/level”. The % doesn’t really make a difference, and nor would having it a “zones”. Executing it is key, and being able to review it afterwards is all I’m really interested to see.

1 Like

Most trainers (software/apps) also has the quick +/- button to get the % or Raw Watts up or down to further fine tune it based on what you are feeling. so using the exact wattage/% range to me is really a bit counter to the final goal of just riding to the zone.

I have added support for specifying workout steps by zone for power, heart rate and pace. So you can do:

- 30m Z2 HR

And the range will be low Z2 - high Z2 for the athlete.


Great update, thanks! :slight_smile:

I think there is a little bug introduced, it looks like it’s not counting Z1 anymore:
Screenshot 2022-04-14 105844

Until yesterday everything was ok.

EDIT: oh, I understand what is happening here. My “descriptions” (Z3, Z4,…) are now clashing with this new functionality, probably triggering this workout to be interpreted as power based.

Add Z1 before your Warmup line.
If I copy your workout, it shows Z1 once it is added.

  • Warmup Z1 10m 60-58% LTHR

Z3 2m 83-94% LTHR

Edit: or get rid of the Z1/2 and only use

  • 10m 50-68-% LTHR


  • 2m 83-94% LTHR

1 Like

Curious… this is a Bike Workout that’s HR Based? (Indoors on Turbo or outdoors?)

Yes, outdoors. It’s not ideal, but good enough for the start without powermeter :slight_smile:

1 Like

Drat … that is going to cause some problems with existing workouts. The default is power so if you have “Z2” in a step for an existing HR based workout you now also have power. will pick power or HR for the workout depending on the settings of the athlete.

@david for Zone based workouts targets, I noticed in the JSON file it is marked as (for a Z2 workout)


Where would I be able to get the definition of the Zones? I hope that you have planned to add the zones definition somewhere in the JSON file downloads (similar to how you’re already adding LTHR and MAX_HR and the like into the JSON file)


Which endpoint are you getting that from?

From this as it’s easier to download and do quick checks.

They will be different from a direct download vs getting it from the API?
let me check.

For a workout like this:

{“id”:“Z2”,“zone”:2,“name”:“Z2”,“color”:"#009e00",“max”:75,“minWatts”:111,“maxWatts”:150,“percentRange”:“56% - 75%”,“secs”:600}

So, it should be plausible to get the Power Zone Ranges from the id:Z2

Having a Power Zone range for indoor turbo training would be troublesome. Looks like just provides the middle of the zone 65.5 % ((56+75)/2) for MRC. Which is fine. ERG mode needs an actual target rather than a range. Edit: Supported now. BreakAway can now parse Power Zone Workouts using

  1. if not a ramp, will use the middle of the zone as Power Target
  2. if ramp, we will ramp from bottom of zone to top of zone (eg: from 56% to 75% of Power Z2)

For Z2 HR workout

This is what I get from the API Endpoint as well as the Download JSON.


API EndPoint -"

Screenshot 2022-04-15 at 12.34.26 PM

Drats… I just got caught by this as well…
Changing it to Zone3 instead of Z3 worked.

using plain text is indeed going to be more challenging

I have update the “JSON” workout download to include the actual watts, bpm and mps values for power, hr and pace targets in steps. These are calculated using the zones etc for the athlete.

  "duration": 3600,
  "ftp": 290,
  "target": "POWER",
  "steps": [
      "duration": 3600,
      "power": {
        "value": 2.0,
        "units": "power_zone"
      "hidepower": false,
      "_power": {
        "value": 190.0,
        "start": 162.0,
        "end": 218.0
  "options": {}

The resolved values are in _power, _hr and _pace.

Absolute (not a range) power, pace and HR targets are converted into a range using a percentage of value (powerRange=2.5, paceRange=2.5, hrRange=1.5). You can specify these as query parameters to override.

If the workout has steps using power and/or HR and/or pace then the athletes preferences for the sport are used to choose how to execute the workout. This is in the “target” field. All targets are resolved in any case but maybe someone wants to use this.

So you don’t have to mess around with the zones to try calculate power etc…

1 Like

some observations and quick question.

    You mentioned that this is in the Athlete’s preference for the sport. Then this would not have any impact? (I tried on a workout that has both Power and HR, and used “HR” and it still shows “target: POWER”. Only when I removed all references of power, then the workout becomes “target=HR”. This is the intended behaviour? )

    This may become useful as I too am trying to differentiate between w HR Based workout (No Power Targets at all), a Power Based workout (no HR Targets at all) and a Hybrid Power + HR
    based workout.

    Hybrid power + hr workout = some parts user is using Power to control the trainer, some parts, user is asking for HR to control power targets. I may also expand this to using slope targets instead of wattage targets which would make HR Based training simpler (something like riding outdoors - and users get a > HR target beep or < hr target beep)

  2. What’s the usage of “hidepower”?

  3. Looks like you’ve removed all the (power)zoneTimes, maxHR, LTHR, FTP values…
    Would it be at all possible to re-instate the maxHR / LTHR / FTP . I currently store power based workouts as % of FTP as it easier to scale as user’s FTP changes. (The workouts don’t have to change. ) I’m doing the same thing for HR Based Training as well. Basically, this change broke everything I’m been testing/coding for past ~3weeks lolz.)

    If you could re-instate the maxHR/LTHR/FTP, then I can actually back-calculate the actual watts/bpm/mps into %. power_zone and hr_zone and it can be “best of both worlds” in terms of flexibility. :pray:

Edit: Stupid me… you’ve provided %FTP and %HR values as well as the corresponding actual watts/bpm… i think I can work w this… just need to refactor a bunch of stuffs… "dont’ change anything yet"

  1. I don’t quite understand the powerRange/hrRange parameters. How does the workout that uses this look like?