How the Today card is calculated
MetricBridge shows a readiness estimate, HRV status, recent sleep shortfall, changes worth a look, a fitness age and patterns in the tags you log. This page has every input, weight, window and limit behind them, so you can check any number yourself.
Why publish this. A 2025 review of 14 composite scores from 10 wearable makers found that none of them disclosed their exact formula (Doherty et al., Translational Exercise Biomedicine, doi:10.1515/teb-2025-0001). These numbers are built from data you already have, so you should be able to see how. If the method changes, this page changes first and the version number goes up.
The rules every number follows
- Computed on your iPhone. Nothing is sent anywhere to make these numbers, and the app still only reads Apple Health. It writes nothing back.
- Compared with you, not a population. Each signal is compared with your own recent nights. The words are "your usual" and "your typical range", never "normal".
- A missing night stays missing. Nothing is filled in or counted as zero. If there isn't enough data, the card says so and says why.
- Estimates are labelled as estimates. This is wellness information about patterns in your wearable data. It doesn't diagnose anything, and it doesn't tell you whether exercise is safe.
- Every number shows its working. Tap the card to see each input next to your usual, the effect it had, and the night count behind it.
Your usual: the shared baseline
Every signal is compared with your previous 60 days, not counting the day being scored. "Your usual" is the median of those days. The spread is the larger of 1.4826 × the median absolute deviation and the interquartile range ÷ 1.349, so one unusual night barely moves either. A small floor stops the spread collapsing when your nights are very steady:
| Signal | Compared as | Spread floor |
|---|---|---|
| HRV (Apple Watch SDNN) | natural log of ms | 0.05 |
| Resting heart rate | bpm | 1.0 bpm |
| Sleep (asleep time, naps included) | hours | 0.25 h |
| Breathing rate | breaths/min | 0.25 |
| Sleeping wrist temperature | °C | 0.05 °C |
A signal needs 14 nights before it's used. From 14 to 27 nights it counts as provisional, and from 42 it's mature. A signal with no reading for 14 days is set aside until it has one again. Readings outside a plausible range (for example a resting heart rate under 25 bpm) are ignored.
Apple Watch reports HRV as SDNN, which isn't the RMSSD many other apps show. The app labels it SDNN and never mixes the two.
Readiness estimate
Last night's value for each signal becomes a robust z-score against your usual, capped at ±3. Each z-score is then turned so that higher always means more rested:
| Signal | Weight | How it counts |
|---|---|---|
| HRV | 35% | Higher than usual raises the estimate (capped at +2), lower lowers it |
| Resting heart rate | 25% | Lower than usual raises it, higher lowers it |
| Sleep | 20% | Less than usual lowers it. More than usual adds at most +0.5 |
| Breathing rate | 10% | Only lowers it, when it's more than 0.5 above your usual |
| Wrist temperature | 10% | Only lowers it, when it's more than 0.5 away from your usual in either direction |
The weights are fixed design choices, published here, not fitted to anyone's data. Sleep stages carry no weight: in independent tests, Apple Watch picks up only about half of deep sleep (Kainec et al. 2024; Schyvens et al. 2025).
The weighted average of the available signals, capped at ±3, goes through the standard normal curve: estimate = 100 × Φ(Z). So 50 means at your usual. It doesn't mean "50% recovered". The card reads 40 to 60 as "around your usual". A signal is named under "Lowered by" or "Raised by" only when it moved by half a spread unit or more.
When there's no number. An estimate needs last night's sleep, plus HRV or resting heart rate, at least 3 signals in all, at least 60% of the total weight, and enough history. Otherwise the card says "Not enough data" and why.
Data confidence (low, medium or high) adds up each available signal's weight, scaled by how much history it has (full at 42 nights). It isn't accuracy. Model sensitivity recalculates the estimate leaving out one signal at a time and shows the lowest and highest result. It isn't a confidence interval.
HRV status
The mean of your last 7 nights of log HRV is compared with your 60-day range (mean ± 0.5 standard deviations): within, below or above your range. It needs at least 3 readings in those 7 nights, following Plews et al. (2013, 2014) on weekly HRV averages. With fewer, it says it's still learning your range.
Sleep need and recent shortfall
- Estimated need: the 70th percentile of your recorded nights over up to 90 days, blended toward an 8-hour prior. Fourteen nights count as much as the prior, so a short history leans on it. The result is kept between 7 and 10 hours, and the app tells you when that limit applied.
- Recent shortfall: each night adds (need − sleep). Older shortfall fades with a half-life of 4.85 days (a 7-day time constant). A missing night isn't counted as zero sleep: the shortfall just keeps fading through it.
- The shortfall needs at least 5 recorded nights in the last 14. It's marked provisional when the last 7 nights have a gap.
Changes worth a look
A look back at last night against your typical range, built so it stays quiet on ordinary nights. It uses resting heart rate, HRV, breathing rate and wrist temperature, each turned so that higher means further from a rested night.
- Baseline: your last 28 valid nights (at least 14, looking back no more than 42 days), skipping the 2 most recent nights so a change can't hide in its own baseline.
- A night counts when two signals are 2 or more spread units from your usual, or one is 3 or more on two nights in a row while another is at least 1. At least 3 signals must have readings that night.
- After a gap, the first nights back can't count. After 14 or more missing nights, the baseline starts again.
- Nights are judged only once they're 2 days old, because Apple revises resting heart rate after the fact.
- At most 2 shown in any 7 days, at least 72 hours apart. Anything else stays in the history list.
Sleep, exercise, alcohol, travel, stress, your cycle and medications can all move these signals. This feature doesn't detect any illness, and it's not an alert. Research on wearables and early physiological change (Mishra et al. 2020; Alavi et al. 2022) shaped the statistics, but none of it is a claim about what a change means for you. If you feel unwell, a healthcare professional can help.
Fitness age
Apple Watch records a cardio fitness (VO₂max) estimate during outdoor walks, runs and hikes. The app compares it with the HUNT 3 study's healthy Norwegian adults (treadmill VO₂peak by decade), using a reference table you choose (men's or women's), because the app stores no sex. Ages between decades are interpolated.
Watch estimates tend to read low: independent testing put the limits of agreement at −6.1 to +18.3 mL/kg/min (Lambe et al. 2025). So the app maps both ends of that range and shows an age range, never one exact age, and never extrapolates past the table ("under 25" or "70+"). It's a comparison with a study population. It isn't biological age or life expectancy.
Tag patterns
You tap tags for what happened in your day, like alcohol, sauna or late meal. Tags stay in the app's own file on your iPhone and are never written to Apple Health. Medicines and doses can't be tagged, because this feature compares nights; it must never read as whether a drug works.
- What is compared. The night after each tagged day, against the nights after days without that tag. That means next-night HRV, resting heart rate and sleep. A day you didn't tag counts as without it, so the comparison is only as good as your logging.
- Drift removed first. Each night is taken as its difference from the median of your previous 28 nights, so a slow change (fitness, season, a new watch) isn't mistaken for a tag.
- The number. The median of the tagged nights minus the median of the others, in plain units (ms, bpm, minutes).
- How sure. A 95% range from a moving-block bootstrap: 2,000 resamples of whole 7-night runs, so a stretch of similar nights isn't counted as independent evidence.
- Many comparisons at once. Every tag and night measure shown together is corrected as one family (Benjamini–Hochberg at 10%), so testing many tags doesn't manufacture patterns.
- When it's called a pattern. At least 10 tagged and 10 untagged nights, a range that excludes zero after that correction, and a difference of at least a quarter of your own night-to-night spread. Below 5 and 5 nothing is estimated (the same minimum WHOOP's Journal uses). Everything else shows its numbers as "no clear difference".
- Weekends. If 70% or more of the tagged days are Fridays or Saturdays, the card says the comparison is partly weekends against weekdays.
A pattern is something that goes with a tag in your own data, not proof that the tag caused it. In testing on 40 simulated people with four tags that had no real effect, 2 of 480 comparisons were called a pattern (0.4%). A real 4 bpm next-night rise was found, with its size estimated to within 1.5 bpm.
How it was tested
Before release, the method ran on a year of synthetic data for 120 simulated people with realistic night-to-night variation, about 8% missing nights and one sensor glitch a month:
- Changes worth a look: a median of 0.08 per person per week on ordinary data, and none from single-sensor glitches.
- When a three-night shift in resting heart rate and wrist temperature was injected, 68% were surfaced. That's deliberate: the method prefers staying quiet to crying wolf.
- Readiness on ordinary days: median 47. It sits slightly under 50 because breathing rate and temperature can only lower it.
These tests run in the app's test suite on every change. The next step is an opt-in silent run on testers' devices, with the results, including what didn't work, published here.
What isn't built, and why
- An energy "battery" that drains through the day. There's no published model, and it would count activity twice.
- Biological age or longevity scores. There's no defensible validation for either.
- Training load and sleep regularity. They need workout heart-rate series and sleep timing the app doesn't read yet. Planned for a later version, without injury-risk claims.
References
- Doherty C, Baldwin M, Lambe R, Burke D, Altini M (2025). Readiness, recovery, and strain: an evaluation of composite health scores in consumer wearables. Translational Exercise Biomedicine 2(2):128. doi:10.1515/teb-2025-0001
- Plews DJ, Laursen PB, Kilding AE, Buchheit M (2013). International Journal of Sports Physiology and Performance 8(6):688.
- Plews DJ, Laursen PB, Le Meur Y, Hausswirth C, Kilding AE, Buchheit M (2014). Monitoring training with heart-rate variability: how much compliance is needed for valid assessment? International Journal of Sports Physiology and Performance 9(5):783–790. doi:10.1123/ijspp.2013-0455
- Loe H, Rognmo Ø, Saltin B, Wisløff U (2013). Aerobic capacity reference data in 3816 healthy men and women 20–90 years. PLoS One 8(5):e64319. doi:10.1371/journal.pone.0064319. The HUNT 3 decade means the app uses are from its Table 2.
- Lambe R, O’Grady B, Baldwin M, Doherty C (2025). Investigating the accuracy of Apple Watch VO2 max measurements: a validation study. PLoS One. doi:10.1371/journal.pone.0323741
- Kainec KA et al. (2024); Schyvens AM et al. (2025): Apple Watch sleep staging compared with polysomnography.
- Mishra T et al. (2020), Nature Biomedical Engineering; Alavi A et al. (2022), Nature Medicine.
Questions or a mistake in the method? Email [email protected].