Sync Garmin, Whoop, Strava into Apple Health — 4 steps
Garmin, Whoop and Strava doubling your workouts in Apple Health? Here's the 4-step connection order that kills duplicates and inflated calorie counts.
Running a Garmin watch, a Whoop strap, and Strava on your iPhone sounds like having more data. In practice it usually means triple-counted calories, two copies of your morning run, and a heart rate average that no longer resembles reality. The problem isn't the wearables. It's that nobody explains the correct connection order, or which app should own each metric. I've been testing this exact four-app stack — Garmin Forerunner 965, Whoop 4.0, Strava, and Apple Health — on an iPhone 15 Pro running iOS 18.4. What follows is the setup that actually produces clean, non-duplicated data as of June 2026.
Why this ecosystem creates messy data by default
Apple Health stores over 70 distinct data categories. When multiple apps hold simultaneous write permission to the same category — "Workouts," "Active Energy," "Heart Rate" — it doesn't merge the records intelligently. It stacks them. A 45-minute Garmin run, plus the same run auto-imported by Strava, plus an auto-detected strain event from Whoop's motion algorithm adds up to 135 minutes of movement that Apple Health records as three separate events. Your weekly training load becomes fiction.
This is a deliberate HealthKit design decision, not a bug. Apple built the framework to be additive: any app with write permission adds a record, and the system preserves all sources so you can audit them. Most users never audit anything, though. They flip the connection toggles on and assume the platform handles conflicts automatically. It doesn't.
The deeper issue is structural. Every platform in this stack has a financial incentive to be your primary app. Garmin Connect wants to own your fitness picture. Strava — which hit 125 million registered users by January 2026 — wants to be your social activity layer. Whoop charges $239/year specifically because it wants to be your daily recovery operating system. None of them defaults to "just be a spoke in someone else's wheel." You have to configure that deliberately.
The fix is conceptually simple: designate Apple Health as the hub, assign exactly one write-source per data type, and treat everything else as a reader. Apple Health earns this role on iPhone because it's local-first, not monetized around your health data, and accepted as an input by all three platforms.
Step 1 — Audit and clean Apple Health before connecting anything
Before you change a single permission, find out how bad the current state is. Open Health → Browse → Workouts → Show All Data and look at the source column next to each entry. If you see the same workout date logged by two different sources — "Strava" and "Garmin Connect," for instance — you already have live duplicates. Fix those before adding more connections.
To see what currently writes to Health: Settings → Privacy & Security → Health → [App name]. Tap each app to see read vs. write permissions granularly. Work through every app in that list and assign it a mental role: writer or reader. One writer per data type, full stop.
Delete duplicate historical workouts manually: tap the entry, scroll to the bottom, hit Delete Workout. It's tedious. Expect 10–20 minutes of cleanup if you've been running this stack for more than a few months without managing permissions. There's no bulk-delete by source in Apple Health's native UI as of iOS 18.4 — third-party apps like Health Auto Export (free tier, iOS) can help you identify and batch-flag duplicates faster, but the actual deletion still happens one entry at a time in Apple Health.
I noticed during testing that Whoop's defaults are particularly aggressive on first connection. It requests write access to eight categories simultaneously, including Workouts and Active Energy, and the setup screen frames each toggle as a feature rather than a potential conflict. Turn those off before anything else.
Step 2 — Garmin Connect: your workout and VO2 Max source of truth
Garmin Connect should own workouts, active energy, VO2 Max estimates, GPS-based routes, steps, and standing time in Apple Health. Garmin's ecosystem is mature: as of firmware 18.20 on the Forerunner 965 (released March 2026), the Apple Health sync fires automatically within a few minutes of a completed workout sync over Wi-Fi — no manual export required.
Connecting Garmin to Apple Health
- Open Garmin Connect on iPhone.
- Tap the menu (top left) → Settings → Connected Apps → Apple Health.
- Enable write access for: Workouts, Heart Rate, VO2 Max, Active Energy, Steps, Distance.
- Disable write access for: Sleep (if Whoop is your primary sleep tracker) and Resting Heart Rate (if you want Whoop's continuous overnight measurement to own that metric).
That fourth point feels counterintuitive — disabling a Garmin write sounds like losing data. You're not. The data stays in Garmin Connect's own timeline in full detail. You're only preventing it from adding a second conflicting version to Apple Health's Resting Heart Rate or Sleep categories, where it would contradict Whoop's readings without either one being obviously correct.
Garmin's Strava connection lives separately
Garmin has a direct partner integration with Strava through Garmin Connect's Connected Apps menu. When active, every Garmin workout pushes directly to Strava via API — no Apple Health involvement at all. Keep this enabled. This is what lets Strava display your full GPS route and pace data. The critical implication: because Strava receives workout data directly from Garmin, there's no reason for Strava to also write those workouts back to Apple Health. That's exactly where the duplicate originates.
For athletes also running an Oura ring alongside this three-app stack, the complexity compounds further — the detailed guide to syncing Garmin, Oura, and Whoop into a single Apple Health view covers how to handle three simultaneous HRV sources without data collisions.
Step 3 — Whoop: recovery writes only, workout writes off
Whoop 4.0 excels at recovery metrics: HRV measured as continuous RMSSD, resting heart rate, respiratory rate, and sleep staging with high temporal resolution. It is not a GPS workout recorder. That distinction is everything when it comes to Apple Health configuration.
What Whoop should and shouldn't write
| Data Type | Write to Apple Health | Reason |
|---|---|---|
| HRV (RMSSD) | ✅ Yes | Whoop's overnight sampling is more granular than Garmin's spot-check |
| Resting Heart Rate | ✅ Yes | Continuous overnight measurement, more accurate than wrist optical in motion |
| Sleep Stages | ✅ Yes | Disable Garmin sleep write if you enable this |
| Respiratory Rate | ✅ Yes | Garmin doesn't reliably track this |
| Workouts / Strain Events | ❌ No | Conflicts with Garmin GPS workout records |
| Active Energy | ❌ No | Garmin's GPS-based calculation is more accurate for outdoor sports |
Configuring Whoop permissions
In the Whoop app (version 8.12.0 on iOS): Profile → App Integrations → Apple Health → Manage. Toggle off "Workouts" and "Active Energy" immediately. Toggle on HRV, Resting Heart Rate, Respiratory Rate, Sleep, and Oxygen Saturation.
Whoop's strain detection is genuinely impressive for flagging effort across a full day — it catches elevated cardiovascular load from a stressful meeting or heat exposure that Garmin completely misses. But its workout boundary detection doesn't align precisely with GPS segment starts and stops, so the "workout" it logs is rarely the same start-time, end-time, or calorie total as the Garmin record of the same session. You don't want both sitting in Apple Health's Workouts category.
If the $239/year Whoop membership cost is also up for reconsideration, there's a solid analysis of free tools that replicate Whoop's core Apple Health data outputs worth reading before renewal time.
Step 4 — Strava: connect it as a reader, not a writer
Here's the counterintuitive part of this setup: Strava should not write to Apple Health. It should read from it.
Strava's Apple Health integration offers write access to Workouts. If Garmin is already writing workouts to Apple Health and Garmin is pushing those same workouts directly to Strava via the partner integration, then enabling Strava → Apple Health write access creates a clean duplicate. Every activity arrives in Apple Health twice: once from Garmin, once from Strava importing the same Garmin session.
The correct Strava configuration
- Open Strava → You → Settings → Apps, Features & Devices.
- Under Health, tap Connect (or manage if already connected).
- Disable: Write access to Workouts, Active Energy, Distance.
- Enable: Read access to weight and body measurements if you log those in Health and want them visible in Strava's dashboard.
Strava should remain fully enabled for everything else — its segment analysis, route mapping, social feed, and relative effort scoring are all genuinely useful and don't involve Apple Health writes. The goal is specifically to prevent it from acting as a second workout-writing source to HealthKit.
For a broader look at which paid Strava features are worth keeping in a multi-app stack, the breakdown of free health tracking tiers you can safely drop covers the subscription math in detail.
Data ownership map and troubleshooting common breaks
After the four steps above, here's the target permission state. Use this table as a reference whenever you add a new fitness app to the stack.
| Data Type | Garmin Connect | Whoop | Strava | Notes |
|---|---|---|---|---|
| GPS Workouts | ✅ Write | ❌ Off | ❌ Off | One source only |
| Active Energy | ✅ Write | ❌ Off | ❌ Off | GPS more accurate |
| VO2 Max | ✅ Write | ❌ N/A | ❌ N/A | Garmin-only metric |
| Steps / Distance | ✅ Write | ❌ Off | ❌ Off | |
| HRV (RMSSD) | ❌ Off | ✅ Write | ❌ N/A | Whoop more granular |
| Resting Heart Rate | ❌ Off | ✅ Write | ❌ N/A | Overnight measurement |
| Sleep Stages | Optional* | ✅ Write | ❌ N/A | *Only if not wearing Whoop overnight |
| Respiratory Rate | ❌ Off | ✅ Write | ❌ N/A | |
| Routes / Activity Feed | Reads | Reads | Receives from Garmin directly | Strava gets data via partner API |
*The "Optional" for Garmin sleep is real: if you regularly sleep without your Whoop strap — common in summer, or when traveling without charging bandwidth — enable Garmin's sleep write temporarily. Just not both simultaneously. Apple Health averages certain category readings and sums others, and either outcome is inaccurate when the data represents the same night from two devices.
Three breaks that come up after clean setup:
Syncs that stop firing. Both Garmin Connect and Whoop require background app refresh to push to Apple Health. After major iOS updates, check Settings → General → Background App Refresh and ensure both apps are listed and enabled.
Whoop and Garmin sleep records colliding. Symptom: Apple Health's "Time in Bed" reads longer than either device actually recorded. Cause: both apps are writing sleep data simultaneously. Fix: revisit Step 3 and disable Garmin sleep writes.
Post-workout data not appearing in Apple Health. Almost always a Garmin sync delay, not a permissions issue. Check Garmin Connect → Profile → Connected Apps → Apple Health — the last sync timestamp is visible there. If it's stale, open the app and trigger a manual sync by pulling down on the activity feed.
The HRV duplicate scenario specifically — where multiple wearables write RMSSD readings from the same night — is one of the most common data quality problems in a multi-device stack. The piece on fixing HRV duplicates when three wearables all report to Apple Health goes deeper on the HealthKit behavior behind it.
Quick checklist — 8 steps to clean data
Work through these in order. Each step depends on the previous one being correct.
- Audit existing Health permissions: Settings → Privacy & Security → Health — list every app with write access to Workouts and Active Energy. Note them before changing anything.
- Delete historical duplicates: Health → Browse → Workouts → Show All Data, identify entries where two sources logged the same session on the same date, delete the non-primary source's entry.
- Configure Garmin Connect: enable Write for Workouts, Active Energy, VO2 Max, Steps, Heart Rate. Disable Write for Sleep and Resting Heart Rate (unless Whoop is not your overnight tracker).
- Configure Whoop: disable Write for Workouts and Active Energy. Enable Write for HRV, Resting Heart Rate, Respiratory Rate, Sleep, and SpO2.
- Configure Strava: disable all Write access to Apple Health. Confirm the Garmin → Strava partner connection is active in Garmin Connect → Settings → Connected Apps → Strava.
- Test with one workout: record an activity on your Garmin, let it sync over Wi-Fi, open Apple Health and confirm the workout appears exactly once with Garmin Connect as the source.
- Check Background App Refresh for both Garmin Connect and Whoop: Settings → General → Background App Refresh.
- Set a calendar reminder for three months out to re-audit permissions — both Garmin Connect and Whoop have reset write permissions after major app updates in the past, and it's easier to catch this early than to untangle months of duplicate data later.
Sources & further reading
- Apple Support (support.apple.com) — Official documentation on managing Health app data sources and permissions in iOS 18; explains how HealthKit handles multiple simultaneous write sources and how to view per-source data history.
- Garmin Support Center (support.garmin.com) — Device-specific guides for Garmin Connect's Apple Health and Strava partner integrations; includes firmware-version context for Forerunner, Fenix, and Venu series.
- Whoop Help Center (support.whoop.com) — Covers the Apple Health integration toggles available in Whoop app version 8.x, including which categories each permission controls and what happens when Whoop detects a strain event vs. a manually logged workout.
- Strava Support (support.strava.com) — Documentation on Strava's Health app connection settings and the Garmin direct-partner integration; explains why activities can appear from multiple pathways and how to manage that.
- EFF (Electronic Frontier Foundation) — Background on what granting third-party fitness apps write access to HealthKit actually means from a privacy standpoint; useful context if you're deciding how many integrations to enable on a platform that aggregates personal biometric data.