Rouvy: workouts using a range (FTP%) import as ramp

I’m not sure if the issue is with the way Intervals.icu is sending the workouts to Rouvy or the way Rouvy is importing them, but for whatever reason my structured workouts that use an FTP range all show up in Rouvy as ramp intervals. These workouts I have synced from my TrainingPeaks plan using tp2intervals. I’m not sure that matters though because the way the workouts are imported look correct to me and if I manually create a workout using FTP% ranges the same thing happens (I haven’t tried with a Zone range). This is only happening when Intervals syncs to Rouvy - the same workouts being synced to Zwift show up identical to the TrainingPeaks workouts.

Here are some screenshots from Zwift and Rouvy



This is the workout structure:

Workout Structure

Warm Up:
5 mins in Z2,
5 x (20 secs in Z3 + 40 secs in low Z2).

Main Set:
5 x (5 mins in upper Z2 + 60 sec recoveries in low Z2).

Warm Down:
5 mins in low Z2.
`- - - -


Imported with tp2intervals (GitHub - freekode/tp2intervals: Tool to sync between TrainingPeaks, TrainerRoad and Intervals.icu)


  • Warm up 5m 56-75%

5x

  • Work 20s 76-90%
  • Recover 40s 56-63%

5x

  • Moderate 5m 70-75%

  • Easy 1m 56-63%

  • Cool Down 5m 56-63%

//////////
trainingPeaksId=3092843442

I don’t know that I hate that the workout is using a ramp - it makes it a little different, but if I wanted to use a ramp I thing I would just use the “ramp” step keyword and still expect an FTP range to show up the same way it does in Zwift, and how TP workouts appear.

I have not asked Rouvy about this yet - just figured I would start here and rule one thing out at a time.

Let me know if you need more information.

Thanks!

2 Likes

I didn’t hear back here about this, or from Rouvy, but that’s OK - I came up with my own solution that I kind of like anyways.

While it would be awesome if Rouvy would just import the workouts from Intervals.icu the way it gets them from TP, the fact that it doesn’t made me start thinking about how I might be able to leverage the syntax from the Intervals.icu workouts and the way that Rouvy is interpreting it to maybe create a better workout. This is what I came up with.

I mentioned before that I’m currently using tp2intervals to copy structured workouts from the TrainingPeaks plan I bought over to Intervals.icu.

Here is an example of a workout as it is imported from TP:

Warm Up:
15 mins in Z2 (normal cadence).

Main Set:
12 mins in Z3 (big gear @ 60rpm),
3 min recovery in Z2,
12 mins in Z3 (big gear @ 60rpm).

Warm Down:
10 mins in Z2 (normal cadence).
- - - -

- - - -
Imported with tp2intervals (https://github.com/freekode/tp2intervals)
- - - -

- Warm up 15m 56-75%  

1x
- 60 RPM 12m 76-90%  57-63rpm
- Easy 3m 56-75%  

- 60 RPM 12m 76-90%  57-63rpm
- Cool Down 10m 56-75%  

Which looks like this in Intervals:

And looks like this in Rouvy:

Not what I want. Very annoying. I especially don’t want my easy & cool-down intervals ramping up. Boo.

My first change was just to fix the warm-up & cool downs to be actual ramps. Warm-up was really fine, but for my own OCD I made it an explicit ramp, and the cool down I swapped the percentages so it ramps down. Easy. Then I set the work intervals to be just one specific FTP percentage instead of a range. This then made Rouvy set things to a specific FTP for the workout instead of ramping:

Warm Up:
15 mins in Z2 (normal cadence).

Main Set:
12 mins in Z3 (big gear @ 60rpm),
3 min recovery in Z2,
12 mins in Z3 (big gear @ 60rpm).

Warm Down:
10 mins in Z2 (normal cadence).
- - - -

- - - -
Imported with tp2intervals (https://github.com/freekode/tp2intervals)
- - - -

- Warm up 15m ramp 56-75%  

1x
- 60 RPM 12m 83%  57-63rpm
- Easy 3m 64%  

- 60 RPM 12m 83%  57-63rpm
- Cool Down 10m ramp 75-56%  

Looks like this in Intervals:

And looks like this in Rouvy:

So I went with that for a while. Then I got to thinking about it and decided to go one further. I didn’t hate the idea of having the workout ramp my hard / active intervals. I just didn’t want them to ramp up the whole time and then drop off to the easy / recovery interval. So I split the work interval in half and made it a ramp up / down / pyramid interval. I like this a lot, especially when I have long endurance workouts that get a higher intensity interval thrown in the middle for some damn reason.

So final version of this particular workout looks like this:

Warm Up:
15 mins in Z2 (normal cadence).

Main Set:
12 mins in Z3 (big gear @ 60rpm),
3 min recovery in Z2,
12 mins in Z3 (big gear @ 60rpm).

Warm Down:
10 mins in Z2 (normal cadence).
- - - -

- - - -
Imported with tp2intervals (https://github.com/freekode/tp2intervals)
- - - -

- Warm up 15m ramp 56-75%  

1x
- 60 RPM 6m ramp 76-90%  57-63rpm
- 60 RPM 6m ramp 90-76%  57-63rpm
- Easy 3m 64%  

- 60 RPM 6m ramp 76-90%  57-63rpm
- 60 RPM 6m ramp 90-76%  57-63rpm
- Cool Down 10m ramp 75-56%  

This looks like so in Intervals:

And looks like this in Rouvy:

So there you go! With just a little bit of massaging, I have my structured workouts importing from TrainingPeaks, and they are a more dynamic workout than I can get from TP (at least I don’t think you can get that from TP?)

Hope that helps someone else!

1 Like

I completely agree with the points raised here, as I’m facing the exact same issue.

My current workflow is TrainingPeaks → TP2Intervals → Intervals.icu, and finally syncing to Rouvy. Like others have mentioned, workouts using ‘ranges’ (e.g., 50-70% FTP) often don’t translate well to Rouvy, and I’ve also noticed that cadences are missing in my case as well.

The main pain point is the manual overhead: I don’t want to have to manually edit every single workout after it’s been imported just to make it ‘compatible’ or readable.

I believe there could be a way to handle this conversion logic internally during the sync or export process. If Intervals.icu could optionally ‘flatten’ these ranges into steps or ramps when sending them to external platforms like Rouvy, it would solve the problem for everyone using this stack.

Could we consider this as an improvement for the platform’s export/sync logic? It would greatly improve the automation for those of us coming from TrainingPeaks.

For what it’s worth - I’ve attempted to contact Rouvy several times about this. They always respond saying “we’ll look at it” or “we’ll get back to you”, but nothing so far.. I’m not entirely convinced it’s completely on their end, but I think there are things they could do to improve it on their end. The TP workouts that import to Rouvy simply use the median FTP value. If Intervals can just send that to Rouvy that would be great, but I suspect there’s probably more to it. I assume the workflow is that Rouvy reaches out to Intervals to retrieve the workouts and NOT that Intervals is sending them to Rouvy. This would mean that Intervals would need to know the request source and conditionally handle the request based on the request source. We don’t know if Rouvy is supplying any identifying data in their request, so that might not be possible.

Obviously it would PREFERABLE if Rouvy could handle a range, but I suspect their ERG system doesn’t know how to handle that properly.

1 Like

Thanks for the insights!

Regarding the workflow, even if Rouvy is the one ‘pulling’ the data from Intervals.icu, we know that when Rouvy pulls from TrainingPeaks, the workouts work perfectly because TP likely provides the median value of the range in its API response (or a ‘flattened’ version of the step).

If Intervals.icu could provide a similar toggle or an optional field in the API response that returns the average/median value of a range, it would likely fix the ERG issues in Rouvy immediately.

Even if we don’t know if Rouvy identifies itself in the request, perhaps Intervals could have a global setting like ‘Flatten workout ranges for API exports’ or ‘Export median values for steps’. This would ensure that any 3rd party app that doesn’t support ranges (like Rouvy) receives a compatible step (e.g., 60% instead of 50-70%).

It seems like a more practical workaround than waiting for Rouvy to update their ERG engine to support ranges, which they haven’t done for years.

1 Like