← Back to Tools

🏁 Race Replay

Visualize multi-rider race data with interactive playback

Checking...

Load Race Data

Frequently Asked Questions

What does this tool do?

This tool replays a Zwift race second-by-second. Enter any participant's activity ID and it fetches the entire field's telemetry — position, power, heart rate, speed, and distance — then lets you play back the race with an interactive elevation chart, an overhead map, a live rider table, and automatic peloton detection. You can watch groups form, attacks develop, and sprints unfold from a bird's-eye perspective.

Where does the data come from?

All data comes directly from the Zwift API. When you provide an activity ID, the tool fetches the activity details to find the event, pulls the race results for every participant, and downloads each rider's second-by-second telemetry. Riders who have set their activities to private won't have data available and will be missing from the replay.

Route geometry (the line drawn on the map and the elevation profile) comes from ZwiftMap's route database rather than rider GPS data, so it's always accurate regardless of individual telemetry quality.

Because it uses the Zwift API, you need to be logged in with your Zwift account. The tool only reads data — it doesn't modify anything on your account.

How do I get an activity ID?

Your activity ID is in the URL when you view a ride on zwift.com. Go to your activity feed, click on a ride, and the long number in the URL is your activity ID (e.g. zwift.com/activity/1234567890). You can use any participant's activity ID — the tool will find the full race from it.

What does the rider table show?

The table shows live stats at the current playback time: race position, gap to the leader, current power, rolling 1-minute average power, Normalized Power, weight, heart rate, speed, and distance covered. Click a row to follow that rider on the chart and map. Use the checkboxes to highlight specific riders on the elevation chart. Click any column header to sort. Use the W / W/kg toggle to switch power columns between watts and watts per kilogram.

What does the Race Efficiency table mean?

The Race Efficiency table summarises, for the whole race, how much aerodynamic benefit each rider got from sitting in the draft. Because we don't have data on which bike each rider was using, every rider is modelled on the same bike — a fully-upgraded Specialized Tarmac SL9 with Princeton Wake wheels — and their frontal area is estimated from their height and weight.

Using each rider's recorded power and speed, the physics model works out how much power they would have needed to ride solo (fully exposed to the wind) versus what they actually produced. The difference is the effective draft — the watts saved by drafting. The Average Drag Reduction column expresses that saving as a percentage of the rider's total aerodynamic drag over the race: 0% means they rode fully in the wind the whole time, while a higher number means they spent more of the race sheltered behind others.

In Zwift the maximum possible draft reduces aerodynamic drag by about 50%, but that peak only applies deep inside a large group — sitting behind a single rider provides noticeably less shelter. A rider tucked in a big bunch for an entire race would therefore approach — but never exceed — a 50% average drag reduction. Values close to 50% indicate a rider who drafted almost perfectly; low or slightly negative values indicate a rider who spent time on the front, in the wind (the model shows these as raw, un-clamped numbers).

What does the Rider Analysis show?

Pick any rider and the analysis finds where they lost contact with their group, what it would have taken to stay on, and why they didn't. Each event card leads with a one-line verdict, then What happened (a timeline), What would have kept you on (ranked options), and Next time (advice). The numbers behind it are under Details. Below the cards, Good moves lists attacks that stuck and bridges that worked, and Where you spent extra lists efforts where the rider spent more than the riders around them. The chart shows 30-second power against what the riders around them spent (converted to the selected rider), wind protection, and reserve (W′).

It's all physics and statistics from the race data — no guessing about intent. Every rider is modelled on the same bike (see the Race Efficiency question), so treat absolute watts as estimates and comparisons between riders as the more reliable part.

What counts as a drop or a near miss?

Every second, riders are split into groups: sorted by distance, a new group starts wherever someone is more than 1.5 s behind the rider in front (measured in time, not metres, so it works at any speed). Then, for the selected rider:

  • Lost contact — their group (at least 3 riders) splits and a real group ends up ahead of them: more than 3 riders and at least 30% of the group. If just a few riders ride away, that's a breakaway, and the riders left behind aren't flagged.
  • Drop — still off that group 2 minutes later.
  • Near miss — back on within 2 minutes (on your own, or because your whole group got back on). Gaps that close within 5 s are ignored as measurement flicker.
  • Finish sprint — anything in the last 1 km is the sprint, not getting dropped.

The "key moment" is the first drop. Near misses get their own short card: how long you were off, what getting back on cost, and whether you'd slid back or were riding with no margin.

What are CP and the reserve (W′), and where do the numbers come from?

