Steps & Daily Activity data from every wearable, in one schema

Step counts, distance, floors and active minutes — deduplicated across phone and watch.

6 / 8

Providers connectable today

8

Webhook events in this family

count for steps, metres for distance, seconds for time buckets

Canonical units

What steps & daily activity looks like through one API

Step count looks like the simplest metric in connected health and causes more double-counting bugs than any other. The problem is not measurement — it is that a single user commonly has two or three devices counting simultaneously, and the platforms handle that overlap differently.

A phone in a pocket and a watch on a wrist both count the same walk. Apple Health and Health Connect apply their own deduplication before handing data to an app, and their rules differ. Cloud providers know nothing about the phone at all. Summing sources naively inflates daily totals by anywhere from 20% to nearly double for active users.

WearLink records the originating device on every sample and exposes both the provider-deduplicated daily summary and the underlying series, so you can implement a source-priority policy — prefer the watch, fall back to the phone — rather than adding numbers that were never meant to be added.

Where providers disagree

The part that costs you weeks if you build this yourself. None of the following is a WearLink limitation — it is how the underlying providers actually behave.

Platform deduplication is not consistent

Apple Health and Health Connect both deduplicate overlapping step sources, but with different rules and different results. Neither exposes a stable explanation of what it dropped. If your product reconciles a total against what a user sees in their native health app, expect small unexplained gaps.

Day boundaries follow device timezone

A daily step total is bounded by local midnight on the device, which moves when a user travels. Aggregating in UTC on the server produces split or doubled days around travel. Store the local date the provider attributed, not a UTC-derived one.

Backfill rewrites days you already read

A watch that has not synced for three days uploads all three at once, and the provider restates those daily totals. Anything you computed from the earlier, incomplete values — streaks, goal completion, a leaderboard position — is now wrong and nothing tells you to recompute it. This is the single most common cause of step counts that disagree with the user's own app. WearLink re-emits the affected day on the webhook when a provider restates it, so the correction arrives as an event rather than being something you have to poll for and diff yourself.

"Active minutes" is proprietary everywhere

Every vendor computes active or exercise minutes with its own intensity thresholds. These are not comparable and should not be summed across providers. Use the raw series if you need a definition you control.

Providers that supply steps & daily activity

Status is read from the same provider table the rest of the site uses, so nothing here can claim a provider is connectable when it is not. Coverage also varies by hardware generation within a brand.

ProviderCategoryStatus
FitbitCloud OAuthLive
GarminCloud OAuthOnboarding
OuraCloud OAuthLive
WithingsCloud OAuthLive
UltrahumanCloud OAuthOnboarding
Apple HealthMobile SDKMobile SDK
Google Health ConnectMobile SDKMobile SDK
Samsung HealthMobile SDKMobile SDK

Webhook events for steps & daily activity

Subscribe to the summary event for settled records, and to the series streams when you need the underlying samples. Event names below are generated from the backend enum, so they cannot drift out of date relative to the API.

Summary object

steps.created

Series streams

series.steps.createdseries.flights_climbed.createdseries.stand_time.createdseries.exercise_time.createdseries.distance_walking_running.createdseries.walking_speed.createdseries.walking_steadiness.created

Frequently asked questions

How do I stop double-counting steps between a phone and a watch?
Use the device attribution on each sample and apply a source-priority rule rather than summing. WearLink preserves the originating device so the policy is yours to set.
Can I get intraday step data rather than daily totals?
Yes, via series.steps.created, where the provider grants intraday access. Fitbit in particular gates intraday data behind a separate application approval.
Why does my total differ from the number in the user's health app?
Almost always platform deduplication. Apple Health and Health Connect drop overlapping samples using rules they do not fully expose, so a server-side sum over raw sources will not match the native display exactly.

Related data types

15 normalised data families in total — see them all or browse integrations by provider.