You opened your Takeout ZIP and found a folder of .json files. Garmin Connect wants CSV. Wearable Converter does the JSON-to-CSV transformation Garmin Connect requires, automatically and locally in your browser.
Fitbit's export format is JSON. Garmin Connect's import format is CSV. That mismatch is why this page exists.
If you're here, you've probably already tried opening the JSON files manually, maybe even thought about writing a script. You don't need to. The conversion is a known shape, the same transformation for everyone, and it's been done for you.
It flattens nested JSON into rows. Each Fitbit JSON file contains an array of date-value objects (often nested several layers deep). The converter walks each file, extracts the date and value, and aligns them into a tabular structure.
It joins across files on date. Daily steps live in one JSON file, daily distance in another, calories in a third. The converter merges them on the date key so a single CSV row contains all the metrics for that day.
It converts units. Fitbit stores distance in centimetres internally. Garmin Connect wants kilometres or miles depending on your account preference. The converter handles that.
It corrects timezone offsets. Fitbit JSON timestamps are UTC. Daily aggregates in Garmin should reflect your local day. The converter shifts dates to the timezone you select.
It writes Garmin's exact CSV format. Garmin Connect's import is picky about column order, header names, date format, and unit notation. The converter outputs exactly what the importer expects, year-by-year files ready to upload.
You can. Plenty of Reddit threads exist for it. The catch is that Garmin's importer is unreliable in ways that aren't obvious until you're halfway through a multi-year import. A few of the gotchas:
Garmin's date format expectation varies. Sometimes YYYY-MM-DD works, sometimes you need DD/MM/YYYY, sometimes it depends on your Garmin account locale rather than the file itself. The converter outputs all dates in Garmin's expected format and the import modal asks you to confirm at upload time.
The CSV needs a specific column order with specific header names. Capitalisation, spelling, the lot. Get one column wrong and the whole import errors out with no useful error message.
Body composition records sit in a different file format. The activity import and the body import use different CSVs with different columns. The converter produces both.
The importer fails intermittently. Even with a perfect file. Garmin's servers throw a generic error and you retry, usually it works on the second or third attempt. The tool page includes the workflow that handles this.
Same problem, different framings. Helpful if your specific search query isn't quite this one.