Over the Christmas break, while I was off the bike, I wasn’t completely away from cycling. I spent quite a lot of time watching YouTube videos on both outdoor and indoor riding. One of the recommended videos was about racing on MyWhoosh. As I watched the video, I got curious about the creator’s other content, so I explored their channel.
One particular video caught my attention. It was about using TrainingPeaks Virtual to train more effectively. The idea behind it was quite clever. The creator wanted to perform a specific type of interval workout but realised he typically produced higher wattage during races compared to structured workouts. To take advantage of this, he set up a race on a specific route that included a climb he was familiar with, one he could complete in about 20 minutes. He then did a couple of laps on this route, ensuring he would hit the interval target twice. He raced against bots to push himself harder during the workout.
While this wasn’t the reason I tried it, I found the concept intriguing and wanted to test it out for myself.
How To Set Up Your Own Bot Race On Training Peaks Virtual
One thing I hadn’t paid enough attention to, or perhaps just didn’t remember from the video, was exactly how the creator had set up the race with bots. I assumed it was a built-in feature, maybe something like a menu option for bot racing. However, after clicking around on the various tabs available in MyWhoosh, I couldn’t find anything like that.
It turns out, the process is a bit unconventional—almost like a workaround. If you go to the options menu and then navigate to “Organise Events,” you can create your own event. This feature allows you to set up a multiplayer event and customise it exactly how you want.
There are a couple of catches, though. The first is that you need to schedule the event at least five minutes in advance. This isn’t really a drawback, as it gives you a bit of time to warm up. The second, and potentially more surprising, detail is that other people may join your event if you don’t adjust the settings. There’s an option to make the event private or to include bots specifically, which is what I wanted.
For my setup, I aimed to race against a pack of bots. By default, the field size is limited to 30 riders, so I configured it to have me racing against 29 bots.
I think they should make this feature a little more prominent, as it definitely feels like a bit of a hack right now.
I deliberately named my event CyclingIndoors.co.uk Bot Race and added a small description. Once I had everything set up, the event went live, scheduled to start in the minimum five-minute timeframe. I tried to join the event immediately after creating it, but the system informed me it was still setting up. On my second attempt, I was able to get in successfully.
Before entering, I received a warning message stating this was a live event and would be monitored, which was fine. Once inside, I noticed I wasn’t placed in any starting pens—at least, I don’t think I was. I was simply at a starting line. One thing I observed, which differs from both MyWhoosh and Zwift, was that there was no indication of activity at the start line. Even though I was pedalling, it showed me as stationary, and there was no way to tell if others were warming up or active.
Interestingly, a few people—or what I assumed were people—started joining the event while I was waiting. Four riders joined in total. Two of them had what seemed like realistic-sounding names, though they didn’t reply to any messages, so I wasn’t sure if they were bots or real users. The fourth person, however, definitely appeared to be a real human, but they didn’t respond either.
When the timer reached one minute remaining, a message popped up saying the pen was now closed for new entries and that riders would be split into groups based on their abilities. I was placed in Group 3 of 4. I don’t think any of the other potential humans were in my group. Once the message disappeared, I was dropped into the ride, and to my delight, the 30 bots I had configured were there.
I thought this part of the process was really well executed. However, the communication around when and where things would happen could have been clearer. For instance, if you set your event to private, no one else can join, which is useful depending on your preference. Personally, I wasn’t bothered if others joined my event, but it’s nice to know the platform caters to both options.
Race Pace From The Off
Once the race got underway, I was both surprised and not surprised to see that it started at a blistering pace. In fact, the entire race closely resembled what you’d experience racing on platforms like Zwift or, potentially, MyWhoosh (though I’ve never raced on MyWhoosh myself). If you didn’t know they were bots, you’d likely assume you were racing against a field of real human riders.
The race began with the same explosive start that seems to define online racing. Fortunately, I was ready and prepared for it. However, about two kilometres in, I found myself thinking, “Holy moly, I hope they back off soon because this is killing me.” Thankfully, they did. Just like in real-life races I’ve done, the intensity settled down into a more manageable tempo pace after the initial burst.
I managed to stay with the front bunch, which is similar to where I usually find myself in Zwift races. That said, I was fully aware that sitting with the group meant riding at or even over my threshold. I knew that if someone broke away or a climb appeared, it would spell trouble for me. I was already giving everything I had, and today was no exception—though the reasons for that were even more pronounced, as I’ll explain shortly.
Even though I chose the route myself, I couldn’t honestly tell you what it was called. I deliberately picked it because it was 16 km and flat, but the in-ride route profile showed a small climb around the 8 km mark. I was pacing myself for that climb, but it turned out to be only a 1% gradient.
In-game, I’ve set the climb simulation to 50% realism, so the gradient felt even less taxing than it would have otherwise. Still, I was glad the climb was there, as it helped me focus on pacing myself properly. My goal was to sit in the bunch and avoid going too hard early on.
In the first 8 km, there were two breakaway attempts. The first rider managed to get about 14 seconds up the road, and then a second rider followed, gaining about 5 seconds. It seemed like the bots were designed to challenge you to either chase them down or push yourself harder. However, I had absolutely nothing to give. Chasing wasn’t even an option for me—I knew it wasn’t happening.
Instead, I decided to play it smart and stick with the bunch. This strategy has generally worked well for me in races, helping me stay with the group and make it to the end without blowing up. Today was no different. There was never a moment where I thought, “Yeah, I’ve got the legs to go for it.” Not even close.
Racing HUD Pros and Cons
Because of the way the HUD is designed, there’s a lot of useful data, but I found some elements a bit difficult to read. One feature I really liked, and hadn’t seen before, was the on-road groupings. It’s similar to what you see when watching a live bike race—it shows who’s at the front, where the peloton is, the positions of other groups, and the gaps between them. I found this incredibly useful and a really cool addition. However, the font size made it somewhat difficult to see from where I was on the bike. While it was manageable most of the time, it could definitely be improved.
On the other hand, the mini-map in the top-right corner was less effective. While it’s great in theory—showing the route ahead, upcoming corners, and possibly sprint banners or other key markers—it was so hard to read that I couldn’t confidently say what it was actually displaying. I assume it also shows the positions of other riders, but I genuinely couldn’t tell.
My eyesight isn’t the best, especially without glasses, which I don’t wear while cycling indoors. This made it even harder to make out the details. I think improving the contrast of the colours on the mini-map and increasing the clarity would go a long way. After all, not everyone has the vision of an 18-year-old with cat-like reflexes!
Start Hard And Hang On
Being completely honest, after we got over the little hill at the 8 km mark, the remaining 8 km became a real challenge. I found myself counting down the distance and, at one point, even timed how long it was taking me to cover a kilometre so I could roughly estimate how much longer I had to endure. I guessed we’d finish in about 26 minutes, which at least gave me a target to aim for.
But, as I mentioned earlier, at no point did I feel like I had the legs to make a break. This race was purely about hanging on. That’s a reflection of where my fitness is right now—it’s pretty much back to where it was during my rebuilding phase after the crash. That’s entirely on me for not riding enough recently, so I can’t complain. Races like this serve as a true test of my ability, and I think it’s an accurate measure.
This was made even more apparent by the fact that I was using my Assioma Duo pedals as the power source, which supposedly provide more accurate numbers compared to using the NEO for everything, as I typically do on MyWhoosh. The power numbers I saw at the end of the ride weren’t great, but I know I gave absolutely everything I had. There was nothing left in the tank, and I’m satisfied with that.
Finish Line Experience
Surprisingly, I finished in 12th place. That’s better than I’d normally expect in a field of 30 riders. I’d usually place in the bottom half, easily. What made me even more pleased with the result was that I had enough left in the final 200 metres to get out of the saddle and give it a hard sprint—at least as much of a sprint as I could muster. It definitely put me into the red, but it’s not like the effort was anything remarkable. Still, for where I am right now, I’m happy with how it ended.
Overall, I would say this race really did mimic the kind of typical races I’ve experienced on Zwift and similar platforms. It felt very close to a real race. As I mentioned earlier, if you didn’t know you were racing against bots, you probably wouldn’t have guessed it. The experience was competitive, engaging, and well-executed.
I thought it was really well done and, honestly, it brought back a big aspect of racing that I’ve been missing since stepping away from Zwift. What makes this format particularly appealing is that it offers more control over the setup, which gives me a better chance of competing at my current fitness level. The bots can be adjusted to match my abilities more closely, which is something I’ll need a few more races to properly evaluate. For now, finishing 12th feels like a solid result considering where my fitness is at, and I’m happy with that.
This race pushed me to work much harder over those 25–26 minutes than I would have in almost any other type of ride, whether a free ride or structured workout. It was also a bit of a wake-up call about where my fitness currently stands, which isn’t a bad thing. It’s clear that there’s plenty of room for improvement, and the solution is simple: I just need to ride more.
All in all, this was a great experience and a promising format for getting back into competitive cycling in a way that’s both challenging and achievable.
At the end of the ride, you get on-screen results showing your placement, along with a race ranking. I’m not entirely sure how the ranking is calculated, but I did notice I went up in a couple of areas, like endurance and time trial. However, I’m not reading much into it—I don’t think I performed particularly well.
You also get a leaderboard and a summary of key metrics, like your average power and cadence. On the analysis page, similar to other platforms, you can dive into the ride data. One thing I noticed was that my cadence was dropping out quite a lot. While I don’t think it impacted the ride too much, I’ve been experiencing frequent connectivity drops. This isn’t specific to TrainingPeaks Virtual—I think it might be because I’ve connected via Bluetooth. I’ll need to try using ANT+ to see if it provides a more stable connection.
The critical power curve is also included, which is pretty useful for analysing your performance. For me, the numbers weren’t anything special, but it’s always helpful to have that data for future comparison. As the event organiser, I also had access to a few additional options, but you have to go back into the settings menu to see them.
Overall, I thought this was really cool and thoroughly enjoyed the experience. It genuinely pushed me harder than I’ve been pushed in a while. Normally, I try to ride for at least 45 minutes, and ideally an hour, but after this race, I couldn’t bring myself to go any further. That just highlights how far my fitness has slipped—something I’ll need to work on.
Still, this ride pushed me out of my comfort zone, and I’m glad I gave it a go. TrainingPeaks Virtual has proven to be a worthwhile platform, and I’m happy I decided to try it.