How Readiness and Sleep scores are calculated in Intervals Companion
Both scores are calculated and written to your Intervals.icu wellness log, alongside the other daily metrics the app syncs. They draw on two sources: last night's readings come from Apple Health, and the baselines and training load they are measured against come from your Intervals.icu wellness log.
Inputs play one of three parts. Components carry a weight and combine into the score; when one has no data, its weight spreads across the rest. Penalties apply after that sum and can only subtract points. The Baevsky Stress Index sits between the two — it moves the HRV component up or down before the weighting.
| Input | Used by | Part it plays | Source |
|---|---|---|---|
| Sleep duration, stages, awake time, bedtime | Sleep Score | Components | Apple Health |
| Breathing disturbances | Both | Sleep Score component, and a readiness penalty | Apple Health |
| HRV last night (rMSSD or SDNN) | Readiness | Component | Apple Health |
| HRV history for the 7-night average and the 60-day baseline | Readiness | Component | Intervals.icu |
| Sleeping heart rate last night | Readiness | Component | Apple Health |
| Sleeping heart rate baseline | Readiness | Component | Intervals.icu |
| Fitness and Fatigue (CTL and ATL) | Readiness | Component | Intervals.icu |
| Baevsky Stress Index | Readiness | Adjusts the HRV component | Apple Health |
| Training ramp rate | Readiness | Penalty | Intervals.icu |
| Blood oxygen (SpO₂) | Readiness | Penalty | Apple Health |
| Wrist temperature and its 14-night baseline | Readiness | Penalty | Apple Health |
The Sleep Score reads Apple Health only. It needs no history and no Intervals.icu data.
The Readiness Score takes the finished Sleep Score as its sleep quality component. Duration, stages, bedtime, and awake time therefore reach readiness only through that 30% weight — readiness never scores them separately. Breathing disturbances work differently: they affect the restfulness part of the Sleep Score, and readiness also reads them directly as a penalty on the total. A night of heavy disturbance therefore lowers readiness on both paths.
The history the Readiness Score compares against is your Intervals.icu wellness log, which for most athletes is the data this app uploaded on previous mornings. Wellness entries written by another device or app count towards that history in exactly the same way. Wrist temperature is the one exception — its baseline is read from the last 14 nights in Apple Health.
Both scores are off until you turn them on. Open Settings, go to the daily metrics sync options, and enable Readiness Score or Sleep Score on the Experimental tab.
| Score | Minimum data for a result |
|---|---|
| Sleep Score | One night of sleep duration in Apple Health. Stage components are added when your device records deep and REM sleep. |
| Readiness Score | Last night's sleep duration, plus either a sleeping heart rate or an HRV reading in Apple Health. |
That minimum is enough on your first morning. Sleep quality and sleeping heart rate carry the score on their own, and their weights expand to cover the components that have no data yet. Each remaining component joins the score as its data arrives:
| Component | What it waits for |
|---|---|
| HRV vs baseline | 14 nights of HRV in your Intervals.icu wellness log for a baseline; 7 for the 7-night average. The baseline reaches full strength at 60 nights. |
| Training Load Balance | Fitness and Fatigue on your Intervals.icu wellness record for the previous day, which any athlete with recorded activities has. |
| Personal sleeping heart rate baseline | 7 nights of sleeping heart rate in your wellness log. Until then the 45–75 bpm scale applies. |
| Wrist temperature modifier | 5 of the previous 14 nights in Apple Health. |
Apple Watch records HRV as SDNN, and the app syncs SDNN by default. On iOS 27 and later, Apple Health also records rMSSD, which you can turn on as HRV (rMSSD) on the Standard tab. The Computed tab offers an rMSSD calculated from heartbeat data instead; it turns off while Apple's rMSSD is on. Whichever one you sync, the app compares it against a baseline of the same kind.
The Readiness Score is a single daily number (0–100) reflecting how recovered and prepared your body is for training. It draws on overnight physiology, recent training load, and sleep quality, combining them into a weighted composite. Higher is better.
Labels: Excellent (85+), Good (70–84), Moderate (50–69), Low (30–49), Poor (<30).
When all data is available, five components contribute to the score. If any component's data is absent, its weight redistributes proportionally across the remaining components — so the score always reflects 100% of available information.
| Component | Weight | What It Measures |
|---|---|---|
| HRV vs personal baseline | 20% | Where your 7-night HRV average sits against your normal |
| HRV last night | 15% | Whether last night fell below your typical range |
| Sleep quality | 30% | Your sleep score — duration, stages, and restfulness |
| Training Load Balance (TSB%) | 20% | Fatigue as a percentage of fitness — ((CTL − ATL) / CTL) × 100 |
| Sleeping HR vs baseline | 15% | Cardiac recovery overnight |
HRV carries 35% in two parts: your 7-night average shows where your recovery is trending, and last night shows acute stress — alcohol, an illness starting, a hard late session — the average would take days to reflect.
A minimum data gate applies: at least one of HRV or sleeping HR, and a sleep measurement must be present, or the score returns no result at all.
After all component subscores are combined into a weighted sum, penalty modifiers are applied and the result is clamped to 0–100.
This component asks where your HRV is sitting compared to your normal. It averages your HRV (rMSSD or SDNN) across the last 7 nights, including last night, and compares that average to your personal baseline: the trimmed mean of the 60 days before. The same measurement drives the HRV Trend sheet, the HRV Trend widget, and the Daily Wellness Analysis, so every screen shows the same three numbers: your 7-night average against your baseline, this week against the week before, and last night against your typical range.
Why an average? A single night of HRV moves around by 10–20% on its own. Averaging seven nights means one odd night shifts this component only slightly, while a genuine multi-day drop shows up in full. Last night is scored separately, in the component below.
Your normal swing. Inside your normal swing the score eases from 100 to 90. It only falls in earnest once your 7-night average drops further than that: half the spread of your 60-day history, or 3% of your baseline, whichever is larger, and never more than 15% of your baseline. A week that moves around inside your normal range is a recovered week, whichever direction it moved.
| 7-night average vs your baseline | Subscore |
|---|---|
| At or above your baseline | 100 |
| Below, but within your normal swing | 100–90 |
| From your normal swing down to 20% below | 90–30 |
| 20–30% below | 30–0 |
| More than 30% below | 0 |
How long it takes. The baseline needs 14 recorded nights in the 60 days before today. Until then the app shows your 7-night average and says the baseline is forming, and readiness leaves both HRV components out and spreads their weight across the other components. Until your history reaches back about 50 days, the sheet notes how many nights the baseline is built from; after that, missed nights just leave it with fewer points. rMSSD and SDNN are kept on separate baselines and are never compared to each other. rMSSD is used once it has a baseline; until then, SDNN is used if it has one. When SDNN is the series being scored, the readiness sheet labels the rows "HRV (SDNN)" and "HRV Last Night (SDNN)" so you can tell it apart from the rMSSD shown on the HRV Trend sheet.
Why a 60-day baseline? A short baseline quietly follows you down. If your HRV stays low for a month, a 30-day baseline drops to match it, your suppressed HRV becomes your new "normal", and the score tells you everything is fine. A 60-day baseline holds steady long enough that a bad month still reads as low, while real fitness gains become your new normal within two months.
This component compares last night's HRV to your typical range: your baseline plus or minus one standard deviation of your last 60 days, the same range the HRV Trend sheet shows. A night inside that range, or above it, scores 100 — ordinary night-to-night variation costs nothing, and an unusually high night earns nothing extra, since very high overnight HRV can also come with an illness. A night below the range points to acute stress, and the score falls the further below it lands.
| Last night vs your typical range | Subscore |
|---|---|
| Inside or above the range | 100 |
| Below the range, by up to one more standard deviation | 100–0 |
| Further below | 0 |
If Baevsky SI is available, it applies an additive adjustment to the HRV subscore. Two scales are supported depending on your calculation method setting:
| Scale | Condition | Adjustment |
|---|---|---|
| Normal (raw SI, ~10–400+) | SI < 50 | +8 |
| SI 50–100 | 0 | |
| SI 100–200 | −8 | |
| SI > 200 | −15 | |
| Sqrt (√SI, ~0–10+) | SI < 7 | +8 |
| SI 7–10 | 0 | |
| SI 10–14 | −8 | |
| SI > 14 | −15 |
The Sqrt thresholds are the mathematical square roots of the normal thresholds.
This is the same sleep score computed independently (see the Sleep Score section below) and reused as a readiness component. If sleep stage data is available, it incorporates duration, deep sleep, REM sleep, and restfulness. Without stage data, duration and restfulness drive the score.
Uses TSB% = ((CTL − ATL) / CTL) × 100, sourced from Intervals.icu. Unlike raw TSB (CTL − ATL), this normalizes by fitness level — a −30% imbalance means the same thing whether the athlete's CTL is 50 or 150. Omitted when CTL or ATL is unavailable.
| TSB% Range | Subscore |
|---|---|
| ≥ +25% | 100 — tapered / peaked |
| +10% to +25% | 90–100 — fresh |
| 0% to +10% | 80–90 — easy week |
| −15% to 0% | 70–80 — normal training |
| −30% to −15% | 55–70 — hard training block |
| −50% to −30% | 30–55 — functional overreaching |
| < −50% | 20 — non-functional overreaching |
Overnight resting HR is an inverted metric — lower relative to your baseline is better. With ≥7 days of history, your personal mean is used. Without sufficient history, an absolute scale (45 bpm = 100, 75 bpm = 0) acts as a fallback.
Overnight heart rate is one of the steadiest signals your watch records — within one person it usually varies by only a few beats from night to night. A rise of 5–10 bpm above your own baseline is well outside that range, so the scale drops sharply through it. Common causes are an incomplete recovery from a hard session, alcohol, a late or large meal, a warm room, or the day or two before an illness shows itself.
| Ratio to personal baseline | Subscore |
|---|---|
| ≤ 1.00× | 100 — at or below your baseline |
| 1.00–1.05× | 100–90 — normal night-to-night margin |
| 1.05–1.10× | 90–68 — noticeably elevated |
| 1.10–1.20× | 68–32 — poor recovery or a hard effort the day before |
| 1.20–1.30× | 32–15 — heavy fatigue or possible illness |
| > 1.30× | 12 |
After the weighted component sum is calculated, up to four modifiers apply additive penalties. Modifiers can only reduce the score — normal readings have no positive effect. They represent red-flag conditions that signal something is wrong, not qualities that make you more ready.
| Modifier | Condition | Penalty |
|---|---|---|
| Breathing Disturbances | < 10 events/hr | 0 |
| 10–20 events/hr | −5 | |
| 20–35 events/hr | −12 | |
| > 35 events/hr | −20 | |
| Blood Oxygen (SpO₂) | ≥ 92% | 0 |
| 90–92% | −5 | |
| 88–90% | −10 | |
| < 88% | −15 | |
| Training Ramp Rate | ≤ 5 | 0 |
| 5–7 | −3 | |
| 7–10 | −8 | |
| > 10 | −15 | |
| Wrist Temperature (deviation from norm) | ≤ +1.0°C | 0 |
| +1.0 to +1.5°C | −3 | |
| +1.5 to +2.0°C | −6 | |
| > +2.0°C | −10 |
In an extreme scenario, all four modifiers could stack to a combined −59 points — but this would require severe breathing disturbances, low blood oxygen, a steep training ramp, and elevated temperature simultaneously, which is precisely the situation where a dramatic score reduction is warranted.
The Sleep Score is a single nightly number (0–100) summarizing how restorative your sleep was. Two methods are available and can be selected in Settings. Both produce scores on the same label scale and both use the same dynamic weight redistribution — if a component's data is missing, the remaining weights normalize to 100%. Neither method applies post-score modifiers; all factors are weighted components.
Labels: Excellent (85+), Good (70–84), Fair (60–69), Pay Attention (<60).
This method uses four components available from Apple HealthKit: total sleep, deep sleep, REM sleep, and restfulness. Three additional factors (sleep efficiency, latency, and timing) are not available from HealthKit, so their weight is redistributed across the four available components.
| Component | Weight | Data Source |
|---|---|---|
| Total Sleep | 40% | Total sleep duration |
| Deep Sleep | 20% | Minutes of deep sleep |
| REM Sleep | 20% | Minutes of REM sleep |
| Restfulness | 20% | Breathing disturbances, or awake time if unavailable |
| Hours | Subscore |
|---|---|
| < 4h | 0–15 |
| 4–5h | 15–30 |
| 5–6h | 30–50 |
| 6–6.5h | 50–70 |
| 6.5–7h | 70–100 |
| 7–9h | 100 — optimal window |
| 9–10h | 100–92 — mild oversleep taper |
| 10–11h | 92–75 |
| 11h+ | 75 — floor |
The drop below seven hours is steep. Short sleep is not a small shortfall: six hours a night for two weeks has been shown to produce the same deficits as two nights with no sleep at all. Sleeping longer than the optimal window costs far less, because the evidence on long sleep is weaker and is tangled up with illness.
The target runs from about 90 minutes at age 25 down to about 45 minutes at 65. Deep sleep is measured in minutes rather than as a share of the night because your body produces roughly a fixed amount of it, mostly in the first few hours. Extra sleep later in the night is mostly REM and light sleep, so a percentage target would lower your score for sleeping longer on exactly the same deep sleep.
| Deep sleep minutes | Subscore |
|---|---|
| Under a third of target | 0–50 |
| A third of target up to target | 50–100 |
| At or above target | 100 |
The scale bottoms out at 50 rather than 0 because stage balance is not something you can choose, and a single night says little on its own.
100 minutes is about 22% of an eight-hour night. Like deep sleep, REM is measured in minutes rather than as a share of the night, and for a stronger reason: REM periods get longer toward morning, so a short night cuts REM more than it cuts anything else. Scoring the share would hide that — a small amount of REM can be a large percentage of a short night. The target is the same at every adult age, since REM changes far less over a lifetime than deep sleep does.
| REM minutes | Subscore |
|---|---|
| < 33m | 0–50 |
| 33–100m | 50–100 |
| ≥ 100m | 100 |
Breathing disturbances data (events per hour) is preferred. If unavailable, awake time as a percentage of total sleep is used as a fallback.
| Breathing disturbances (events/hr) | Subscore |
|---|---|
| < 5 | 100 |
| 5–10 | 80–100 |
| 10–20 | 50–80 |
| 20–35 | 20–50 |
| 35+ | 10 |
| Awake time (% of total sleep — fallback) | Subscore |
|---|---|
| < 2% | 100 |
| 2–5% | 85–100 |
| 5–10% | 60–85 |
| 10–15% | 35–60 |
| 15%+ | 10–35 |
A simpler three-factor formula that does not require sleep stage data. It adds bedtime timing as a scoring dimension, rewarding circadian-aligned sleep.
| Component | Weight | Data Source |
|---|---|---|
| Duration | 50% | Total sleep duration |
| Bedtime | 30% | Sleep onset time |
| Interruptions | 20% | Breathing disturbances, or awake time if unavailable |
Both methods use the same duration scale, so a given night's duration is worth the same either way. Only its weight in the total differs.
| Hours | Subscore |
|---|---|
| < 4h | 0–15 |
| 4–5h | 15–30 |
| 5–6h | 30–50 |
| 6–6.5h | 50–70 |
| 6.5–7h | 70–100 |
| 7–9h | 100 — flat optimal |
| 9–10h | 100–92 |
| 10–11h | 92–75 |
| 11h+ | 75 — floor |
Hours before 6am are treated as late night (e.g. 1am is scored as late, not early morning).
| Bedtime (sleep onset) | Subscore |
|---|---|
| Before 8pm | 60 — unusually early |
| 8–9:30pm | 60–80 |
| 9:30–11pm | 100 — optimal window |
| 11pm–midnight | 80–100 |
| Midnight–1am | 50–80 |
| 1–3am | 10–50 |
| After 3am | 10 |
Uses the same scoring as Method 1's Restfulness component: breathing disturbances preferred, awake time as a percentage of sleep as a fallback.
| Stages + Restfulness | Duration / Bedtime / Interruptions | |
|---|---|---|
| Requires sleep stage data | Yes, for full score | No |
| Uses bedtime timing | No | Yes — 30% weight |
| Duration curve shape | The same scale in both — flat 100 across 7–9h | |
| Best for | Apple Watch users with sleep stage tracking | Users who want bedtime accountability |