Quick Fix: Recover Your Run Now
If you just need the run back and do not care about the post-mortem yet, drop the broken file here:
Save My Run is our free repair tool. It runs in your browser, never uploads your file to a server, and spits out a clean .GPX you can re-import into Strava, Runalyze, Garmin Connect, or anywhere else. Then come back and read why this happens — so it does not happen to you again.
You finish the run. The watch buzzes. You get home, open the app, and there it is: “Activity could not be uploaded.” Or worse, the file shows up in Garmin Connect at 3.4 miles when you actually ran 13.1.
This is one of the most demoralizing things in endurance sport, and it almost never gets a real explanation. The company support page tells you to restart your phone. The forum threads tell you to factory-reset your watch. Neither of those things is the actual fix, because neither of them touches the file.
Here is what is really happening, and what to do about it.
What a .FIT File Actually Is
The .FIT format is a binary container Garmin invented in 2010 and the rest of the industry quietly adopted. COROS uses it. Wahoo uses it. Suunto exports it. Even Apple Health spits out .FIT when you push to Strava. It is the universal native format for an activity.
Inside a .FIT file, your run is a chain of records — one record per second, give or take — that each carry a timestamp, GPS coordinates, heart rate, cadence, power, and whatever else the watch was measuring. The whole chain ends with a CRC checksum that says “the file is complete and intact.”
Almost every .FIT corruption you will ever see is a problem with one of three things: that final checksum, the chain of records, or the header that tells software where the chain begins. Once you know that, the actual causes get a lot less mysterious.
The Five Real Causes of .FIT Corruption
1. The watch died mid-save
This is the most common cause, by a long way. You hit Stop, the watch begins writing the file to flash, the battery runs out before the closing checksum gets written, and now the file ends mid-record. Garmin Connect, Strava, and Runalyze all check that closing checksum before they accept an upload. No checksum, no upload.
This is most common on older Forerunners, the Fenix 3 / 5 generation, and any watch that ran a 14+ hour ultra on a single charge. AMOLED watches with smaller batteries (Forerunner 165, Apple Watch Series 9) hit this faster than people expect.
2. The watch crashed mid-activity
A firmware bug, a sensor fault, or a memory issue causes the watch to soft-reboot during the run. When it comes back, it tries to “stitch” the activity back together, and sometimes it succeeds. Sometimes it produces a .FIT file with two headers, overlapping timestamps, or a record stream that flips backward in time. The watch shows the activity. The cloud rejects it.
This was epidemic on Garmin’s 6.x firmware in 2023 and shows up sporadically on COROS Pace and Vertix watches when you stack a long run on top of a sleep tracking session.
3. The Bluetooth sync got interrupted
Your watch was happily transferring the file to your phone over Bluetooth Low Energy when one of you walked into a different room, or the phone backgrounded the Garmin app, or iOS killed the connection because you had not opened the app in a week. The transfer ends mid-stream and the partial file lands in the app sandbox.
You see this most often as “Activity stuck in queue” in Garmin Connect or “Upload failed” repeatedly in the Strava app. The file on the watch is fine. The file on the phone is broken.
4. A USB transfer wrote a partial file
Less common in 2026, but still real for people who plug their Garmin into a laptop and drag .FIT files manually. Pull the cable too soon, and the operating system may have buffered some of the bytes without flushing them to disk. The file looks like it copied. It did not.
Mac users hit this more than Windows users because the macOS Finder lies about copy completion.
5. A third-party app rewrote the file badly
You exported the .FIT, ran it through a route-correction tool, a manual-stop trimmer, or a “fix my pace” web service, and the tool returned a file that no upstream platform will accept. Most public .FIT editors are not strict about regenerating the closing checksum. Some of them silently re-encode timestamps in a way Strava parses as “the activity ended in 1970.”
If the file came out of a converter, that is probably your culprit.
How to Recover the Run
There are three ladders here, in order of effort. Try them in order.
Ladder 1: Use Save My Run (60 seconds)
Drop the broken .FIT into tools.fitnesstechtrends.com. The tool parses the file in your browser, salvages every valid trackpoint it can find, regenerates a clean .GPX, and gives you the download. No upload to a server, no account, no charge.
This works for the first three causes above (dead watch, crash, broken sync) and most cases of cause 5. It is the right first move because it costs you nothing and recovers the data in almost every realistic scenario.
Ladder 2: Pull the original off the watch
If the file on your phone is corrupted but you suspect the watch’s copy is intact, plug the watch into a computer with USB. On Garmin watches, the file lives at GARMIN/Activity/. Copy that file directly — do not let the Garmin Express app touch it — and run it through Save My Run if it still will not upload.
This is the right move when cause 3 (Bluetooth sync) is the suspect, because the watch’s copy is usually clean.
Ladder 3: Manual edit (last resort)
If Save My Run cannot recover the file, you have a deeply broken header or a record stream the parser cannot find an entry point in. At that point, the practical move is to log the run manually in Strava using your watch’s distance and time, and accept that the GPS trace is gone. Garmin Connect lets you create a manual activity in three taps. Strava is similar.
It is not satisfying. But the alternative is hex-editing a binary file at 9 PM on a Sunday, and you have better things to do.
How to Prevent This Next Time
- Charge the watch above 30% before any run over an hour. Most “watch died at the end” corruption is preventable here.
- Open the Garmin Connect or COROS app within 10 minutes of finishing. This forces the sync while the connection is fresh and the phone has not backgrounded the app.
- Update firmware, but not the day before a race. Most “watch crashed mid-run” corruption traces back to a firmware bug, but you do not want to discover a new bug on race morning.
- Avoid sketchy .FIT converters. If you need to edit a file, use a tool that is explicit about regenerating the CRC checksum. Save My Run is one. The well-known FIT SDK from Garmin is another. Most random web tools are not.
- Eject the watch from your computer before unplugging it. Yes, it matters.
FAQ
Is Save My Run actually free?
Yes. We built it because there was no good free option, and a paid product for a problem that hits people maybe twice a year was not going to fly. It is funded by the rest of the FTT site.
Does it work on .GPX files too?
Yes. It accepts both .FIT and .GPX inputs and outputs clean .GPX. If your platform needs .FIT specifically, regenerate it from the .GPX in Garmin Connect, Runalyze, or your watch’s companion app.
Will the recovered file include heart rate and power?
If the trackpoints survived, yes. .GPX is a less rich format than .FIT, but our exporter preserves heart rate, cadence, and elevation when those are present in the source. Power and running dynamics may not survive the round-trip into Strava, depending on Strava’s parser.
What if the watch never even produced a file?
Then there is nothing to recover. Some Garmin watches will keep a partial activity in memory after a crash and let you resume it from the menu. If yours does not, the run is gone — log it manually and move on.
Why does this keep happening to me specifically?
Probably one of three things: the watch is older than the manufacturer admits, the battery has degraded below where it was rated, or your phone is aggressively killing the companion app in the background. The first two are the more common answers in 2026.
The Short Version
.FIT corruption is almost always a checksum problem caused by a watch dying, crashing, or syncing badly — not by anything you did wrong. The fix is rarely “factory reset everything.” It is “salvage the trackpoints from the broken file.”
That is exactly what Save My Run does, and it is free. Use it before you start hex-editing.

