The Moveee team
Free coaching · a real route for every ride
You built (or were given) a structured workout in one app, and you want to ride it somewhere else — on your Garmin out on the road, or in Zwift on a rainy Tuesday. That trip happens through two file formats, .zwo and .fit, and the whole topic is less mysterious than the file extensions make it look. Here's what each format actually is, what opens where, and the exact steps to get a workout onto the two most common destinations.
- .zwo is Zwift's XML workout file; .fit is Garmin's binary format, spoken by nearly every head unit.
- The classic confusion: a .fit file can be a workout (a plan) or an activity (a recording). Same extension, different things.
- Targets travel as % of FTP, so a workout stays correctly hard everywhere — as long as your FTP is set the same in each app.
The two formats, demystified
A plain-text XML file describing a structured workout: warm-up, intervals, recoveries, each with a duration and a target as a percentage of FTP.
A compact binary format from Garmin, used across the whole industry. Not human-readable, but far more widely supported by hardware — head units speak .fit natively.
The .fit confusion, cleared up once
Most head-scratching in this area comes from one fact: .fit is used for both workouts and activities. A workout .fit says "do 3 × 12 minutes at 90% FTP" — it's instructions, made before the ride. An activity .fit says "here's every second of power, heart rate and GPS from the ride you did" — it's a recording, made after. They share an extension because .fit is really a container format with many message types inside. So when an import fails with something like "not a valid workout," you've almost certainly fed a recording into a workout importer (or vice versa). Nothing is broken; you just have the other kind of .fit.
What opens where
| Destination | .zwo workouts | .fit workouts |
|---|---|---|
| Zwift | Native — its own format | Activities only (not workout import) |
| Garmin head units | No | Yes — workouts via Connect or USB |
| Wahoo (ELEMNT / SYSTM) | No (ELEMNT); SYSTM has its own library | Yes — planned workouts sync to ELEMNT |
| MyWhoosh | Yes — imports .zwo workouts | Activities export |
| Hammerhead Karoo | No | Yes — workout .fit files |
Support shifts with software updates — treat this as the current lay of the land, and check your device's import options if a row surprises you.
Getting a workout onto a Garmin
Via Garmin Connect (the tidy way)
Open connect.garmin.com → Training & Planning → Workouts → import the .fit workout file. It appears in your workout library.
Send to device
In Connect, choose "Send to device" — the workout syncs to your Edge or watch next time it connects (Wi-Fi, phone, or cable).
Or go direct over USB
Plug the Edge in and drop the file into the Garmin/NewFiles folder. On next boot the unit ingests it into Training → Workouts.
Ride it
Start the workout on the unit; it steps through your intervals with target alerts. Pair a trainer and newer Edges can even drive ERG.
Getting a workout into Zwift
Find the custom workouts folder
On the computer where Zwift runs: Documents/Zwift/Workouts/<your numeric rider ID>. That per-rider folder is the magic location.
Drop the .zwo in
Copy the file into that folder. No renaming needed — the workout's name lives inside the XML, not in the filename.
Restart Zwift and look under Custom Workouts
Open the workout picker; your file appears in the Custom Workouts category. Zwift reads the folder at launch, so restart if it was open.
One wrinkle: on iPad or Apple TV there's no accessible Workouts folder, so custom .zwo files need to go in via a computer that shares the same Zwift account — they'll then be available on your other devices.
Why the workout stays the right hardness everywhere
Here's the elegant part of both formats: interval targets are stored as a percentage of FTP, not as raw watts. The file says "12 minutes at 90%," and each destination multiplies that by its FTP setting for you at ride time. That's what makes a workout portable across a whole winter of changing fitness — but it's also the one thing that can silently go wrong. If your FTP is 260 W in the app that built the workout and still 230 W on the Garmin from last spring, the "same" workout is a different session on each device. Whenever your FTP changes, update it everywhere you ride. It's a two-minute chore that keeps every exported file honest.
Exporting from your plan
If your training plan lives in Moveee, any planned workout exports straight from the calendar as .zwo or .fit — so the session your plan scheduled for Thursday can be ridden on your Edge up a real climb, in Zwift, or in Moveee Indoor without leaving the browser. The plan doesn't care where you ride the intervals; it only cares that you do.
Keep reading
How to build a cycling training plan around a full-time job
You don't need 12-hour weeks to get properly fast — you need the right 6–8 hours, placed where your life can actually hold them. Here's how to anchor a working week around two quality sessions and one long ride, what to cut first when work explodes, and why a plan that adapts beats a plan that's perfect.
How many TSS per week do you actually need?
TSS puts one number on how much training you've done — but how much is enough, and when does more stop helping? Realistic weekly ranges by rider level, the ramp-rate rule that keeps you improving without breaking, and why chasing the number corrupts the training it's meant to measure.