---
title: "Fitbit to Google Health API Metric Mapping Guide"
canonical: "https://help.validic.com/space/VCS/5436080132/Fitbit%20to%20Google%20Health%20API%20Metric%20Mapping%20Guide"
format: markdown
---
# Fitbit to Google Health API: Resource and Metric Mapping Guide > Macro (anchor)



**Last Updated:** June 6, 2026 **Audience:** Client Technical Teams **Source Type Change:** `fitbit` → `google_health` 

**Contents: **

> Macro (toc)

**Last Updated:** June 6, 2026

---

## How to Read This Guide

This document maps every Validic resource and metric between the current Fitbit integration and the upcoming Google Health integration. Use it to understand what's changing, what's staying the same, and what to watch out for during your migration.

### Status Indicators

| **Icon** | **Meaning** |
| --- | --- |
| ✅ | **Supported in both:** Supported in Fitbit and Google Health API (data is exactly the same) |
| 🆕 | **New in Google Health API**: Not available in the Fitbit integration, but available in the Inform Google Health API integration |
| 🚧 | **Coming later**: On the roadmap but not currently available in the Inform Google Health API integration |
| ❌ | **Dropping off**: Available in Fitbit today, but not in Google Health API (and there’s currently no indication from Google that it is coming) |
| ⚠️ | **Changed**: Supported in both, but something is different (see Notes column) |

### Terminology

- **Resource**: A Validic standard object type (Summary, Workout, Sleep, Measurement, Nutrition)
- **Metric**: A specific data point within a resource (e.g., `steps`, `body_weight`, `sleep_duration`)
- **Origin**: How the data was captured: `device` (from a sensor/wearable), `manual` (user-entered), or `unknown`

---

## Resource Overview

