Syncing both pace and heart rate to Garmin Connect workout

I encountered this issue as well. If a workout only consists of HR or Pace targets then the output from intervals.icu syncs as expected - any combination thereafter and only a single target type is generated.

From intervals.icu I exported a fit file and using (FIT file viewer – RUNALYZE) I could see the HR targets were correct but pace was left as “open”.

I then tried to reproduce a fit file on intervals.icu that was originally created on Garmin Connect:

  1. create simple workout with HR target steps and Pace target steps
  2. sync to watch
  3. connect watch to computer and grab the *_workout.fit file
  4. import the fit file to intervals.icu (the plain text steps appear as expected)
  5. export and sync the fit file generated by intervals.icu

In (5) above the fit file produced does not contain the correct target type information (File Types | FIT SDK | Garmin Developers). Details of the simple workout are listed below.

So, I believe there is a bug in the code that is generating fit files given:

  1. use of “open” target type
  2. inability to reproduce a simple uploaded fit file originally generated by Garmin Connect

Unfortunately, it seems the only potential workaround is to externally generate a correct fit file using Python (or other utility/language - though there are quite a few Python options on GitHub).

Note:

The default workout order on the settings page (“Power, HR, Pace”) does not correctly handle this. Changing it to (“Pace, HR, Power”) will result in pace but then HR targets are “open” in the generated fit file. Ideally, the plain text would prefer the first target type listed so one could properly create mixed target type workouts.

Reference:

Workout plain text:

- Warmup 5m Z1 HR
- 15m Z2 HR
- 5m 89-94% Pace

Garmin Connect FIT:

SUCCESS
# File size: 1197, protocol version: 1.00, profile_version: 21.96
# File header CRC: expected=0x014F, calculated=0x014F
= TYPE=0 NAME=file_id NUMBER=0
--- serial_number=1318830246=1318830246
--- time_created=1125862911=2025-09-03T19:41:51Z
--- manufacturer=1=garmin
--- garmin_product=65534=connect
--- type=5=workout
==
= TYPE=0 NAME=file_creator NUMBER=49
--- software_version=2517=2517
--- hardware_version=0=0
==
= TYPE=0 NAME=workout NUMBER=26
--- capabilities=32=protected=0,resistance=0,grade=0,power=0,cadence=0,distance=0,heart_rate=0,speed=0,tcx=32,new_leaf=0,firstbeat=0,fitness_equipment=0,custom=0,interval=0
--- wkt_name="FF1_TEST"
--- xxx10=417577=417577
--- num_valid_steps=3=3
--- sport=1=running
--- xxx9=1=1
--- sub_sport=0=generic
==
= TYPE=0 NAME=workout_step NUMBER=27
--- duration_time=300000=300.000 s
--- target_hr_zone=1=1
--- message_index=0=selected=0,reserved=0,mask=0
--- duration_type=0=time
--- target_type=1=heart_rate
--- intensity=2=warmup
==
= TYPE=0 NAME=workout_step NUMBER=27
--- duration_time=900000=900.000 s
--- target_hr_zone=2=2
--- message_index=1=selected=0,reserved=0,mask=1
--- duration_type=0=time
--- target_type=1=heart_rate
--- intensity=0=active
==
= TYPE=0 NAME=workout_step NUMBER=27
--- duration_time=300000=300.000 s
--- target_speed_zone=0=0
--- custom_target_speed_low=2823=10.163 km/h
--- custom_target_speed_high=2980=10.728 km/h
--- message_index=2=selected=0,reserved=0,mask=2
--- duration_type=0=time
--- target_type=0=speed
--- intensity=0=active
==
# CRC: expected=0xCD32, calculated=0xCD32

Intervals.icu Generated FIT

SUCCESS
# File size: 207, protocol version: 2.00, profile_version: 211.71
# File header CRC: expected=0x6243, calculated=0x6243
= TYPE=0 NAME=file_id NUMBER=0
--- manufacturer=255=development
--- type=5=workout
--- product=1=1
--- product_name="Intervals.icu"
--- serial_number=110=110
==
= TYPE=0 NAME=workout NUMBER=26
--- sport=1=running
--- wkt_name="FF1_TEST"
--- num_valid_steps=3=3
==
= TYPE=0 NAME=workout_step NUMBER=27
--- duration_type=0=time
--- duration_time=300000=300.000 s
--- target_type=1=heart_rate
--- custom_target_heart_rate_low=204=204 bpm
--- custom_target_heart_rate_high=231=231 bpm
--- target_hr_zone=0=0
--- wkt_step_name="Warmup"
--- intensity=5=5
--- message_index=0=selected=0,reserved=0,mask=0
==
= TYPE=0 NAME=workout_step NUMBER=27
--- duration_type=0=time
--- duration_time=900000=900.000 s
--- target_type=1=heart_rate
--- custom_target_heart_rate_low=232=232 bpm
--- custom_target_heart_rate_high=246=246 bpm
--- target_hr_zone=0=0
--- intensity=5=5
--- message_index=1=selected=0,reserved=0,mask=1
==
= TYPE=0 NAME=workout_step NUMBER=27
--- duration_type=0=time
--- duration_time=300000=300.000 s
--- target_type=2=open
--- message_index=2=selected=0,reserved=0,mask=2
==
# CRC: expected=0xA910, calculated=0xA910