Privacy Risks of Fitness Trackers and Wearables
A fitness tracker knows your resting heart rate, sleep patterns, menstrual cycle, stress levels, activity at 3am, and location throughout the day. This data is more revealing than most people realize. health insurers, employers, and data brokers have significant financial interest in it. This guide covers what each device collects, who accesses it, and what you can actually do.
Table of Contents
- What Fitness Trackers Collect
- Company Data Practices
- Third-Party App Data Sharing
- Insurance and Employer Risks
- Practical Privacy Steps
- Data Your Device Reveals Even Without Apps
- Related Reading
- Analyzing Your Own Wearable Data
- Building a Personal Metrics Server
- Threat Model - De-anonymization Vectors
- GDPR and Legal Rights
- Alternative - Open Source Fitness Tracking
- Regulatory Compliance - Healthcare Context
What Fitness Trackers Collect
Continuous Biometric Data
Modern wearables generate a continuous stream:
- Heart rate: Resting, active, elevated, bradycardia/tachycardia events
- Heart rate variability (HRV): Correlates with stress and recovery state
- SpO2: Blood oxygen saturation
- Sleep patterns: Duration, stages (light/deep/REM), interruptions, estimated breathing
- Skin temperature: Baseline and deviations
- Menstrual cycle tracking: Cycle dates, flow, symptoms, ovulation predictions
- GPS location: Route history, visited locations, patterns
- Activity data: Steps, distance, exercise type, calories
This isn’t generic health data. it’s a precise physiological record that can reveal pregnancy, illness, mental health state, and addiction patterns.
Company Data Practices
Google/Fitbit
Google acquired Fitbit in 2021. Google has committed to not using Fitbit health data for ad targeting. this commitment runs until 2026 by regulatory requirement. What happens after is not specified.
What Google/Fitbit stores:
- Full sensor history
- Sleep logs
- GPS routes
- Connected apps data
- Google account tied to all of it
Access - US users are subject to CLOUD Act requests. Google received 89,000 government data requests in 2022 (combined across products).
Garmin
Garmin had a major ransomware attack in 2020 that exposed the fragility of centralized fitness data. Garmin stores full activity and health data on their servers.
Garmin Connect data export - You can download a full archive, which reveals the extent of stored data:
Request data export - Garmin Connect → Account → Data Export
Export includes - activities, health stats, body composition, sleep logs
Format - FIT files (GPS + biometrics), CSV (daily stats), JSON (health data)
Parse FIT files to inspect GPS routes
pip install fitparse
python3 - << 'EOF'
import fitparse
fitfile = fitparse.FitFile("activity.fit")
for record in fitfile.get_messages('record'):
data = {d.name: d.value for d in record}
lat = data.get('position_lat')
lon = data.get('position_long')
if lat and lon:
# FIT format uses semicircles. convert to degrees
lat_deg = lat * (180 / 231)
lon_deg = lon * (180 / 231)
print(f" {lat_deg:.6f}, {lon_deg:.6f}")
EOF
Apple Watch
Apple’s privacy posture is meaningfully better than Fitbit/Garmin. Health data is stored in the Health app on-device, encrypted with your iPhone’s lock code.
iCloud backup: If iCloud Health backup is enabled WITHOUT Advanced Data Protection, Apple holds the keys and could technically access health data. With ADP enabled, end-to-end encryption means Apple cannot read it.
Settings → [Your Name] → iCloud → Health:
- Enabled: data syncs to iCloud (Apple holds keys by default)
- Disabled: data stays on device only
Settings → [Your Name] → iCloud → Advanced Data Protection:
- Enabled: iCloud Health data is E2EE (Apple can't access)
Apple does share data with third-party apps you authorize (e.g., MyFitnessPal, Strava). review what you’ve granted.
Oura Ring
Oura charges a subscription ($5.99/month) and stores ring data on their servers. The data includes sleep stages, HRV, readiness score, and SpO2.
Oura’s privacy policy allows data sharing with “research partners”. though with de-identified data. Oura also worked with the NBA and employers during COVID to use ring data for health monitoring. raising concerns about employer access to health data.
Third-Party App Data Sharing
The wearable itself is just the start. Every app you connect to your fitness platform gets access to your data:
Check what apps have access to Fitbit data
Fitbit app → Account → Apps → Connected Apps
Revoke anything you don't actively use
Apple Health connected apps
Health app → Sharing tab → see all apps with access
Tap each → turn off categories you don't want to share
Google Fit connected apps
myaccount.google.com → Third-party apps with account access
Apps commonly connected to fitness data:
- Insurance apps (Vitality, John Hancock). may affect premiums
- Employer wellness programs. explicitly designed for employer access
- MyFitnessPal, Strava, Calm. sold user data historically
- Fertility apps. extremely sensitive; many had data breach incidents
Insurance and Employer Risks
Health insurance - Some health insurers (primarily in the US) offer premium discounts for fitness tracker use. The trade-off: they get access to your activity data. Discounts of $100-300/year in exchange for continuous health monitoring.
Life insurance - John Hancock’s Vitality program uses Apple Watch data to adjust life insurance premiums dynamically. More steps = lower premium, potentially. But the insurer also knows when you stop exercising or your HRV drops.
Employer wellness programs - Programs like Virgin Pulse, Limeade, and Wellable pay employees to wear trackers. The employer or their vendor receives aggregated (and sometimes individual) health data.
Practical guidance:
- Never connect your personal wearable to an employer wellness program
unless you've read their full privacy policy
- If required, use a separate cheap device for the wellness program
- Never connect your main health data to insurance without understanding
exactly what data is shared and for how long
Practical Privacy Steps
Minimize Data Collection
Fitbit/Google:
- Disable "Move IQ" (automatic activity detection) if not needed
- Disable GPS tracking for walks if route privacy matters
- Turn off menstrual health tracking if not using it
- Auto-delete data: Fitbit doesn't have this; manually delete old activity
Apple Watch:
- Health → Browse → turn off categories you don't want tracked
- Location: Settings → Privacy → Location Services → each fitness app → When Using
Garmin:
- Garmin Connect → Account → Privacy Settings → Activity sharing: Off
- Disable: Insights, Garmin Health Reports
- Limit connected apps aggressively
Use a Dumb Device for Specific Tracking
A Fitbit Inspire or a basic pedometer tracks steps without GPS, heart rate, or cloud connectivity. Gives you basic step counts without the biometric profile.
Export and Delete
Regularly export and delete your data
Fitbit - Account → Data Export → request archive
After downloading - Settings → Clear User Data
Garmin - Account → Data Management → Delete Account (nuclear option)
Or: selectively delete individual activities
Apple Health export (for backup before changing phones)
Health → Profile → Export All Health Data
Local-Only Fitness Tracking
For maximum control:
Running/cycling GPS tracking without cloud: use OSMand or OsmAnd~ (F-Droid)
Data stays on device, exported as GPX
No account required
Heart rate monitoring without cloud: Polar devices have local storage
Connect to computer via USB → download FIT files → no cloud needed
Sleep tracking without cloud:
SleepAsAndroid with local storage (no account mode)
Settings → Cloud & Premium → disable all cloud features
Data Your Device Reveals Even Without Apps
A fitness tracker with GPS that you carry everywhere creates a location history:
Where you live (home location, most common overnight GPS point)
Where you work (regular 9-5 GPS location on weekdays)
Medical appointments (cluster of visits to clinic address)
Religion/political activity (location on weekend mornings = church; protests)
Relationship status (second location you regularly sleep at)
This is the pattern-of-life analysis used by intelligence agencies. and available to any party that gets access to your fitness data. A subpoena for Fitbit records has been used in US criminal cases to establish alibis and disprove them.
Related Articles
- Privacy Risks of Fitness Trackers and Health Data 2026
- Privacy Risks of Fitness Apps and Health Data Sharing in
- Privacy-Focused Fitness Trackers Comparison 2026
- Mobile Fitness Tracker Privacy
- Privacy Risks of Period Tracking Apps 2026
- AI Coding Assistant Session Data Lifecycle Analyzing Your Own Wearable Data
If you’ve exported your fitness data, analyze what was actually collected:
#!/usr/bin/env python3
analyze-fitness-export.py
import fitparse
import json
from pathlib import Path
from datetime import datetime
def analyze_fitbit_export(export_dir):
"""Analyze Fitbit data export for privacy implications"""
data_profile = {
'location_data': [],
'sleep_patterns': [],
'heart_rate_anomalies': [],
'activity_patterns': []
}
# Check for GPS tracks in device data
fit_files = Path(export_dir).glob('*.fit')
for fit_file in fit_files:
fitfile = fitparse.FitFile(str(fit_file))
for record in fitfile.get_messages('record'):
data = {d.name: d.value for d in record}
# Extract location if present
if 'position_lat' in data and 'position_long' in data:
lat = data['position_lat'] * (180 / 231)
lon = data['position_long'] * (180 / 231)
data_profile['location_data'].append({
'timestamp': data.get('timestamp'),
'lat': lat,
'lon': lon
})
# Detect anomalous heart rate (potential health events)
if 'heart_rate' in data:
hr = data['heart_rate']
if hr > 120 or hr < 50: # Unusual rates
data_profile['heart_rate_anomalies'].append({
'timestamp': data.get('timestamp'),
'heart_rate': hr
})
# Analyze sleep patterns (can reveal schedules)
sessions = Path(export_dir).glob('sleep_*.json')
for session in sessions:
with open(session) as f:
sleep_data = json.load(f)
data_profile['sleep_patterns'].append({
'start_time': sleep_data.get('startTime'),
'duration_minutes': sleep_data.get('duration'),
'stages': sleep_data.get('stages')
})
return data_profile
Example usage
export = analyze_fitbit_export('/path/to/fitbit/export')
print(f"Location entries: {len(export['location_data'])}")
print(f"Sleep entries: {len(export['sleep_patterns'])}")
print(f"Heart rate anomalies: {len(export['heart_rate_anomalies'])}")
Privacy risk assessment
if export['location_data']:
print("\nWARNING: GPS location data stored! Can identify:")
print(" - Your home address (location with longest duration)")
print(" - Your workplace (weekday location patterns)")
print(" - Medical facilities (clusters at specific addresses)")
This analysis reveals the extent of data collection you might not have realized.
Building a Personal Metrics Server
For users wanting fitness tracking without cloud dependency:
personal-metrics-server.py
from flask import Flask, request, jsonify
import json
from datetime import datetime
from pathlib import Path
app = Flask(__name__)
DATA_DIR = Path.home() / '.local/share/personal-metrics'
DATA_DIR.mkdir(parents=True, exist_ok=True)
@app.route('/api/heart-rate', methods=['POST'])
def record_heart_rate():
"""Record heart rate measurement (from local device/watch)"""
data = request.json
record = {
'timestamp': datetime.now().isoformat(),
'heart_rate': data.get('bpm'),
'activity': data.get('activity', 'rest')
}
# Append to local JSON file
metrics_file = DATA_DIR / f"heart_rate_{datetime.now().strftime('%Y%m')}.json"
with open(metrics_file, 'a') as f:
f.write(json.dumps(record) + '\n')
return jsonify({'status': 'recorded'})
@app.route('/api/steps', methods=['POST'])
def record_steps():
"""Record step count"""
data = request.json
record = {
'timestamp': datetime.now().isoformat(),
'steps': data.get('count'),
'distance_m': data.get('distance')
}
metrics_file = DATA_DIR / f"steps_{datetime.now().strftime('%Y%m')}.json"
with open(metrics_file, 'a') as f:
f.write(json.dumps(record) + '\n')
return jsonify({'status': 'recorded'})
@app.route('/api/sleep', methods=['POST'])
def record_sleep():
"""Record sleep data"""
data = request.json
record = {
'date': datetime.now().strftime('%Y-%m-%d'),
'duration_minutes': data.get('duration'),
'quality': data.get('quality'),
'notes': data.get('notes')
}
metrics_file = DATA_DIR / 'sleep.json'
if metrics_file.exists():
with open(metrics_file) as f:
all_sleep = json.load(f)
else:
all_sleep = []
all_sleep.append(record)
with open(metrics_file, 'w') as f:
json.dump(all_sleep, f, indent=2)
return jsonify({'status': 'recorded'})
@app.route('/api/summary', methods=['GET'])
def get_summary():
"""Generate local privacy-only summary"""
period = request.args.get('period', '30') # days
# Calculate averages from local data only
summary = {
'period_days': int(period),
'avg_heart_rate': 0,
'total_steps': 0,
'avg_sleep_minutes': 0
}
# Read and aggregate data...
return jsonify(summary)
if __name__ == '__main__':
# Run only on localhost, no external access
app.run(host='127.0.0.1', port=5000, ssl_context='adhoc')
This server runs locally and stores all metrics on your machine.
Threat Model - De-anonymization Vectors
Fitness data can be combined with other information to identify you:
| Data Point | Risk | Combination Risks |
|---|---|---|
| Sleep schedule | Medium | + Location = home address |
| Exercise location | High | + Time = daily routine pattern |
| Heart rate anomalies | High | + Medical records = diagnosis |
| Menstrual cycle | Critical | + Insurance = discrimination |
| Step patterns | Medium | + Gait analysis = biometric ID |
| Weight trends | Medium | + Timeline = health events |
Wearables create a permanent biometric profile that can be weaponized in multiple ways.
GDPR and Legal Rights
Users in the EU have specific rights regarding fitness data:
#!/bin/bash
Request your wearable data under GDPR
WEARABLE="fitbit" # fitbit, garmin, apple, oura, etc.
1. Request data export
echo "Submitting GDPR Data Request to $WEARABLE..."
Use the company's official data request form (usually at privacy@company or similar)
Most companies have online GDPR request portals
2. Verify what they send is complete
echo "Things to check in received data:"
echo " - All heart rate records"
echo " - All GPS locations"
echo " - All sleep data"
echo " - Third-party app integrations"
echo " - Server-side notes/analysis"
3. Request deletion
echo "After reviewing, request permanent deletion if desired"
4. File complaint if they refuse
echo "If they refuse without valid reason, file complaint at:"
echo " - Local data protection authority"
echo " - In EU: ico.org.uk or equivalent national authority"
In the EU, you have the right to download all your data, and the right to be forgotten (deletion) under specific circumstances.
Alternative - Open Source Fitness Tracking
Use tools that respect privacy by design:
OpenTracks - Android-only, local storage, no cloud
https://github.com/OpenTracksApp/OpenTracks
Installation
git clone https://github.com/OpenTracksApp/OpenTracks.git
cd OpenTracks
./gradlew assembleDebug
Install APK
adb install app/build/outputs/apk/debug/OpenTracks-debug.apk
Open source allows you to verify the code doesn’t transmit your data.
Regulatory Compliance - Healthcare Context
Organizations handling fitness data in healthcare contexts must ensure compliance:
Privacy Compliance Checklist for Fitness Data Integration
security:
encryption:
at_rest: "AES-256 minimum"
in_transit: "TLS 1.3 mandatory"
access_control:
mfa: "Required for all data access"
audit_logging: "All access logged"
data_retention:
fitness_data: "Delete after 12 months"
audit_logs: "Retain 7 years"
compliance:
frameworks:
- HIPAA (if in US healthcare context)
- GDPR (if users in EU)
- CCPA (if users in California)
user_rights:
data_portability: "Provide in standard formats"
right_to_be_forgotten: "Delete within 30 days"
transparency: "Clear privacy policy"
Built by theluckystrike. More at zovo.one