Data Analysis

FIT Files Explained: The Runner's Guide to Watch Data

Every run you record on a Garmin, COROS, or Wahoo device lives inside a FIT file — a compact binary format that holds far more than the platforms ever show you. This guide explains what a FIT file actually contains, how it compares to GPX and TCX, how to open and convert it, and how to use the raw data to audit, repair, and truly own your training history.

18 min read
Key Takeaways
  • FIT stands for Flexible and Interoperable Data Transfer. It was developed by Dynastream Innovations — the Alberta company behind the ANT+ wireless protocol, a Garmin subsidiary since 2006 — and is now the de-facto recording format for Garmin, COROS, Wahoo, Zwift, and most serious training platforms.
  • FIT is binary, not text. A one-hour run is roughly 100–300 KB as FIT versus 1–3 MB as GPX or TCX, because every value is stored as compact typed bytes instead of verbose XML tags. The trade-off: you cannot open it in a text editor or Excel without decoding it first.
  • FIT captures everything your watch knows: per-second GPS, heart rate, cadence, power, temperature, running dynamics, laps, device info, R-R intervals, and third-party developer fields like Stryd power. GPX keeps only position, time, and a few extensions; TCX adds laps and HR but still drops most sensor data.
  • Converting FIT to GPX is lossy. Heart rate, cadence, and temperature can survive in GPX extensions, but laps, power, running dynamics, R-R intervals, and device metadata are gone. Convert to GPX only for route sharing; convert to CSV when you want to analyze the actual numbers.
  • You can always retrieve your original FIT files: Garmin Connect ('Export Original'), the COROS and Suunto apps (export/download FIT), Strava ('Export Original'), and on Apple Watch via apps like HealthFit or RunGap, since Apple does not record FIT natively.
  • FIT files contain more personal data than runners realize: your start coordinates, device serial number, and sometimes body metrics from the user profile. Before sharing a raw file publicly, strip or trim these fields — a map screenshot reveals far less than the file behind it.

What is a FIT file?

FIT stands for Flexible and Interoperable Data Transfer. It is a binary file format designed specifically for storing and sharing data from sport and fitness devices — every run, ride, lap, and sensor reading your watch records. The format was created by Dynastream Innovations, the Canadian company from Cochrane, Alberta that also invented the ANT+ wireless protocol used by heart rate straps and footpods. Garmin acquired Dynastream in 2006, and FIT became the recording format for the entire Garmin ecosystem. Because Garmin publishes a free, open FIT SDK at developer.garmin.com, the format spread far beyond one brand: COROS, Wahoo, Zwift, Stryd, Hammerhead, and most modern training devices now write FIT natively, and every serious analysis platform — Strava, TrainingPeaks, Runalyze, GoldenCheetah, Hashiri.AI — reads it.

FIT exists because the formats that came before it were built for the wrong job. GPX was designed in 2002 for exchanging GPS tracks between mapping programs — positions and timestamps, nothing about physiology. TCX, Garmin's earlier XML format, bolted on laps and heart rate but inherited XML's fundamental problem: text is enormous. A watch recording ten data fields every second for a three-hour marathon would produce a multi-megabyte XML file, painful to store on a 2008-era device with a few megabytes of memory and slow to transfer over ANT or early Bluetooth. FIT solved this with a compact binary encoding: each value is stored as raw typed bytes (a heart rate is one byte, a GPS coordinate four), with self-describing message definitions so any decoder can parse files from any device.

The result is a format that is small, extensible, and lossless — the closest thing to a 'RAW file' in endurance sports. When Strava, Garmin Connect, and TrainingPeaks show you different numbers for the same run, the FIT file is the ground truth they all started from. That is why this guide treats the FIT file as something worth understanding rather than a black box: it is the original record of your training, it transfers between platforms when you switch watch brands, and with the right (free) tools you can open, convert, repair, and analyze it yourself. Everything the platforms compute — pace charts, training load, VO2 max estimates — derives from the bytes described in the next section.

Inside a FIT file: how the format works

