RideTool
OverviewSet It UpThe Me CardYour EmailsUsing RideTool with ClaudeYour Ride HistoryCalendarWeatherWeightCaloriesHydrationApple WatchElectric BikesYour Ride FilesConnecting Strava, Garmin & WahooSharing RidesAccount & BillingPricing & Your DataTroubleshooting
Advanced
AdvancedTraining Metrics (Formulas)Sync & Dedup Engine
Docs › Sync & Dedup Engine

Sync & Dedup Engine

This page documents the deduplication engine, source priority order, and how rides flow from each provider. For the rider-facing version, see Connecting Strava, Garmin & Wahoo.

Why this is hard

A single ride recorded on a Garmin watch can arrive as a Garmin webhook, a Strava webhook (because Garmin auto-syncs to Strava), and a manual FIT upload. Each source reports slightly different timestamps, distances, and durations. The dedup engine has to recognize them as the same ride and decide what to keep.

Three-level dedup

  1. Provider ID match: the same provider re-sending the same activity is recognized instantly by its own ID.
  2. Fingerprint match: every ride gets a fingerprint from when it started and how far it went. Same fingerprint, same ride.
  3. Fuzzy match: when two sources report the same ride with slightly different timestamps or distances, a tolerance-based match catches it anyway.

Source priority

Higher priority wins on conflict:

  1. Manual FIT upload (4), raw device file, richest data
  2. Garmin (3), device-direct webhook
  3. Wahoo (2), device-direct when recorded on Wahoo hardware
  4. Strava (1), aggregator, least detail

When a duplicate is detected:

  • Higher priority incoming → action: "replace" (delete existing, insert new)
  • Lower priority incoming → action: "skip"

Later copies enrich, they never damage

One ride usually arrives as several messages, sometimes at the same instant: a summary, the raw file, the GPS detail. Each one contributes what it knows and nothing more. A thinner copy can never overwrite a richer one, a duplicate can't sneak in through a timing race, and when a better source replaces a lesser one, anything the original had that the new one lacks carries forward.

And the original device file is never discarded. If we can have the raw .fit, we keep it. See Your Ride Files.

When fitness recomputes

  1. After each ride upload: immediate recalculation.
  2. Nightly: around midnight in the user's local timezone (fatigue decays even on rest days).
  3. Manual rebuild: from Account → Recompute Fitness Stats.

Need help? Our Discord server is the support channel, click the Discord icon in the nav bar after logging in.

RideToolJust keep riding
Privacy Policy·Terms of Service·Support·Docs·Changelog·Blog·YouTube