HealthSave Get on App Store

Apple Health for Cyclists: Own Your Ride Data, Workouts, FTP, Power, HealthSave

Riding with an Apple Watch and a power meter means your watch has all the numbers. Apple Health on the iPhone stores the data; HealthSave gets it out. The hard part is not the export, it is choosing a destination that fits the question you actually have. This page is for cyclists who already ride with Apple Watch (and, optionally, a paired power meter or cadence sensor) and want their data in a place they control: a spreadsheet, an Obsidian daily note, an AI assistant, a homelab dashboard, or a tool their coach already uses.

What Apple Health gives cyclists, exactly

The iPhone and Apple Watch write a specific, well-defined set of metrics to Apple Health. Anything in this table is what HealthSave can export. The identifier in the second column is the exact string that appears in your JSON file (in metric) and in your CSV header.

What you want to look atIdentifier HealthSave exportsUnitWhere it lives in Apple Health
Cycling distancedistance_cyclingmCycling workouts (when workout recorded distance)
Cycling speedcycling_speedm/sCycling (paired speed sensor / GPS)
Cycling powercycling_powerWCycling (paired power meter)
Cycling cadencecycling_cadencecount/minCycling (paired cadence sensor)
Cycling functional threshold powercycling_functional_threshold_powerWCycling (Apple Watch, when recorded)
Workout durationworkout_durationminWorkouts (per session)
Workout caloriesworkout_calorieskcalWorkouts (when workout recorded energy)
Workout distanceworkout_distancemWorkouts (when workout recorded distance)
Active energy burnedactive_energy_burnedkcalActivity
Resting heart rateresting_heart_ratecount/minHeart
Heart rate variability (SDNN)heart_rate_variabilitymsHeart
Heart rate recovery (1 min)heart_rate_recoverycount/minHeart
VO2 maxvo2_maxml/kg·minHeart

One ride in Apple Health produces up to three rows in the JSON export: one for duration (in minutes), one for calories (when the watch recorded energy), and one for distance (when the workout had a measurable distance). The workout type rides along inside the source field, formatted as "<device> (<type>)" — for example "Apple Watch (Cycling)" or "Zwift (Cycling)" when a training app logged the ride. HealthKit files every ride — road, trainer, mountain bike — under the same Cycling type, so the app name in front of the parenthetical is how you tell a trainer session from a road ride. If a power meter or cadence sensor wrote to Apple Health during the ride, those samples appear as separate rows under their own identifiers (cycling_power in W, cycling_cadence in count/min). The full per-metric catalog is at /metrics/, the schema reference is at Apple Health export to JSON.

Pick the destination that matches the question

The export format follows the destination. Most cycling setups fall into one of five families:

What you want to do with your ride dataBest destinationFormat HealthSave producesBest guide to start with
Compare training blocks side by side, pivot by weekSpreadsheet (Numbers / Excel / Sheets)CSV, one row per metric readingAnalyze Apple Health data in Excel
Keep a daily training log next to your numbersObsidian (markdown, Dataview, Bases)JSON, one short script converts itApple Health to Obsidian
Ask plain-English questions, no scriptingAI assistant (ChatGPT, Claude, local LLM)JSON uploaded or pastedAnalyze Apple Health with AI
Live power / HR on a wall displayGrafana or a personal dashboardJSON or CSV into a databasePersonal health dashboard
Coach / training partner gets a clean fileTheir import script, or a CSV per rideCSV (machine import)Apple Health data in Excel
Self-hosted archive, query the season yourselfPostgres, DuckDB, Home AssistantJSON batches over HTTPSApple Health for self-hosters

None of these are mutually exclusive. The same JSON file goes into Obsidian, an AI assistant, and a Postgres database at the same time; you do not have to choose. The point is to pick the destination that matches the question you are actually trying to answer this season.

Three sample journeys

The FTP-builder in a sweet-spot block

Question: how is average power per ride trending across a 6-week sweet-spot block, and where in the block did FTP estimate move?

Setup: HealthSave Pro exports JSON for the last 90 days, scoped to workouts, cycling power, and heart rate. A short script pivots the workout rows into one row per ride (duration, calories, distance, average power, normalized power when both power and HR are present), and joins each ride to resting HR the morning after. The user opens the spreadsheet once a week and looks at three things: average power across the block, normalized power across the block, and how resting HR recovered week to week. No dashboard required; the spreadsheet is the dashboard.

What made it work: a narrow scope (three metrics, 90 days), a real cadence (weekly), and a destination that supports pivot tables.

The indoor-trainer consistency check

Question: how often am I actually doing the prescribed indoor sessions, and how is the trend holding up across the off-season?