Every FIT file has three parts: a header, a stream of records, and a closing checksum. The header is 12 or 14 bytes and contains the protocol version, the profile version, the size of the data that follows, and the ASCII characters '.FIT' at bytes 8–11 — the signature tools use to recognize the format. The file ends with a 2-byte CRC that lets a decoder detect corruption. In between sits the actual data, organized as two kinds of records: definition messages and data messages. A definition message announces 'the following data messages of local type N contain these fields, in this order, with these byte sizes.' The data messages that follow are then pure values with no labels — which is exactly why FIT is so compact and why a text editor shows only gibberish. The decoder reconstructs meaning by pairing each data message with its definition.

The messages themselves are typed by a global message number defined in Garmin's FIT Profile. A typical activity file opens with a file_id message (device manufacturer, product, serial number, creation time), then streams thousands of record messages — one per second on most modern watches — each carrying that instant's GPS position, altitude, distance, speed, heart rate, cadence, power, and temperature. Lap messages summarize each lap split, event messages mark timer starts/stops, and a single session message at the end holds the totals your watch shows on the summary screen. Two details trip up first-time readers: FIT timestamps count seconds from December 31, 1989 UTC (not the Unix epoch), and GPS coordinates are stored in 'semicircles' — multiply by 180/2³¹ to get degrees.

FIT protocol 2.0 added developer fields, and they matter to runners more than the name suggests. A Connect IQ app or paired third-party sensor can define its own fields and write them into the same record stream: Stryd stores its running power, leg spring stiffness, and air power as developer fields; muscle-oxygen sensors and core-temperature sensors do the same. The file carries a field_description message explaining each custom field, so any compliant decoder can read them without prior knowledge. This is why a single FIT file can outlive any platform: whatever your watch and sensors measured on a given day — native or third-party — is preserved in one self-describing container.

Common FIT message types in an activity file

Message typeHow often it appearsWhat it contains
file_idOnce, at the startFile type, manufacturer, product, device serial number, creation timestamp
recordEvery second (or 'smart' interval)GPS position, altitude, distance, speed, heart rate, cadence, power, temperature, running dynamics
lapOnce per lap/splitLap time, distance, avg/max pace, HR, cadence, calories, trigger (manual or auto)
sessionOnce per activitySport type, totals: time, distance, calories, avg/max values, training effect
eventOn each eventTimer start/stop/pause, lap button presses, alerts, battery warnings
device_infoPer connected deviceWatch and sensor models, firmware versions, battery status, ANT+/BLE IDs
hrvPer heartbeat (if enabled)Beat-to-beat R-R intervals used for HRV and respiration analysis
field_descriptionPer developer fieldName, units, and type of custom fields (e.g., Stryd power, Connect IQ metrics)

FIT vs GPX vs TCX: which format holds what

