Guide News Free Tool Already have a key?
JSON → Garmin Connect

JSON
to Garmin
Connect.

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.

Overview

What this
page covers.

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.

The technical shape of the conversion

What the
converter actually does.

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.

Why not just script it

Why not just
write a script?

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.

FAQ

Common
questions.

Can I just rename the .json files to .csv?
No. JSON and CSV have completely different structures. JSON is nested objects with keys; CSV is flat rows and columns. The actual data inside the files has to be transformed, not just relabelled.
Is there an official Fitbit-to-Garmin tool?
No. Neither Fitbit nor Garmin offers one, despite both companies having an active interest in users being able to move data. Wearable Converter is the closest thing to an end-to-end solution.
Will this work for sleep and heart rate JSON files too?
For now, the converter focuses on what Garmin Connect can actually import via its file upload flow: daily activity totals (steps, distance, calories, floors, active minutes) and body composition (weight, BMI, body fat). Garmin's importer doesn't accept intraday heart rate or sleep stage data via CSV upload, so those JSON files aren't converted for the Garmin path. The Spreadsheet Export tool covers activity and body for general analysis.
How long does the conversion take?
Most users see results in 5 to 15 seconds, depending on how many years of data are in the export and how fast their device is. The bottleneck is your computer, not a server.
Does the JSON structure change over time?
It has shifted slightly between Fitbit versions over the years (different field names, different nesting). The converter handles all known variations from roughly 2015 onwards. If you have data from before 2015 and something doesn't parse, contact support.
Related

Other
angles on this.

Same problem, different framings. Helpful if your specific search query isn't quite this one.