Virtual Shifting with BikeControl — and Without

By Jonas Bark · 2026-07-31

There are two ways to get virtual shifting on your smart trainer, and the honest answer to "which one should I use?" is: it depends on what you're missing.

BikeControl can add virtual shifting to just about any modern smart trainer — FTMS, FE-C over BLE, or Zwift Ready — in any app. That's genuinely useful — but it's not the only path, and pretending otherwise wouldn't help you set up your pain cave. Plenty of trainer apps ship virtual shifting themselves, and if yours does, and you're happy with it, you should probably just use it.

This post lays out both, including the parts that aren't flattering.

First: what virtual shifting actually is

There's no derailleur involved. Your bike sits in one physical gear (often on a single cog), and "shifting" means something changes the resistance your trainer applies to simulate a different gear ratio.

The only real question is who does that changing. Your trainer app, or BikeControl.


Path A: your trainer app already does it

This is the path a lot of riders are already on, sometimes without thinking about it as a feature.

Zwift popularized it with the Zwift Cog and Click — Zwift owns the gear model, and sends the resistance for the current gear to your trainer. MyWhoosh ships virtual shifting too. Others have been adding it. If you ride a supported trainer in one of these apps, virtual shifting is already there, no extra software in the chain.

What's good about it:

  • Nothing extra to install, pair, or keep running
  • One less link in the chain that can drop out mid-ride
  • Likely no extra cost — you're already paying for the app

What people run into:

  • The gears aren't yours. You get the count and the ratio curve the app decided on. If you want 12 gears instead of 24, or a tighter spread at the top end, that's not a setting — it's just how the app works.
  • Shift lag. This is the complaint that comes up most in support and on the forums: you click, and the resistance follows a beat later. How bad it feels varies a lot by trainer and app, and for some riders it's a non-issue — but for others it's the reason they went looking for an alternative in the first place.
  • It's per-app. Your gears feel one way in Zwift and another way somewhere else, because two different teams made two different sets of choices.
  • Your trainer might not be on the list. Native virtual shifting is generally limited to trainers the app has explicitly enabled.

None of that is a scandal. It's just what happens when the feature lives inside a closed app.


Path B: BikeControl does it

Since 5.4, BikeControl can sit between your trainer and your trainer app. Your trainer pairs to BikeControl; BikeControl re-advertises itself as a trainer over Bluetooth or WiFi; your app connects to that. Gear logic runs in the middle.

That placement is what buys you the things Path A can't offer:

  • Any gear count from 1 to 30, with every ratio individually draggable and a live curve preview
  • Named shifting configs — "Climb day", "Sprint workout" — swapped in one tap and remembered per trainer
  • A virtual front derailleur — a real 2× drivetrain with resistance jumping by the exact chainring ratio, and gears reading in 2×N head-unit notation
  • Virtual shifting in apps that don't have it at all, on FTMS, FE-C, and Zwift Ready trainers alike
  • The same feel everywhere. Your gears follow you from Zwift to MyWhoosh to Rouvy to TrainingPeaks, because they're your gears, not the app's.
  • Your controller talks to the trainer directly — the shift is handled by BikeControl, which is already holding the trainer connection, rather than making a round trip out through the app

And the honest costs:

  • The resistance feel isn't identical on every trainer. This is the real trade-off, and it's worth being specific about: BikeControl decides what to ask your trainer for, and trainers don't all interpret those numbers the same way. Most riders never notice. Some do — a gear that sits heavier or lighter than expected, or resistance that settles differently than they're used to.
  • It's in beta. More on why below — and it's the same root cause.
  • Beyond 20 minutes a day it needs Pro. The daily free budget exists so you can find out how it behaves on your trainer before choosing either method.

The setting that says "not my job"

Because Path A is a perfectly good answer, BikeControl doesn't assume it should be in the middle. The connection picker on every trainer has a third option:

The BikeControl connection mode picker with Virtual Shifting, Proxy, and No connection — the latter reading "Let MyWhoosh handle virtual shifting, if supported"

