Workout builder

Not sure if this has been asked before. But is it possible to have a workout step where you set a Pace or a Power target but you disable the target on the target device? The way Garmin implements the target warnings where they take up all the screen for a few seconds is really bothering me, so I want to have Garmin workouts without any targets. However in Intervals I like to see my workouts visually laid out in the calendar, so I want the workout steps to have targets in intervals, but not forwarded to Garmin. I assume this is not possible, or is it?

I wasn’t talking about the workout screen. I was talking about target alert screens, which pops up every time you cross the target threshold, take up all the screen and stay up for a few seconds. At least that is how it works on my watch and its annoying since the alert only shows the pace / power when you crossed over, so you can’t see your current stats when that happens for a few seconds.

I’m afraid that setting is not part of the Forerunner 970 settings.

Did AI tell you that? :slightly_smiling_face: I also have zero alerts in that menu, so there is nothing to turn off.

Anyway, here is a link of you saying it is not possible.

Here’s the toggle on an Edge device

I don’t have a 970, so have to follow the same prompts to get a similar outcome when using a Google search.

On the Garmin Edge bike computers you can turn off target alerts. I’ve done that and never receive the alerts.

Strange that Garmin doesn’t offer that for their watches. There have been forum posts going back 10 years I think of people requesting this, but still no change in 2026.

Hey, sorry if that AI comment rubbed you the wrong way. My experience with AI is that they like to lie about stuff. Anyway, thanks for trying to find a solution. However I wasn’t looking for a solution on the Garmin side, since I’ve done the research already and knew it couldn’t be done. I’ve came here to query if I can achieve this somehow through the Workout builder. But I guess that isn’t an option either. Too bad though, since my only option is to remove targets in the workouts and then there will be no visual representation of the intervals.

Anyway if any of the devs is reading this, a toggle to disable the targets on the generated workouts would be useful to some of us (mostly Garmin watch users I presume).

1 Like

Not to worry; deleting the (irrelevant) information keeps the thread cleaner.

In the Garmin Connect workout builder there is a function to skip the last recovery step in a repeat and go straight to the cooldown (or whatever comes next in the workout). Would be cool to have something similar in the Intervals workout builder.

Could look something like:

Main set
3x

  • 1 km z5 pace
  • 2m intensity=recovery skip_last=yes

Cooldown

  • 2km Z2 Pace intensity=cooldown
8 Likes

Does this skip_last function is a part of intervals icu workout builder or only hypothetical scenario to explain a concept?

1 Like

Hypothetical to explain how it could work

1 Like

I gather there’s no actual documentation for the detailed workings of the parser other than the wisdom scattered through this thread?
I’ve got an MCP server using the API and it’s doing great for pulling data and chatting about completed activities and forward plans. It can also update future workouts, but it sometimes struggles for format more nuanced workout plans. The actual parser code or pseudo-code would be a massive help to steer it. Don’t suppose that’s available?

