Testing My Bike Split Calculator Against Real Data

By Tom Norton

April 29th, 2026

header photo

A few weeks ago, to plan for some races I have this year, I built a free bike split calculator that estimates finish time from a GPX route, power targets, and a handful of physics parameters. It's based on a physical model including drag, weight, rolling resistance, elevation, grade etc. It produces real-looking results, but I've been wondering:

Do its predictions match real rides?

So I pulled four of my own rides, fed each one into the calculator at my actual average power for the day, and compared the predicted finish time to the time I actually rode. To keep things honest I refactored the calculator into a pure function and called the same code from a Node script that parses FIT and GPX files, so the validation runs the same simulation the web page runs.

The setup

I picked four rides that varied in length and climbing density:

  1. A short hilly loop, 32 km
  2. Another short hilly loop, 35 km
  3. A medium-length climb-heavy ride, 56 km with one long climb
  4. A long mountainous ride, 101 km with a 30 km descent

Across all rides I held the parameters constant:

For each ride I asked: at my actual average moving power, what finish time does the calculator predict? Then I compared to actual moving time from Strava (which strips out auto-pause for traffic lights and food stops).

The four rides

RideDistanceClimbingClimbing densityAvg powerMoving timePredictedΔ
Getting the Suffering In35 km+695 m20 m/km184W1:32:411:31:14−1.6%
Internal Center Lock Disc Brakes32 km+667 m21 m/km220W1:17:431:15:03−3.4%
Monty P and More with the Girlies56 km+1,261 m23 m/km169W2:49:312:36:47−7.5%
Here, There and Everywhere101 km+1,472 m15 m/km175W4:13:183:55:33−7.0%

The calculator is consistently optimistic on these rides. Never once did it predict a slower time than I actually rode. The error sits between 1.6% and 7.5%, and it grows with duration.

What's driving the bias

The model is constant power plus physics. It doesn't see:

The first three pulls predictions to be optimistic. The last pushes them to be slightly pessimistic. Add it up and you get the 2-8% optimistic gap I see on real rides.

The shape of the error

Two patterns from four rides. Small sample, but they line up:

A reasonable heads-up to put on a prediction: expect 2% baseline error, plus ~1-1.5% per hour, plus more if the route is descent-heavy. The number you see on screen is the floor for what's possible if everything goes right. Real rides land slower.

What I did about it

1. Results are now a three-point prediction range. The headline now shows a likely time with optimistic and worst-case below it, instead of a single confident-looking number. The likely figure is the physics prediction plus a real-world overhead that grows with duration: roughly 2% baseline plus ~1.2% per predicted hour. The worst-case adds a larger pad for technical descents and bad days. The race plan, fueling calculator, and target-time check all run off the likely time so the planning numbers stay self-consistent. Section-by-section times in the breakdown table stay as the physics estimate, since pacing power output is what those rows are for.

2. Cornering is still the unfinished business. Modelling corner radius from GPX point geometry and capping local speed at sqrt(μ·g·r) is the biggest remaining lever for descent realism. It's also the hardest piece, so I'm sequencing it after the easier wins. Once it's in, the gap between optimistic and likely should narrow on technical courses.

Try it yourself

If you want to validate the calculator against one of your own rides, it's here. Pull up a GPX from a ride where you had power data, enter your actual average power as the climb / flat / descent power, and see how the predicted time compares to what you actually did. If your error is meaningfully outside the 2-8% range I'm seeing, I'd like to hear about it.

Tom Norton

Hi, I'm Tom Norton. I'm an engineerng leader based in Switzerland, passionate about great products. When I'm not doing that, I'm making music.

Feel free to say hi via the contact page.