Which HRV metric each device reports
Comparability needs two things to match, not one: the statistic and the window it was computed over. Most comparisons name the vendor and omit the window, which is where the argument usually goes wrong.
The table
| Source | Statistic | Window |
|---|---|---|
| Apple Health | SDNN | Spot checks — background readings and Breathe sessions |
| Oura | RMSSD | Averaged over the night |
| WHOOP | RMSSD | The slow-wave-sleep window specifically |
| Garmin | RMSSD | Averaged over the night |
| Polar | RMSSD | Averaged over the night |
| Fitbit | RMSSD | Two of them: whole night, and deep sleep only |
A raw .fit file | Neither — the raw intervals | During the activity |
Reading the table
Apple is the outlier on the statistic. One vendor of six reports SDNN, and it is the one most people own, which is why the Apple-versus-ring question dominates.
Garmin and Polar are the only cleanly comparable pair. Same statistic, same window. Everything else in the table differs in at least one column.
Fitbit ships two numbers for one night. dailyRmssd and
deepRmssd are the same statistic over different windows, which makes them a
useful illustration: two values, same units, same vendor, same night, not
interchangeable. Anything that merged them would have to pick one arbitrarily.
A FIT file's hrv message is not HRV in this sense. It carries
the raw beat-to-beat intervals — the input to both statistics, not either of them. Treating
it as a nightly HRV figure puts raw intervals beside computed statistics with nothing able
to tell them apart. Computing RMSSD from it is legitimate; presenting the result as a
measurement rather than a derivation is not.
Why we store the pair, not the number
Every HRV value in our data model carries its statistic and its context as mandatory fields. A reading that cannot say which statistic it is does not get stored at all, and two readings whose statistics differ are never treated as competing measurements of the same thing — so they are never averaged, never deduplicated against each other, and never merged into one series.
That is a strict rule and it costs us features people ask for, like a single unified HRV chart across devices. The alternative is a chart that looks right and is not.
If you have several devices
Keep one baseline per (device, statistic, window) and compare each against itself. See SDNN vs RMSSD for why the direct comparison cannot be rescued, and vendor scores for the same problem one level further up.