No connectionLet MyWhoosh handle virtual shifting, if supported. (It names whichever app you've selected.) BikeControl stays out of the trainer's signal path entirely and your app pairs to the trainer directly, exactly as it would if BikeControl weren't installed.

This is not a degraded mode or a fallback. If your app's virtual shifting works well for you, this is the right setting, and BikeControl keeps doing the thing it was doing before 5.4 — reading your controller and getting those button presses to your app.

The middle option, Proxy, mirrors your trainer over WiFi without touching gear logic — handy for getting a Bluetooth-only trainer to an Apple TV, or for narrowing down a problem.


Why this is still in beta

Short version: there is no such thing as "a smart trainer".

There's a stack of overlapping standards, and every trainer implements a different slice of it:

  • FTMS (Fitness Machine Service) over Bluetooth — the closest thing to a common language
  • FE-C over Bluetooth — the ANT+ protocol, carried over BLE
  • Zwift Ready trainers, with their own expectations
  • Plus vendor-specific extensions, and network transports on top of all of it

Even inside FTMS, "supported" doesn't mean "identical". FTMS has optional feature flags, and trainers advertise different combinations of them. So BikeControl reads what each trainer says it can do and picks how to drive it:

ModeHow resistance is set
Target PowerBikeControl computes the watts your current gear should demand at your cadence and asks the trainer for that
Track ResistanceThe gradient is scaled by your gear ratio and handed over as a simulated grade
BasicA plain resistance level, for trainers that support little else

Then multiply that by firmware. Two riders with the same trainer model can be on firmware versions that behave differently, and both are "supported" as far as the spec is concerned.

So the beta label isn't hedging. It's an accurate description of a feature that has to be right across dozens of hardware and firmware combinations, most of which I don't own. The feedback so far has been genuinely great — riders are running it daily across a wide spread of trainers — but "works great for the people who've told me about it" is not the same as "verified everywhere", and I'd rather say so.


The compatibility database

Guessing doesn't scale, so BikeControl doesn't guess.

When you use virtual shifting, the app can send a Works / Not working report from the trainer page. It carries an anonymized snapshot of what actually matters for compatibility:

  • Manufacturer, Bluetooth name, and firmware version
  • Whether the trainer natively supports virtual shifting
  • Which control mode was in use (SIM / ERG) and which virtual shifting mode BikeControl picked
  • The exact FTMS machine features and target-setting flags the trainer advertised
  • Grade smoothing, cadence filter, gear ratios
  • App version and platform

Those reports land in an internal Smart Trainer Database, aggregated per trainer — so a model isn't one anecdote, it's a working/not-working tally across every rider who's reported on it, sliceable by firmware version, virtual shifting mode, app version, and platform. When a trainer's picture is clear enough, it gets marked confirmed working.

That's not a private scoreboard. It's what feeds the public list: 16 confirmed trainers and 18 more that riders have reported success with, all browsable on the Virtual Shifting hub. When your report changes the picture for a trainer, the public page changes with it.

The BikeControl Virtual Shifting hub compatibility section — supported protocols, confirmed working trainers, and likely supported brands

It also means a "my trainer does something weird" message isn't a dead end. The pattern is usually already in the data — same model, same firmware, three other riders — or your report is the one that establishes it.


So which should you use?

Stay with your app's virtual shifting if it works, the shifting feels responsive to you, and you're not bothered by the fixed gear count. Set BikeControl's connection mode to No connection and let it get on with reading your controller.

Use BikeControl's virtual shifting if you want gears you actually chose, a 2× drivetrain, the same feel across every app you ride in — or if your app or trainer simply doesn't offer virtual shifting at all.

You don't have to decide once. Switching modes is live and remembered per trainer, so trying the other path costs you one tap and no re-pairing.

If you try it and something's off, the in-app support chat is the fastest way to reach me — and your report ends up in the database that makes the next rider's setup easier.

Happy riding! 🚴