What steps measures
steps is the total number of steps a profile took in one local calendar day. It is an integer, summed from every step sample whose end time falls inside that day, and it is the most widely available signal on the platform because a phone alone can produce it.
| Field | steps |
|---|---|
| Unit | Count |
| Reported | Daily |
| Window | Midnight to midnight, profile local time |
| Wearable required | No |
| API | GET /api/v1/profile/biomarker/{externalId}?categories=activity&types=steps plus a date range |
| Webhook | BiomarkerCreatedIntegrationEvent. Entries update in place, upsert on id. |
Data sources
| Platform | Record | Notes |
|---|---|---|
| iOS, HealthKit | stepCount | Written by the iPhone’s motion sensor, a paired Apple Watch, and any app the user allows to write steps. Each writer is a separate source on the healthkit channel. |
| Android, Health Connect | StepsRecord | Health Connect only holds steps another app has written, most often Google Fit, Samsung Health, or a wearable’s companion app. |
| Android, device sensor | Phone step counter | Read directly by the SDK to cover phones with no Health Connect writer. Arrives on the device channel and ranks last. |
| Direct integrations | Provider-dependent | Garmin, Oura, WHOOP and others on the integration channel. See integrations. |
| Your backend | API | Steps you post arrive on the api channel. |
| Wearable required | No |
The source object on every steps biomarker tells you which of these produced the value. provider is the normalised brand, channel is the path it took, and identifier is the exact app or provider key, which is the field to filter on.
How Sahha calculates steps
- Sum per source. For each source, all step samples ending inside the local day are added up. A walk that crosses midnight lands on the day it ends.
- Merge a paired iPhone and Apple Watch. When the winning source is an Apple Watch, its samples are merged with the paired iPhone’s, moment by moment. Where both recorded the same interval the Watch sample is kept. Where only the phone recorded, the phone sample fills the gap. This mirrors what the Health app shows the user.
- Pick one source for the day. Sources are ranked, and only the winner’s total is published. Apple Watch ranks first. The Android phone’s built-in step counter ranks last. Everything else, including Android wearables through Health Connect and direct integrations, sits in between. Within the same rank, the source with the higher daily total wins. Sources are never added together.
- Recompute on every new sample. The biomarker for today grows through the day. A past day is rewritten if late data arrives, for example when a watch syncs the next morning. The entry keeps the same
id.
There is no steps biomarker for a day where no source reported any steps. Absence means no data, not zero.
Interpreting the value
What counts as a lot. The Activity Score uses a goal of 10,000. The evidence summarised in the Activity Score science guide shows meaningful benefit starting around 4,000 to 6,000 steps a day and an evidence-based target of 7,000 to 10,000. For a per-user benchmark, use the steps comparison insight, which places the value against a global average, a demographic group of similar age and gender, and the user’s own 30-day baseline, and returns a percentile and a state from very_low to very_high.
How much noise to expect. Free-living validation puts phone undercounting near 27% and wrist undercounting near 22%, with most of the error in short slow bursts of walking. The detail is in Step Counting Accuracy: Phone vs Wrist. Two consequences matter for product work. A 20 to 30 percent shift when a user changes device is normal, not a bug. And the difference between two users on different devices is partly a difference in device.
Today’s value is partial. The biomarker reports what has been counted so far. A 6,000 step value at 3pm is not a low day.
Related scores and insights
Score factor. Steps is a factor in three scores: Activity, Wellbeing, and Mental Wellbeing. In each, the factor is named steps, the unit is count, and the goal is 10,000. Credit rises with diminishing returns, so the first few thousand steps matter most:
| Steps | Approximate factor score |
|---|---|
| 2,500 | 0.57 |
| 5,000 | 0.78 |
| 7,500 | 0.90 |
| 10,000 | 0.98 |
| 11,000 and above | 1.00 |
For the current day the factor is projected forward. The waking day is treated as 8am to midnight, and the count so far is divided by the fraction of that window that has elapsed before scoring. At 2pm, 2,000 steps score as if they were about 5,300. The value stored on the factor, and the biomarker itself, are never scaled.
Trend. A steps trend is available. It tracks the factor score on a 0 to 1 index, not the raw count, so it reports whether the user is moving toward or away from the goal.
Comparison. A steps comparison is available on the raw count, against global, demographic, and personal baseline groups.
Archetype. The activity_level archetype (sedentary through highly_active) is derived from the weekly or monthly average Activity Score, so steps influence it through the score rather than directly.
Use cases
A daily steps tile with history. Query the biomarker endpoint for the activity category and the steps type over a date range, one value per day.
GET /api/v1/profile/biomarker/{externalId}?categories=activity&types=steps&startDateTime=2026-08-01&endDateTime=2026-08-31Render missing days as no data rather than zero, and label today as in progress. Showing source.provider next to the number stops support tickets about a count that does not match the user’s watch app.
A personal step goal. The steps comparison insight’s personal-baseline group returns the user’s own 30-day average and where today sits against it, which is the input for a target that moves with the user. Build Dynamic Reward Loops with Sahha shows the full pattern.
A warehouse or CRM stream. Subscribe to BiomarkerCreatedIntegrationEvent on a webhook and upsert on id. The webhook interval acts as a deduplication window, so a day that updates many times arrives once per interval with the latest value. Stream Health Data to Supabase and Enrich Customer.io Profiles cover the two common destinations.
Limitations
- Do not add sources yourself. If you also pull raw samples or data logs, a phone and a watch will both have recorded the same walk. The biomarker already resolved this. Summing on your side roughly doubles the count.
- Absence is not zero. A day with no biomarker had no step data from any source. Treat it as unknown.
- Steps land on the day they end. A sample that spans midnight counts entirely toward the later day.
- Source changes move baselines. A user who starts wearing a watch, or whose watch battery dies for a week, will see a shift of 20 to 30 percent that has nothing to do with behaviour. Compare within a source, or watch
source.identifierfor changes before drawing conclusions. - Android needs a writer or the sensor. On Android with no Google Fit, Samsung Health, or wearable app writing to Health Connect, the count comes from the phone’s own step counter only, which ranks below every other source and only counts while the phone is carried.
- Leaderboards rank devices. Any cross-user ranking on raw steps is partly a ranking of who owns a watch. Rank on the comparison percentile or on change from personal baseline instead.
Related guides
- Active hours and active duration for how the movement is spread through the day
- Floors climbed for vertical movement
- Activity Score explained for how steps combines with the other five factors
- Biomarkers vs data logs if you are deciding whether you need the raw samples
- Data dictionary and Biomarkers API in the developer docs