CP (critical power) is the power you can hold for a long time, roughly your threshold. Reserve (W′) is the energy you can spend above CP before you're cooked. Going over CP drains it; riding under CP refills it, faster the further under you are. The app tracks it second by second (the Skiba W′ balance model).

Reserve is measured in kJ (kilojoules, a unit of energy). A rough feel: 1 kJ ≈ 100 W above your CP for 10 seconds. Most racers have a reserve somewhere around 10–25 kJ, so a 5 kJ effort is a big chunk of it.

If you leave CP and reserve on auto, they're estimated from that rider's best 3, 5 and 12-minute efforts in the race (the same work-vs-duration fit as the Critical Power page). The reserve is kept between 10 and 30 kJ, and CP is raised until the race never takes the reserve below zero. That makes it a picture of your form on the day — the right thing for judging that race. A race isn't a maximal test, so it can read lower than your best.

You can type in your own values, or click Use my CP to pull them from the Critical Power page. As a rough guide, CP moves a few percent from day to day, and reserve moves much more (often 10–20%). Use the race estimate to judge a race, and your usual FTP/CP to set workouts.

How is "needed" worked out, and what does "for you" mean?

"For you" means another rider's power converted to your body. Climbing, rolling and speeding up scale with weight; wind resistance scales with how big a hole you punch in the air (estimated from height and weight). Because their actual wind cost is used, the draft they were getting carries over. So "6.0 W/kg for you" means "what that rider did would have cost you 6.0 W/kg".

Riders who stayed on are the ones who were in your group when the gap opened and were still with the group that rode away. "Needed" is what the best-placed of them did, converted to you (the 25th percentile — the riders who got through cheapest). "Typical" is the middle one.

The surge is the stretch where the group was riding above your CP. It's anchored on the group's hardest 30 seconds in the 90 s before you lost contact, because the damage is often done before the gap actually opens. If the group never went over your CP, the card says so: that points to position or reaction, not fitness. Riding within 2% of "needed" is called "right at the limit, no margin".

