Skip to content

Convert ZWO to Garmin

Take a Zwift ZWO workout into Garmin Connect so you can run a session you built in Zwift on your Garmin watch or head unit. Kaiord converts ZWO to the Garmin Connect workout format (GCN JSON) — free and in-browser in the Kaiord Editor (no account, no upload), or via the CLI and TypeScript SDK. Conversions go through Kaiord's canonical KRD format and stay within round-trip tolerances (time ±1 s, power ±1 W or ±1 % FTP).

Three ways to convert

1. Editor (drag & drop)

Open kaiord.com/editor, drop your .zwo file, choose Garmin (GCN) as the export format, and download the result. To send it straight to your watch, use the Editor's Garmin sync (backed by the garmin-bridge extension).

2. CLI

bash
pnpm add -g @kaiord/cli
kaiord convert -i workout.zwo -o workout.gcn

To push directly to Garmin Connect (after kaiord garmin login):

bash
kaiord garmin push -i workout.zwo --input-format zwo

3. SDK

ts
import { fromText, toText } from "@kaiord/core";
import { zwiftReader } from "@kaiord/zwo";
import { garminWriter } from "@kaiord/garmin";
import { readFile, writeFile } from "node:fs/promises";

const zwo = await readFile("workout.zwo", "utf-8");
const krd = await fromText(zwo, zwiftReader);
const gcn = await toText(krd, garminWriter);
await writeFile("workout.gcn", gcn);

What survives the conversion

DataZWO (Zwift)Garmin Connect (GCN)Result
Step order & namesblocksworkout stepsPreserved
Time durationsDuration secondstime durationsPreserved (±1 s)
Power targets% FTP (Power fraction)wattsConverted using an assumed FTP (see below)
RampsWarmup / Cooldown / Rampranged targetPreserved as a power range
Repeats / intervalsIntervalsTrepeat blocksPreserved
Free-ride segmentsFreeRideopen stepPreserved as an untargeted step

Gotchas

Watts vs. % FTP. Zwift stores power as % FTP; Garmin Connect stores watts. The conversion applies an assumed FTP (the output records it as kaiord:assumedFtp, e.g. 250 W) to turn percentages into watts. If exact watts matter, set your real FTP in Garmin Connect or rescale afterwards.

How does it get on my watch? A .gcn file is Garmin Connect's JSON, not a device file. Push it to your account with kaiord garmin push (via @kaiord/garmin-connect) or use the Editor's Garmin sync; Garmin Connect then syncs it to your device.

Heart-rate and cadence. Zwift workouts are power-based, so ZWO rarely carries heart-rate or cadence targets to bring across. Any that exist are mapped where Garmin Connect supports them.