The three formats answer different questions. GPX (GPS Exchange Format) is an open XML standard from 2002 built to answer 'where did this track go?' — a list of trackpoints with latitude, longitude, elevation, and time. Heart rate, cadence, and temperature can ride along only inside optional extension tags (Garmin's TrackPointExtension is the common one), and support for those extensions varies by tool. TCX (Training Center XML) is Garmin's older training format and answers 'how did the workout go?' — it adds laps, per-point heart rate and cadence, calories, and sport type, but it is still verbose XML and predates running power, dynamics, and developer fields. FIT answers 'what did the device record?' — everything, including sensor metadata, R-R intervals, and custom fields, in a fraction of the size.

Size differences are dramatic because of the encoding. In FIT, one second of running data costs roughly 25–35 bytes; the same trackpoint in GPX or TCX costs several hundred bytes of angle brackets and decimal strings. For a one-hour run recorded every second, expect a FIT file around 100–300 KB, a GPX around 1–2 MB, and a TCX often larger still — roughly a 5–10x difference that grows with every extra sensor. Size matters less on modern phones than it did on 2008 watches, but it still shows up in practice: email attachment limits, upload speed for a 100-mile ultra file, and the simple fact that a decade of training history in FIT fits where one season of TCX would.

The practical rule: keep FIT as your archival format, and treat GPX and TCX as export targets for specific jobs. Share a route with a friend whose app only reads GPX? Export GPX. Feed an old tool that wants TCX? Export TCX. But never make GPX your only copy of an activity, because the conversion is one-way lossy — once laps, power, and device data are stripped, no converter can put them back. Every platform that matters accepts FIT uploads directly, so there is rarely a reason to convert before importing — converting first only risks losing fields the destination would have read happily. The comparison table below summarizes the trade-offs at a glance.

FIT vs GPX vs TCX at a glance

FormatTypeSize for a 1h runData capturedBest for
FITBinary~100–300 KBEverything: GPS, HR, cadence, power, laps, R-R intervals, device info, developer fieldsArchiving activities, platform-to-platform transfer, deep analysis
TCXXML (text)~1–3 MBGPS, time, HR, cadence, laps, calories; power only via extensionsLegacy training software that predates FIT support
GPXXML (text)~1–2 MBPosition, elevation, time; HR/cadence/temp only via optional extensions; no lapsSharing routes, importing courses into mapping apps

How to open a FIT file

The fastest way to open a FIT file is an online viewer. Hashiri.AI's free FIT Viewer runs entirely in your browser: drop in a file and it renders the route map, pace/heart rate/elevation charts, and the full lap table — no account, no upload to a server, no install. That makes it the right tool for the common situations where you have a bare file and a question: a friend sent you their race file, you recovered an activity from a crashed watch, or you want to inspect what a file contains before uploading it somewhere. Browser-based viewers decode the same binary structure described above, so you see what the file actually stores rather than what a platform chose to recompute.

If you want the activity in your training history rather than just viewed, import it into a platform. Garmin Connect accepts FIT files via the Import button (cloud icon) on the web; Strava accepts them at strava.com/upload; TrainingPeaks, Runalyze, and intervals.icu all support drag-and-drop FIT import. Hashiri.AI does too — uploaded FIT files become full activities with maps, laps, and AI coach analysis. On desktop, GoldenCheetah is the power tool: a free, open-source analysis suite that reads FIT natively and exposes every field, including developer fields, for charting and export. GPXSee is a lightweight open-source viewer for quickly plotting the track and elevation profile of any FIT, GPX, or TCX file.

What does not work is opening the file directly in Excel, Numbers, or a text editor. FIT is binary: Excel expects delimited text and will show a wall of garbled characters, because the meaningful structure only emerges after decoding definition messages and applying the FIT Profile's field types and scaling factors (speed stored as mm/s, coordinates as semicircles, timestamps as a 1989-based epoch). To get FIT data into a spreadsheet you must convert it to CSV first — covered in the next section. Programmers can skip the converter entirely: Garmin's official FIT SDK ships decoders for JavaScript, Python (garmin-fit-sdk on PyPI), Java, C, and C#, and the community fitparse and fitdecode libraries are mature alternatives.

Converting FIT files: to CSV, to GPX, and back again

FIT to CSV is the conversion for anyone who wants to see the numbers. A good converter reads every record message and writes one row per second with columns like timestamp, latitude, longitude, distance, speed (or pace), heart rate, cadence, altitude, power, and temperature — plus developer-field columns such as Stryd power when present. Hashiri.AI's free FIT Converter does exactly this in the browser: drop in a FIT file, get a clean CSV, no account needed. From there a spreadsheet can answer questions no activity page will: average heart rate for a hand-picked stretch of the run, time spent above a cadence threshold, or a scatter plot of pace versus heart rate for one long run. CSV is also the honest interchange format for coaches and researchers, because nothing is hidden behind a platform's smoothing.

FIT to GPX is for sharing where the run went, and it is important to understand what survives the trip. Position, elevation, and timestamps convert cleanly. Heart rate, cadence, and temperature can be preserved in Garmin TrackPointExtension tags if the converter writes them — many minimal converters do not. What is always lost: laps and splits (GPX has no lap concept), running power, running dynamics, R-R intervals, calories, training effect, and device metadata. Convert to GPX when the destination is a mapping or navigation app, a race-route share, or an older platform that cannot read FIT. Do not use GPX as a backup format for training data — you are quietly throwing away most of the file.

GPX to FIT runs the conversion the other way, and the main reason runners need it is courses: Garmin and COROS watches navigate from FIT course files, so a route you drew in a mapping tool or downloaded from a race website as GPX must become FIT before the watch can guide you along it (Garmin Connect's course importer does this conversion implicitly; standalone converters like Hashiri.AI's GPX to FIT tool do it explicitly). Since GPX contains less than FIT, this direction is lossless — there is simply nothing to lose. One distinction matters: a course FIT and an activity FIT are different file types, so converting a finished run to GPX and back will not produce a navigable course unless the tool explicitly builds one. The decision table below maps common goals to the right conversion.

Which conversion do you need?

I want to…Convert to…Watch out for
Analyze my run in Excel / Google SheetsFIT → CSVPick a converter that exports all fields, including power and developer fields
Share the route with someone on another appFIT → GPXLaps, power, and dynamics are dropped; HR survives only via extensions
Load a planned route onto my Garmin/COROS for navigationGPX → FIT (course)Use a course converter; an activity FIT will not work for navigation
Move my history to a new platformNo conversion — upload FITEvery major platform reads FIT; converting first only loses data
Feed an old training program that predates FITFIT → TCXPower and running dynamics may not survive; verify after import
Inspect a file before uploading anywhereNo conversion — use a FIT viewerBrowser-based viewers keep the file on your device

What runners can actually do with the raw data

Raw FIT data settles arguments that platform charts cannot. GPS accuracy is the classic case: when your watch says 10.21 km and the race said 10 km, the per-second coordinates let you see exactly where the track wandered — under the start banner's buildings, through the tunnel, on the switchbacks — instead of guessing. Platforms also disagree with each other because each applies its own smoothing, elevation correction, and stopped-time logic to the same file; comparing the raw record stream against both versions shows you which platform changed what. And when a platform mangles an import (wrong distance, missing laps, halved power), the original FIT file proves whether the problem is your data or their parser — and gives you a clean copy to re-upload.

The raw stream also unlocks analyses most platforms still bury or paywall. Cardiac drift — aerobic decoupling — is the best example: split a steady long run in half, compute pace-to-heart-rate ratio for each half, and the percentage change tells you how durable your aerobic system is (commonly, under ~5% drift on a steady effort suggests solid aerobic endurance; more suggests the pace outran your fitness, heat, or fueling). With per-second data in a spreadsheet this is a ten-minute exercise. You can also examine pace smoothing directly: instantaneous GPS speed is noisy, and seeing the raw jitter explains why your watch's 'current pace' bounces around and why platforms display rolling averages. R-R interval data, when your strap records it, supports HRV analysis far beyond what the watch surfaces.

The flip side of all this richness is privacy. A FIT file is not just a route: the file_id message carries your device's serial number, the first record messages pin your exact start location — often your front door — and files can include user profile data such as weight, age, and gender that the watch uses for calorie math. Before posting a raw FIT file to a forum, sending it to a stranger, or attaching it to a bug report, trim the start/end of the track or use a tool that strips identifying messages, and check what profile fields are embedded. Platforms have privacy zones that hide your home on the map; a shared file bypasses all of them. Share screenshots freely, share files deliberately.

Getting FIT files off your device, platform by platform

Garmin gives you three routes. Per activity: open the activity in Garmin Connect on the web, click the gear icon, and choose 'Export Original' — you get a ZIP containing the original FIT file exactly as the watch recorded it. In bulk: Garmin's account data export (the GDPR-style 'Export Your Data' request from your account management page) delivers your entire history, original FIT files included, within a couple of days. Directly: most Garmin watches still mount as USB storage, with activities sitting in the GARMIN/Activity folder as FIT files — the zero-cloud option. COROS exports per workout from the app: open the workout, tap the share/settings icon, choose 'Export Data', and select the .FIT format; the COROS web dashboard offers the same per-activity export.

Suunto's app exports FIT per activity as well: open the workout, tap the three-dot menu, and choose 'Download FIT file'. Polar is the outlier — Polar Flow's per-session export offers TCX, GPX, and CSV rather than FIT, and its full account export arrives as JSON, so Polar runners who need FIT must convert (TCX preserves the most). Apple Watch does not use FIT at all: workouts live in HealthKit's database. The established bridges are third-party apps — HealthFit and RunGap are the two most used — which read your HealthKit workouts and export them as standards-compliant FIT files (or sync them straight to Strava, TrainingPeaks, and similar platforms), GPS track, heart rate, and running power included.

Strava deserves a special mention because it often becomes a runner's accidental archive. For any single activity you uploaded from a device, the three-dot menu offers 'Export Original', which returns the exact file Strava received — FIT if it came from a Garmin/COROS/Wahoo sync. The account-level bulk export (Settings → My Account → Download or Delete Your Account → Download Request) packages your entire history with the original files. Two caveats: activities recorded with the Strava phone app have no FIT original (you will get GPX), and 'Export GPX' on a FIT-sourced activity gives you the lossy conversion, not the original. Whatever your platform mix, the durable habit is the same: keep a folder of original FIT files; platforms come and go, the format does not.

Fixing common FIT file problems

Corrupted files are the most stressful failure, usually after a watch crash or a battery death mid-activity: the file exists but the platform rejects it. The cause is almost always truncation — the recording stopped before the closing session message and final CRC were written, so strict parsers refuse the file. Recovery is very possible because FIT data records are self-contained: a repair tool re-reads the intact records, synthesizes the missing summary messages, and writes a valid file. The free web utilities at FIT File Tools include a corruption fixer plus a time adjuster, activity combiner, and section remover; GoldenCheetah will often import damaged files that other platforms reject; and Garmin's own SDK ships FitCSVTool, which can round-trip a file through CSV and back, regenerating valid structure along the way.

Two more everyday problems have data-level explanations. Missing or wild GPS at the start of a run happens when you press start before the watch has a satellite fix — the first record messages simply lack position fields, or contain a few hundred meters of scatter while the receiver converges; the fix is behavioral (wait for the fix indicator) but a section-remover tool can crop the garbage from an existing file. Merging two activities — your watch died, you finished on your phone, and you want one run — is what combiner tools do: they concatenate the record streams and rebuild a single session. Wrong timestamps usually trace to the format itself: FIT stores all timestamps in UTC and lets the displaying platform localize them, so an activity that appears shifted by exact hours is a timezone interpretation bug (or a watch that lost time sync), fixable with a time-adjuster tool rather than re-recording.

Finally, the eternal question: why does every platform show different elevation gain for the same file? Because elevation has three sources of truth. Watches with barometric altimeters (most mid-range and up Garmin and COROS models) record pressure-derived altitude in the FIT file — smooth and relatively trustworthy, though weather fronts and unsealed sensor ports can skew it. GPS-only devices record satellite-derived elevation, which is noisy enough that summing its ups and downs inflates gain badly. So platforms like Strava apply DEM correction — replacing recorded elevation with values looked up from a terrain elevation database along your track — for non-barometric devices, and sometimes optionally for all. Same FIT file, three defensible answers. When comparing runs, compare within one platform and one method; when auditing a single run, the raw altitude column in the FIT file shows what was actually recorded before anyone corrected it.

Frequently Asked Questions

What is a FIT file?

A FIT (Flexible and Interoperable Data Transfer) file is the binary format sport devices use to record activities. Developed by Dynastream Innovations, a Garmin subsidiary, it stores everything your watch measures — per-second GPS, heart rate, cadence, power, laps, device info, and custom sensor fields — in a compact, self-describing container. It is the de-facto standard for Garmin, COROS, Wahoo, and Zwift, and every major training platform can read it.

How do I open a FIT file without Garmin Connect?

Use a browser-based viewer: Hashiri.AI's free FIT Viewer renders the map, pace/HR/elevation charts, and lap table without an account or install. Alternatively, upload the file to Strava, TrainingPeaks, or intervals.icu, or open it on desktop with GoldenCheetah (full analysis) or GPXSee (quick track view). All of these decode the same binary records — pick based on whether you want a quick look or a permanent import.

How do I convert a FIT file to CSV?

Use a FIT-to-CSV converter — Hashiri.AI's free FIT Converter runs in the browser: drop the file in and download a CSV with one row per second and columns for timestamp, position, distance, pace, heart rate, cadence, altitude, power, and temperature. Programmers can use Garmin's official FIT SDK (JavaScript, Python, Java, C#) or the Python fitparse/fitdecode libraries to script the same conversion in a few lines.

Can Excel open a FIT file directly?

No. FIT is a binary format: values are stored as raw typed bytes whose meaning comes from definition messages and the FIT Profile, so Excel — which expects delimited text — displays unreadable characters. Convert the file to CSV first with a FIT converter, then open the CSV in Excel or Google Sheets. After conversion you get clean per-second columns you can filter, chart, and compute on like any other dataset.

What is the difference between FIT, GPX, and TCX?

GPX is an open XML format for GPS tracks: position, elevation, and time, with heart rate or cadence only via optional extensions and no lap concept. TCX is Garmin's older XML training format that adds laps, HR, cadence, and calories. FIT is a binary format that stores everything — all sensor data, laps, R-R intervals, device metadata, developer fields — at roughly 5–10x smaller file size. FIT is the richest and most compact; GPX is the most universally readable for routes.

Do I lose data converting FIT to GPX?

Yes, always some. Position, elevation, and timestamps convert cleanly, and heart rate, cadence, and temperature can survive if the converter writes Garmin TrackPointExtension tags. But laps and splits, running power, running dynamics, R-R intervals, calories, and device info are permanently dropped because GPX has no place for them. Use GPX for sharing routes; keep the FIT file as your archival copy of the actual training data.

How do I get the original FIT file from Strava?

Open the activity, click the three-dot menu, and choose 'Export Original' — you receive the exact file Strava ingested, which is FIT for activities synced from Garmin, COROS, or Wahoo devices. For your whole history, request the account bulk export under Settings → My Account. Note that activities recorded with the Strava phone app have no FIT original (you get GPX), and the separate 'Export GPX' option is a lossy conversion, not the original file.

How can I get FIT files from an Apple Watch?

Apple Watch does not record FIT natively — workouts are stored in HealthKit. Third-party apps bridge the gap: HealthFit and RunGap read your HealthKit workouts and export them as standard FIT files, including GPS, heart rate, and running power, or sync them directly to Strava, TrainingPeaks, and similar platforms. This is the standard route for Apple Watch runners who want their data in FIT-based training tools or a personal archive.

How do I fix a corrupted FIT file?

Corruption usually means truncation — the watch crashed before writing the closing session message and CRC. Because each data record is self-contained, repair tools can rebuild the file: the free utilities at FIT File Tools fix corrupt files, adjust timestamps, combine split activities, and remove bad sections. GoldenCheetah often imports files other platforms reject, and Garmin's FitCSVTool (in the FIT SDK) can round-trip a file through CSV to regenerate valid structure.

Why do Strava and Garmin show different elevation for the same FIT file?

Because they use different elevation sources. Barometric watches record pressure-derived altitude in the file; GPS-only devices record noisy satellite elevation; and platforms like Strava apply DEM correction — replacing recorded values with a terrain database lookup along your track — for non-barometric devices. Each method sums small ups and downs differently, so total gain diverges. Compare elevation only within one platform, and check the raw altitude column in the FIT file to see what was actually recorded.

Convert your FIT file in seconds

Our free FIT Converter turns any FIT file into a clean CSV right in your browser — per-second timestamps, GPS, pace, heart rate, cadence, altitude, power, and temperature, ready for Excel or Google Sheets. No account, no upload to a server, no limits.

Open the FIT Converter