| **Inform Resource** | **Availability in Google Health API** | **Notes** |
| --- | --- | --- |
| **[Summary](#Summary)** | ⚠️ | Some metrics restructured; loses `basal_energy_burned`; new metrics added like `intensity_minutes_count` |
| **[Workout](#Workout)** | ⚠️ | Fewer exercise type categories; new metrics like `intensity_minutes_count`, `avg_pace` and `vo2_max` added |
| **[Sleep](#Sleep)** | ⚠️ | Adds nap classification |
| **[Measurement](#Measurement)** | ⚠️ | Loses `bmi` and `body_temperature`; |
| **[Intraday](#Intraday)** | ⚠️ | `avg_spo2` and `elevation` are not supported |
| **[Nutrition](#Nutrition)** | ✅ | Reports daily nutrient summary, food break-down, and hydration log |

[[ Back to top ]](#top)

---

## Summary

Daily activity summaries. Source type changes from `fitbit` to `google_health`.

| **Inform Metric** | **Availability in Google Health API** | **Notes** |
| --- | --- | --- |
| `steps` | ✅ |  |
| `distance` | ✅ |  |
| `floors_climbed` | ✅ |  |
| `elevation` | ✅ |  |
| `energy_burned` | ✅ |  |
| `active_energy_burned` | ✅ |  |
| `basal_energy_burned` | ❌ |  |
| `active_duration` | ✅ | Time in all activity levels expect “SEDENTARY” and “UNSPECIFIED” |
| `very_active_duration` | ✅ | Time in “VERY_ACTIVE” intervals |
| `fairly_active_duration` | ✅ | Time in “MODERATELY_ACTIVE” intervals |
| `lightly_active_duration` | ✅ | Time in “LIGHTLY_ACTIVE” intervals |
| `sedentary_duration` | 🆕 | Time in “SEDENTARY” intervals |
| `resting_heart_rate` | ✅ |  |
| `avg_heart_rate` | ✅ | Coming to Inform in July 2026 |
| `min_heart_rate` | ✅ | Coming to Inform in July 2026 |
| `max_heart_rate` | ✅ | Coming to Inform in July 2026 |
| `heart_rate_zone_very_low` | ❌ |  |
| `heart_rate_zone_low` | ✅ | Time in “LIGHT“ heart rate zone; zone boundaries may differ per user. |
| `heart_rate_zone_medium` | ✅ | Time in “MODERATE“ heart rate zone; zone boundaries may differ per user. |
| `heart_rate_zone_high` | ✅ | Time in “VIGOROUS“ heart rate zone; zone boundaries may differ per user. |
| `heart_rate_zone_very_high` | 🆕 | Time in “PEAK“ heart rate zone; zone boundaries may differ per user. |
| `intensity_minutes_count` | 🆕 | Total active zone minutes |
| `vo2_max` | 🆕 |  |
| `avg_spo2` | ❌ |  |
| `max_spo2` | ❌ |  |
| `min_spo2` | ❌ |  |
| `heart_rate_variability` | ❌ |  |
| `respiratory_rate` | ❌ |  |
| `body_temperature_deviation` | ❌ |  |

### Key Differences for Summary

1. **Calorie breakdown gone.** Fitbit splits calories into `active_energy_burned`, `basal_energy_burned`, and total `energy_burned`. Google Health API only provides `total-calories` as a single value.
2. **Health metrics are now reported in sleep.** SpO2, HRV, and skin temperature deviation are not currently reported on a daily basis anymore, but are included in Google Health API as part of sleep. See [Sleep](#Sleep) for more information.
3. **New metrics available.** `intensity_minutes_count`, `vo2_max` and `sedentary_duration` are new additions.
4. **Heart rate zones restructured.** Fitbit used HR zones: Out of Range, Fat Burn, Cardio, Peak. Google Health API uses a different model with potentially different zone boundaries: Light, Moderate, Vigorous, Peak.

[[ Back to top ]](#top)

---

## Workout

Individual exercise sessions. Source type changes from `fitbit` to `google_health`.

| **Inform Metric** | **Availability in Google Health API** | **Notes** |
| --- | --- | --- |
| `energy_burned` | ✅ |  |
| `distance` | ✅ |  |
| `steps` | ✅ |  |
| `avg_speed` | ✅ |  |
| `avg_pace` | 🆕 |  |
| `avg_heart_rate` | ✅ |  |
| `active_duration` | ✅ | Time in all activity levels expect “SEDENTARY” and “UNSPECIFIED” |
| `workout_duration` | ✅ |  |
| `elevation` | 🆕 |  |
| `vo2_max` | 🆕 | Only present on running exercises |
| `laps` | 🆕 | Only present on swimming exercises |
| `avg_cadence` | 🆕 | Only on advanced running exercises |
| `very_active_duration` | ✅ | Time in “VERY_ACTIVE” intervals |
| `fairly_active_duration` | ✅ | Time in “MODERATELY_ACTIVE” intervals |
| `lightly_active_duration` | ✅ | Time in “LIGHTLY_ACTIVE” intervals |
| `sedentary_duration` | 🆕 | Time in “SEDENTARY” intervals |
| `heart_rate_zone_very_low` | ❌ |  |
| `heart_rate_zone_low` | ✅ | Time in “LIGHT“ heart rate zone; zone boundaries may differ per user. |
| `heart_rate_zone_medium` | ✅ | Time in “MODERATE“ heart rate zone; zone boundaries may differ per user. |
| `heart_rate_zone_high` | ✅ | Time in “VIGOROUS“ heart rate zone; zone boundaries may differ per user. |
| `heart_rate_zone_very_high` | 🆕 | Time in “PEAK“ heart rate zone; zone boundaries may differ per user. |
| `intensity_minutes_count` | 🆕 | Total active zone minutes |

### Key Differences for Workout

1. **Fewer exercise type categories.** Fitbit mapped 100+ activity types to Validic categories. Google Health has only ~13 exercise types. So many specific activities in Google Health (Tennis, Golf, Rowing, Elliptical, etc.) collapse into `OTHER` or `WORKOUT` and map to Validic's `other` category. See [Workout Types and Category Mappings](https://help.validic.com/space/VCS/5435195394/Google+Health+API+Integration+for+Developers#Workout-Types-and-Category-Mapping).

[[ Back to top ]](#top)

---

## Sleep

Sleep sessions and nap records. Source type changes from `fitbit` to `google_health`.

| **Inform Metric** | **Availability in Google Health API** | **Notes** |
| --- | --- | --- |
| `sleep_duration` | ✅ | Only populated when record **is not** a nap |
| `nap_duration` | 🆕 | Only populated when record **is** a nap |
| `in_bed_duration` | ✅ |  |
| `awake_duration` | ✅ |  |
| `awake_count` | ✅ |  |
| `deep_sleep` | ✅ |  |
| `light_sleep` | ✅ |  |
| `rem_sleep` | ✅ |  |
| `time_to_fall_asleep` | ✅ |  |
| `sleep_score` | ❌ |  |
| `restless_count` | ❌ |  |
| `hrv_rmssd` | 🚧 (will be: 🆕) | main sleep only. Previously in Summary for Fitbit.<br>Completion date TBD |
| `avg_spo2` | 🚧 (will be: 🆕) | main sleep only. Previously in Summary for Fitbit.<br>Completion date TBD |
| `min_spo2` | 🚧 (will be: 🆕) | main sleep only. Previously in Summary for Fitbit.<br>Completion date TBD |
| `max_spo2` | 🚧 (will be: 🆕) | main sleep only. Previously in Summary for Fitbit.<br>Completion date TBD |
| `body_temperature_deviation` | 🚧 (will be: 🆕) | main sleep only. Previously in Summary for Fitbit.<br>Completion date TBD |

### Key Differences for Sleep

1. **Sleep classification system.** Google Health API classifies records as main sleep (`metadata.main: true`), nap (`metadata.nap: true`), or secondary sleep (both false). This affects the metrics that are reported in the sleep record.
2. **Health metrics move here from Summary.** HRV, SpO2, and skin temperature are now attached to the main `sleep` record instead of `summaries`. This is a structural change in where clients will find these metrics. These metrics will be added to Inform at a later date, TBD.
3. **Nap tracking with dedicated metric.** Google Health API introduces `nap_duration` as a separate metric from `sleep_duration`.

[[ Back to top ]](#top)

---

## Measurement

Body measurements (weight, body fat, etc.). Source type changes from `fitbit` to `google_health`.

| **Inform Metric** | **Availability in Google Health API** | **Notes** |
| --- | --- | --- |
| `body_weight` | ✅ |  |
| `body_fat` | ✅ |  |
| `bmi` | ❌ |  |
| `body_temperature` | ❌ | Sleep temperature deviations exist but are mapped to `sleep` rather than `measurements` |

### Key Differences for Measurement

1. **Separate records per data type.** Fitbit could return weight + body fat in a single response. Google Health requires separate API calls and produces separate Validic Measurement records for each metric.
2. **Last-write-wins behavior.** For weight and body fat, Google Health API returns only the most recent reading per day. Previous readings are overwritten, not appended.

[[ Back to top ]](#top)

---

## Intraday

High-frequency activity data.

| **Inform Metric** | **Availability in Google Health API** | **Notes** |
| --- | --- | --- |
| `steps` | ✅ | Reported on a per-minute interval (granularity: 1 min) |
| `avg_heart_rate` | ✅ | Reported on a per-minute interval (granularity: 1 min) |
| `distance` | ✅ | Reported on a per-minute interval (granularity: 1 min) |

### Key Differences for Intraday

1. **Separate records per data type.** Fitbit could return multiple metrics in a single response. Google Health requires separate API calls and produces separate Validic Intraday records for each metric.
2. **Fewer intraday metrics.** `elevation` and `avg_spo2` are not currently supported.

[[ Back to top ]](#top)

---

## Nutrition

Food logging, nutrition tracking, and hydration log.

| **Inform Metric** | **Availability in Google Health API** | **Notes** |
| --- | --- | --- |
| `energy_consumed` | ✅ |  |
| `carbohydrate` | ✅ |  |
| `fat` | ✅ |  |
| `dietary_fiber` | ✅ |  |
| `protein` | ✅ |  |
| `sodium` | ✅ |  |
| `water` | ✅ | Daily hydration log only. Does not include water as part of food items. |
| Meal segments | ✅ |  |
| Food items | ✅ | Includes only serving amount and unit. Does not include nutrient break-down per item. |

### Key Differences for Nutrition

1. **Food Items do not report nutrients. **The Google Health API reports only serving size and unit for individual food items.

[[ Back to top ]](#top)

---

## Behavioral Differences

Beyond the metric-level changes above, there are several behavioral differences that affect how data flows.

### Authentication

| **Aspect** | **Fitbit** | **Google Health API** |
| --- | --- | --- |
| Protocol | OAuth 2.0 (Fitbit Authorization Code Grant) | OAuth 2.0 (Google Auth standard) |
| Token expiry | 8 hours | Standard Google token lifecycle |
| Max token life | no limit | no limit for production users<br>7 days for test users (test users must re-authenticate every 7 days. This is a Google requirement) |
| Scopes | 8 general scopes (activity, heartrate, nutrition, profile, settings, sleep, social, weight) | [General scopes](https://developers.google.com/health/scopes) per data type (Scopes currently in use in Inform: `.activity_and_fitness.readonly`, `.health_metrics_and_measurements.readonly`, `.sleep.readonly`, `.settings.readonly`) |
| Re-consent | — | **Required.** Users must re-authenticate via Google OAuth. No silent migration path. |

### Data Retrieval

| **Aspect** | **Fitbit** | **Google Health API** |
| --- | --- | --- |
| Primary method | Webhooks + scheduled polling | Webhooks + Scheduled polling until Google adds Webhooks for all data types |
| Scheduled jobs | Yes, but only for specific orgs | Temporarily used while Google implements webhooks |
| Rate limits | 150 requests/hour per user | See [Rate Limits](https://developers.google.com/health/rate-limits). Inform handles quotas. |

### Origin/Provenance

| **Aspect** | **Fitbit** | **Google Health API** |
| --- | --- | --- |
| Origin detection | Reported as `origin` per metric | Reported as `origin` per metric |
| Multi-device summaries | `manual`, `unknown`, and `device` metric `origin`s are reported | `unknown` metric `origin`s are reported |

[[ Back to top ]](#top)

---

## Known Gaps and Workarounds

These metrics are available in Fitbit today but will not have a Google Health equivalent at launch in May 2026.

> ⚠️ Note that we’re currently developing `intraday` as an available resource for Google Health and we’re hoping to add it in July 2026.

| **Dropped Metric** | **Resource** | **Workaround** |
| --- | --- | --- |
| `basal_energy_burned` | Summary | Not available. Would need to be estimated using user profile data if required. |
| `bmi` | Measurement | Calculate client-side from `body_weight` and user height if available. |
| `body_temperature` | Measurement | Core body temperature logging not available. Sleep temperature deviation is on the Sleep resource. |
| `respiratory_rate` | Summary | None. Not available in Google Health API. |
| `heart_rate_zone_very_low` | Summary, Workout | None. Google Health does not have an "Out of Range" zone equivalent. |
| All Intraday data | Intraday | None. Avg. heart rate, steps, and distance were recently added to Google Health API and are in development for Inform.<br>HRV, SPO2, and elevation do not report expected data. Google is investigating. |
| All Nutrition data | Nutrition | None. Recently added to Google Health API. On Roadmap for Inform. |

[[ Back to top ]](#top)

---

## Google Health API Roadmap Items

These data types are available in the Google Health API but don't have an Inform transformation spec yet. They may be candidates for future mapping in Inform. Let us know if you’re interested in any of these.

- [Intraday](#Intraday)
- [Nutrition and Hydration](#Nutrition)
- Respiratory rate


[[ Back to top ]](#top)

---

## Quick Reference: Source Type Change

All integrations must update their source type handling:

Before:  source.type = "fitbit"

After:   source.type = "google_health"

This affects API responses, webhook payloads, and any client-side filtering or routing logic based on source type.

[[ Back to top ]](#top)

---