WorkoutPort blog

Changing workout apps? Check a small batch before moving your history

Before moving your whole training history, transfer a few activities you know well and check them at the destination. Keep the original files and access to the old history until that trial works. Matching activity totals alone can hide a missing ride, a duplicate or lost power data.

This guide gives you a small-batch check you can use with your own source and destination. We also tested a narrower part locally: reading several file versions of one synthetic ride and checking them for duplicates. No real account migration or Apple Health write was performed.

1. Save an archive before changing the sync path

Keep an untouched copy of the original files available from your source. Note the source account, export date and covered date range privately. A checksum can tell you whether a saved file changed; it cannot tell you whether the export included everything you wanted.

On Strava’s website, open an activity’s more menu and choose Export Original. It returns the format originally uploaded. For an account archive, open Settings → My Account → Download your account → Get Started, then request the download. Wait for the archive and inspect it before relying on it. Strava’s export instructions.

Apple Health’s Export All Health Data produces an XML archive: in Health, open Summary, tap your picture or initials, then choose that export. Check whether your destination actually accepts the archive; accepting FIT, GPX or TCX does not imply support for Apple’s Health XML. Apple’s export instructions.

Save photos, notes and other account content separately where your source supports it. A workout file does not establish that social history, equipment labels or privacy choices will follow the activity.

2. Choose a small trial that can expose a problem

Start with a few activities that matter to you. Include an older file and a workout with the sensors or sport details you rely on. An indoor ride tests whether the destination handles an activity without a route; a late-night activity can expose a timezone mistake. Include swimming if that is part of the history you want to keep.

For each activity, write down its source identifier or filename, start time with timezone, sport, elapsed duration and known distance. Note the route and sensor streams you expect. This becomes your comparison list after import.

Use one accepted file per activity for the trial. If you have FIT, GPX and TCX versions of the same workout, keep the alternatives in the archive rather than sending all of them as separate activities.

One ride can look like several files

We checked this with the synthetic files from our export experiment. WorkoutPort’s actual parser read the FIT, GPX and TCX as separate file inputs describing the same five-minute ride. Against a synthetic existing FIT entry, its duplicate checker flagged the GPX and TCX as likely matches. Reading the unchanged FIT under a new filename also produced a likely match.

The more revealing result was the GPX copy with all sensor extensions removed. It still triggered a likely-duplicate warning, although its power sample count was zero. The warning compared the activity’s time, duration, distance and sport; it did not establish that the files contained equally useful data.

Compared with a synthetic existing FIT entry; local code only
File inputDuplicate resultPower samples read
GPX version of the rideLikely match5
TCX version of the rideLikely match5
Same FIT, different filenameLikely match5
GPX with sensor extensions removedLikely match0

Two controls—a candidate starting four hours later and one marked as a different sport—produced no match. You can inspect the actual results and runner. This test uses synthetic candidates and source code functions. It does not show how a remote service will classify your activities or prove that any file was saved to Health.

3. Inspect the imported activity, not just the success message

Wait for the trial to finish processing, then compare each resulting activity with its selected original. An upload receipt and a completed activity are different checkpoints.

Five checks before the next batch
CheckWhat to look for
IdentityEvery selected activity arrived once. Match its details, rather than relying on a repeated title or the total count.
TimeThe same start instant and expected elapsed duration. A different local date may simply reflect a timezone.
TotalsExpected distance and any calorie total you use. Establish whether a difference comes from recalculation.
Route and sportThe correct activity type and route when one is expected. An indoor workout may legitimately have no map.
SensorsThe power, heart rate, cadence or other streams you need, including known gaps and recorded zeros.

For a timezone check, 23:30 UTC and 00:30 at UTC+01:00 on the next date are the same instant. Compare the offset as well as the displayed calendar day. For distance, avoid inventing one universal tolerance: a destination may calculate a new total from the route, as our GPX import example demonstrates.

If a stream is missing, inspect the original file before converting or re-uploading it. If an activity’s outcome is still uncertain, check the destination before retrying. Keep unresolved items out of the next batch so they remain easy to investigate.

4. Set a cutoff between history and future workouts

Once the trial meets your requirements, move a batch you can reconcile against its source list. Record which activities completed and which are pending, rejected, duplicated or unresolved.

Record the last activity covered by the historical transfer, then choose one path for new recordings after that point. Otherwise, an old batch import and an automatic sync can deliver the same activity twice. The Watch and bike-computer workflow shows how to choose a path for each destination.

Keep the old history available until the batches and any separate account content have been checked. Resolve exceptions while the original source is still there to compare.

Optional: use a comparison worksheet

If you prefer a spreadsheet, download the expected list, first pass, corrected example and local checker. These six-activity rows are fictional practice data, separate from the file test above. The first pass has six rows but contains a duplicate, a missing swim and a missing power flag.

The instructions explain the deliberately narrow checks. You must match activities and supply the observations yourself; the script does not read an account or inspect sensor values. Keep your real list private, and use the destination’s actual activity details to decide whether the move met your requirements.