Setup: HealthSave Pro exports JSON for the last 180 days, scoped to workouts and cycling power. The user pastes the file into Claude once a month and asks: "how many indoor cycling workouts per week, what is the average duration, and how does average power compare across the last four weeks?" Claude reads the trainer sessions off the source column (the training app's name marks them) and returns a plain-English read with the dates and the medians. The user pastes the answer into their Obsidian training log under the weekly note.

What made it work: a long enough window to see the off-season arc, a destination that can do the math, and a one-shot question instead of a dashboard.

The HRV-aware base builder

Question: which days this month should I have taken easy, and which days did I actually go hard?

Setup: HealthSave Pro exports JSON for the last 365 days, scoped to HRV, resting heart rate, workouts, and cycling power. The user wires HealthSave background sync to a small DuckDB on their Mac, then runs a weekly query that joins HRV (morning of) with the workout's average power (workout that day) and surfaces the days where HRV was low but power was high. Those are the "should have gone easy" days. A Grafana chart on the wall shows the weekly training-load pattern.

What made it work: a private database the user controls, a join that no app dashboard ships, and a destination that scales to a year of data without paying a subscription.

The principle behind all three

Cycling analytics is not "collect every metric and look at it later." It is "decide the question, pick the slice that answers it, put it somewhere you will actually look at it, and review on a cadence." Everything else is implementation.

The export is the cheap part. The discipline of looking at the numbers on a real schedule, and adjusting the training block when the answer is uninteresting, is the practice.

What HealthSave is and is not in this picture

The architecture in one diagram

iPhone + Apple Watch + power meter (Apple Health)
      │
      │  read-only HealthKit access
      ▼
   HealthSave (on-device, no cloud)
      │
      │  JSON / CSV / PDF (iOS share sheet)
      ▼
   your destination
      ├─ Numbers / Excel / Sheets  (one row per reading)
      ├─ Obsidian vault             (one markdown file per metric per year)
      ├─ ChatGPT / Claude / local LLM
      ├─ your Postgres or DuckDB
      ├─ Grafana on a wall display
      └─ a CSV handed to a coach or training partner

Every arrow ends at a destination you control. The destination decides what the data looks like next.

Honest limits

Choosing your first destination

If you already script on your Mac, start with the DuckDB guide — it is the lowest-friction private archive and scales to years. If you already keep a training log in Obsidian, start with the Obsidian guide. If you want plain-English answers without setting up anything, paste a 7-day JSON into ChatGPT or Claude and ask one real question — the AI guide has the prompts. If you already run a homelab, start with the self-hosted path. If you have a coach who takes a CSV, the Excel guide has the cleanest pivot. The right starting point is the one that matches a tool you already use.

HealthSave is not a medical device. It is for informational purposes only and does not diagnose, treat, cure, or prevent any disease or condition. Privacy claims of zero data collection apply to the iOS app; if you choose to send data to a self-hosted destination, that destination is yours to operate. Training decisions are yours; use a coach when the question matters.

FAQ

What cycling data does Apple Health record?

Apple Health, written by the iPhone and Apple Watch (and any power meter or cadence sensor the watch picks up), records every ride you save under a single Cycling workout type (road rides, trainer sessions, mountain-bike rides, and rides logged by training apps), plus cycling-specific dynamics where the watch has paired cycling sensors (cycling speed, cycling power, cycling cadence, and functional threshold power), plus the same resting and recovery metrics as any other activity (resting heart rate, HRV (SDNN), walking heart rate average, one-minute heart rate recovery, and VO2 max). The per-metric catalog documents each identifier.

Where can I see my Apple Watch cycling power trend?

Apple Health stores cycling power under the identifier cycling_power with unit W, only when a paired power meter is on the ride and writes to Apple Health. The Health app shows the workout summary on your phone, but the per-ride power samples stay in Apple Health. To get the series into your own charts, export the cycling_power metric as JSON or CSV with HealthSave. The metric catalog documents the identifier.

Does Apple Health export a 'ride' file or a single workouts file?

Neither. Apple Health exports one giant XML file containing every metric ever recorded, including workouts. That file is hard to parse and not human-readable. HealthSave turns it into one JSON file with one row per sample, including one row per ride's duration, calories, and distance (one ride becomes up to three rows), with the workout type riding along in the source field (always Cycling for rides — HealthKit has no separate indoor or mountain-bike type).

How do I export my rides to a spreadsheet?

In HealthSave, pick the workouts slice, choose CSV, and pick the date range. Each row in the spreadsheet is one metric reading at one time, including workout_duration in min, workout_calories in kcal, and workout_distance in m, with the workout type in the source column. If you rode with a power meter, you will also see cycling_power in W and cycling_cadence in count/min in the same file. Open it in Numbers, Excel, or Sheets, pivot by source to get a per-ride summary, or chart average power against date.

Can I export Apple Health cycling data to a custom API or a homelab?

Yes. HealthSave Pro unlocks background sync over HTTPS, where every export sample is POSTed to an endpoint you own. The webhook guide and the custom REST API guide show the API contract; the self-hosters hub shows the full Grafana / Home Assistant / Postgres pipeline.

Can I export my rides to Strava, Garmin Connect, or a coach's tool?

HealthSave writes generic data files (CSV and JSON), not the GPX/TCX/FIT activity files that Strava and Garmin Connect import. For Strava, use a workout-export app that writes those formats; HealthSave is the archive-and-analysis side. For a coach or a tool that eats a spreadsheet, the CSV is clean: up to three rows per ride (duration, calories, distance), plus cycling_power / cycling_cadence if a power meter wrote to Apple Health, with the workout type in the source column.

Is the cycling data accurate enough to plan training off?

It depends on the sensor. Apple Watch GPS has typical distance drift of a few percent on open roads and more in urban canyons; on-bike power meters (when paired to the watch) are usually within 1-2% of a crank-based meter and are the most reliable part of the dataset. Heart rate from the watch is within a few percent during steady riding. HealthSave moves whatever your device recorded; it does not validate it. Use the trend, not the absolute number.

Do I need HealthSave Pro for cycling analytics?

For the last 7 days, no. JSON and CSV export of the most recent week is free, no account. For the multi-year archive that lets a single training block sit next to last season's, Pro is the unlock: a one-time $24.99 with Family Sharing, no subscription. The free tier is enough to start; Pro is what makes season-level trend work possible.

Related guides

Get HealthSave

Free to download, no account. Try the JSON export on a single 7-day window, paste it into the AI of your choice, and ask one real cycling question. That is the cheapest possible start.

Download HealthSave on the App Store


HealthSave: Export Health Data, on iPhoneGet on the App Store