How do the "What would have kept you on" options work?
  • Close the gap right away — a physics simulation of you chasing the real back of the group. Draft is full out to about 10 m behind the wheel and gone by about 25 m (measured from race data). It finds the lowest steady power that gets you back within 3 m within 15 or 30 s, if you'd reacted at successive moments (every 6 s) as the gap grew. It's checked first by replaying your actual power; if the simulated gap is off by more than 10 m (usually because the group was strung out), the estimate is hidden.
  • Hang on longer — after a drop, how long until the group's pace (30-second average, converted to you) fell back under your CP — checked for up to 5 minutes — and what riding with them until then would have cost. Surges often end soon after riders get dropped; if this one eased within 60 s and you could afford it, the verdict says so.
  • Stay glued to the last wheel — the power to stay within 10 m of the wheel from when the gap started opening.
  • Hold your spot — if you slid back at least 5 places (measured from your best position in the 3 minutes before), what the riders who stayed on from within 3 places of you actually rode from there, converted to you.
  • Move up before the surge — moving up through the bunch (riders moving up keep about 90% of the group's draft in Zwift), then riding it like the riders who stayed on from that spot. Only shown if it gains at least 10 m of road, if you didn't actually make that move, and if the model passes the same replay check.

Getting back on only helps if you can stay on, so every option is costed through to when the group eased (see "Hang on longer"). Once you're back on the wheel, you ride at the group's pace converted to you.

✓ fits in the reserve you had, ≈ is within 10% of your reserve (a coin flip), and ✗ is more than you had.

Was sliding back a mistake? It's judged by what holding your spot would have cost. If it would have emptied your reserve, letting riders past was the right call, and the advice is to be further forward before the hard part, so you have places to give back. If holding was affordable, the slide counts against you.

What counts as "spending extra"?

Everything is compared with the riders around you: the 5 group-mates nearest you on the road, converted to you. (The whole group's average would be skewed by whoever is pulling on the front.) An effort is listed when:

  • you're above CP (5-second average) and it drains at least 1.5 kJ of reserve, or you spend at least 3 kJ more than the riders around you while out of the draft, and
  • the riders around you spent less than 90% of what you did. If they spent about the same, the whole group surged, and that's just the race.

Each one is labelled from context:

  • Chased a move — a group of 1–3 riders who left your group in the last 5 minutes was up the road, and you were at 1st or 2nd wheel at least 30% of the time. It also says whether they were caught (watched for 3 minutes).
  • Attack — leading at more than 120% of CP, with the gap you opened (a gap of at least 0.5 s counts as getting away). Side-to-side movement isn't in the data, so an attack that never opened a gap looks the same as a very hard pull.
  • Rode on the front — at 1st or 2nd wheel at least half the time, with nobody up the road.
  • Surged in the group — a hard effort (over 120% of CP) from inside the group, often a sign of closing a gap or moving up late.
  • Out of the draft — anything else, e.g. gaps in the line mid-group.
  • Spent extra for N min — a long, slow leak: your 5-minute average stayed at least 15 W above the riders around you for at least 5 minutes. This is usually riding near the front or with poor draft. It's often below CP, so it barely touches your reserve, but it's real energy.

To judge each effort, the app replays your reserve as if you'd ridden like the riders around you instead, and checks your next close call or drop. ✗ means you'd have had at least 1 kJ more there. ≈ means it cost you, but your reserve refilled before it mattered. ✓ means a chase that worked, with you doing less than half the work. The reserve model refills fully between efforts, so it can't capture fatigue building up over a race. Repeated "≈" efforts still add up.

What counts as a "good move"?
  • Got away — you left your group going forward, got at least 10 s clear within 3 minutes, and they never got back to you. It shows what it cost (power, time, reserve), the terrain, and how big the gap grew by the end. In the last 1 km it's called Sprinted clear.
  • Bridged up — you closed a gap of at least 5 s to the rider or group ahead, either alone (solo) or leading your group at least half the time. If your group caught them while you sat in, it doesn't count as your move.

Moves are marked green on the power chart. Use ▶ Watch to see how it played out.

What do wind protection, losing the draft and sitting up mean?

Wind protection (draft %) is the share of the wind cost you were spared compared with riding alone, worked out from your power, speed and the physics model. It's about 30–40% inside a bunch, and close to zero once you're more than about 25 m off the wheel at speed.

Out of the draft is flagged when you're still in the group but your wind protection is at least 15 points below the group's for at least 10 s: hanging off the back, sitting on the front, or out of line mid-group. Sat up means riding below 50% of what the group was riding for at least 6 s, right around the moment the gap opened.

How accurate is the Rider Analysis?

It's good for where and why. Treat the exact watts as estimates. Known limits:

  • Every rider is modelled on the same bike. Real bikes, wheels and power-ups (aero, draft boost) aren't visible in the data.
  • Rider weights and heights come from Zwift profiles, and some aren't accurate.
  • Positions come from 1-second distance data. Draft changes over a few metres, so gaps under a few metres are near the limit of what the data can resolve.
  • Reserve (W′) models disagree about how fast it refills, and they don't model fatigue building up over a long race.
  • It's one race. Patterns that show up across several races are the ones to act on.
What are the two chart modes?

The chart has two modes, toggled with the Riders and Peloton buttons:

  • Riders mode plots each individual rider as a dot on the elevation profile. Checked riders are highlighted, making it easy to track specific people through the field.
  • Peloton mode automatically detects groups of riders that are close together and draws each group as a colored bar on the elevation profile. The peloton details panel below shows each group's size, average power, and average speed. If you have a rider selected, an orange dot shows their position within the peloton.
What does the map show?

The map panel shows an overhead view of the Zwift world with the race route drawn as a line and rider positions as dots. Each world uses its official in-game map image. You can zoom in and out with the +/− buttons or scroll wheel, and drag to pan. When following a rider, the map automatically pans to keep them in view.

What are the playback controls?

Use the play/pause button (or press Spacebar) to start and stop playback. The speed selector lets you run the replay at 1×, 2×, 5×, 10×, or 20× real time. Drag the time slider to jump to any point in the race.

What is the zoom and follow feature?

The zoom slider below the map controls how much of the course the elevation chart shows at once — zoom in to see small gaps more clearly. The "Follow" dropdown selects a rider to track: the chart and map will automatically pan to keep that rider centered as the race progresses.

What do the YouTube stream links do?

If any rider in the race is a known Zwift streamer, the tool checks whether they were live-streaming during the race and shows a link to the YouTube VOD. Clicking the link opens the video at the timestamp matching the current playback position, so you can watch the race from a rider's perspective alongside the data replay. If the streamer trimmed their VOD after the broadcast, the tool automatically detects the trim and adjusts the timestamp accordingly.

How can I share a race replay with someone?

After loading a race, the URL updates to include an ?activity_id= parameter. Copy that URL and share it — anyone who opens it (and is logged in) will automatically load the same race.

Why does fetching take a while?

The tool downloads full telemetry for every rider in the race individually from the Zwift API. A race with 30 riders means 30 separate API calls. The data is cached on the server, so loading the same race a second time is much faster.