hi! I’m having the same issues. I feel like a dumb newbie, but either it’s not working for me or I have the wrong expectations from intervals.icu (and in extension also https://www.intervalcoach.app/

I’m a runner and I’m looking for what the screenshots do:
smart, adaptable workouts that sync to my garmin and do what my garmin workouts do on the watch: show me the objectives for each step en indiciate the targets (HR based or tempo based)

now I only get some text and ‘other’, but to me that is not helpfull at all. It’s unclear and not guided with data screens on watch

also the ‘FIT’ builder (I tried in Chrome and Brave browser), I can add text and even use the ‘add step’ builder, but I never get the ‘blocks’ as provided in screenshots in the topic (on Workout builder - #261 by Michele_Meotto)

am I missing something?

thank you so much for your help
, I’d love to train as efficient as possible for my first very ultra in the swiss mountains :slight_smile:

1 Like

Off topic but please keep us informed how you go about using Intervals for Ultra Running. I think that with the combination of AI, the potential is big for runners who would like to coach themselves using data.
PS: right now I’m actually using Stryd to design my workouts and I need to duplicate them in Intervals calendar in order to have Fitness prediction. Stryd is sending the workouts to Garmin and it displays very well during execution. Then once done I’m uploading the FIT in Intervals. I’m using that manual process to have control on the different steps and develop my understanding but there’s room for automation.

Thanks for the great training platform and taking the time to write an API.
I am writing an indoor bike computer in micropython, running on a Waveshare 1.8" Knob Touch device - https://www.waveshare.com/wiki/ESP32-S3-Knob-Touch-LCD-1.8

I am investigating downloading workouts onto the device from intervals.icu. I have this working and the cookbook made it really very easy, so thanks for that - Downloading planned workouts from the API

But I have encountered some parsing errors of the workout descriptions that I don’t think are confined to the API. I.e. I can see these errors when viewing the workout on the web when hovering over the chart that is generated from the list of workout elements.

The errors I am seeing relate mainly to the description text that goes before the actual workout fields. To test my interpretation of the json returned by the API, I created a workout that contained most of the various options. Furthermore, I created all of these workout steps using the ‘Add Step’ dialog, rather than freehand. So if anything that I typed into a field was invalid, it could be picked up here. Here is my test workout:

Just for testing Intervals.ICU developer API.

5x
- 10s 500w
- 10s 100w
- Percentage of FTP 1m 50%
- Percentage of FTP Range 1m 45-55% 
- Zone 2 1m Z2
- Zone 2 to Zone 3 1m Z2-Z3
- 70% of Step Duration MMP 1m 70% MMP 1m
- 60% of 5m MMP 1m 60% MMP 5m
- 55 to 75% of step duration MMP 1m30 55-75% MMP
- 275 Watts 2m 275w
- 270 to 280 Watts 2m30 270-280w
- Percent of Max HR 1m 50% HR
- Percent of Max HR Range 1m 45-55% HR
- Percent of LTHR 1m 70% LTHR
- Percent of LTHR Range 1m 65-75% LTHR
- Zone 4 HR 1m Z4 HR
- Z2 to Z3 HR Range 1m Z2-Z3 HR
- 90RPM 1m 90rpm
- RPM Range 1m 85-95rpm
- Cooldown Ramp 5m ramp 250-150w

Here is my recreation of the workout description from the returned json data:

Just for testing Intervals.ICU developer API.

5x
- 10s 500w
- 10s 100w
- Percentage of FTP 1m 50%
- Percentage of FTP Range 1m 45-55%
- Zone 2 1m Z2
- Zone 2 to Zone 3 1m Z2-Z3
- 1m 70% MMP 1m
- 5m 60% MMP 5m
- 55 to 1m30 55-75% MMP
- 2m 275w
- 270 to 2m30 270-280w
- Percent of Max HR 1m 50% HR
- Percent of Max HR Range 1m 45-55% HR
- Percent of LTHR 1m 70% LTHR
- Percent of LTHR Range 1m 65-75% LTHR
- Zone 1m Z4 HR
- 1m Z2
- 90RPM 1m 1m 90rpm
- RPM Range 1m 85-95rpm
- Cooldown Ramp 5m ramp 250-150w

You can see that the description text is not the same. I first thought I was not parsing the json correctly. But here are the json workout steps…

    "workout_doc": {
      "steps": [
        {
          "reps": 5,
          "text": "5x",
          "steps": [
            {
              "power": {
                "units": "w",
                "value": 500
              },
              "duration": 10
            },
            {
              "power": {
                "units": "w",
                "value": 100
              },
              "duration": 10
            }
          ],
          "distance": 0,
          "duration": 100
        },
        {
          "text": "Percentage of FTP",
          "power": {
            "units": "%ftp",
            "value": 50
          },
          "duration": 60
        },
        {
          "text": "Percentage of FTP Range",
          "power": {
            "end": 55,
            "start": 45,
            "units": "%ftp"
          },
          "duration": 60
        },
        {
          "text": "Zone 2",
          "power": {
            "units": "power_zone",
            "value": 2
          },
          "duration": 60
        },
        {
          "text": "Zone 2 to Zone 3",
          "power": {
            "end": 3,
            "start": 2,
            "units": "power_zone"
          },
          "duration": 60
        },
        { ############# Text field missing altogether. Should read '70% of Step Duration MMP'
          "power": {
            "units": "%mmp",
            "value": 70,
            "mmp_duration": 60
          },
          "duration": 60
        },
        { ############# Text field missing altogether. Should read '60% of 5m MMP'
          "power": {
            "units": "%mmp",
            "value": 60,
            "mmp_duration": 300
          },
          "duration": 300
        },
        {
          "text": "55 to",   ######## Should read '55 to 75%'
          "power": {
            "end": 75,
            "start": 55,
            "units": "%mmp",
            "mmp_duration": null
          },
          "duration": 90
        },
        { ############# Text field missing altogether. Should read '275 Watts'
          "power": {
            "units": "w",
            "value": 275
          },
          "duration": 120
        },
        {
          "text": "270 to",   ################# Should read '270 to 280 Watts'
          "power": {
            "end": 280,
            "start": 270,
            "units": "w"
          },
          "duration": 150
        },
        {
          "hr": {
            "units": "%hr",
            "value": 50
          },
          "text": "Percent of Max HR",
          "duration": 60
        },
        {
          "hr": {
            "end": 55,
            "start": 45,
            "units": "%hr"
          },
          "text": "Percent of Max HR Range",
          "duration": 60
        },
        {
          "hr": {
            "units": "%lthr",
            "value": 70
          },
          "text": "Percent of LTHR",
          "duration": 60
        },
        {
          "hr": {
            "end": 75,
            "start": 65,
            "units": "%lthr"
          },
          "text": "Percent of LTHR Range",
          "duration": 60
        },
        {
          "hr": {
            "units": "hr_zone",
            "value": 4
          },
          "text": "Zone",    ########### Should read 'Zone 4 HR'
          "duration": 60
        },
        {   ###### Text field missing. Should read 'Z2 to Z3 HR Range'
          "hr": {
            "end": 3,
            "start": 2,
            "units": "hr_zone"
          },
          "power": { ############# This power section shouldn't be here at all
            "units": "power_zone",
            "value": 2
          },
          "duration": 60
        },
        {
          "text": "90RPM 1m",
          "cadence": {
            "units": "rpm",
            "value": 90
          },
          "duration": 60
        },
        {
          "text": "RPM Range",
          "cadence": {
            "end": 95,
            "start": 85,
            "units": "rpm"
          },
          "duration": 60
        },
        {
          "ramp": true,
          "text": "Cooldown Ramp",
          "power": {
            "end": 150,
            "start": 250,
            "units": "w"
          },
          "cooldown": true,
          "duration": 300,
          "intensity": "cooldown"
        }
      ],

Apologies if this is already covered. I scrolled all the way through the 684 replies and searched for all instances of ‘parse’, but didn’t see anything similar to this mentioned.

I am wondering if there is a way to quote the text within the description. This would be a sufficient workaround.
Or if this is intended behaviour, is there a list of characters that cannot be used within the text?
But I am inclined to say this is a bug, since I even (above) managed to create a workout step with both a power and a heart rate section.

You can write that as

- ' 70 % of Step Duration MMP 1m' 70% MMP 1m

Import is the space after the first and between 70 and %.

Thanks. I imagine it gets messy to then explain how different devices pick this up, unless that’s part of the code on the side too. Things like the “press lap” functionality that’s parseable.

ok thx, this was helpfull. Play around a bit and got it into Garmin exactly as I wanted. Now I can explore into further detail and see if IntervalCoach can adapt its FIT suggestions into this working format. @mrusschen

thx @MedTechCD