How Readiness and Sleep scores are calculated in Intervals Companion
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), Fair (60–69), Pay Attention (<60).
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 | 25% | Autonomic nervous system recovery |
| Sleep quality | 30% | Duration + deep/REM stage ratios |
| Training Load Balance (TSB%) | 20% | Fatigue as a percentage of fitness — ((CTL − ATL) / CTL) × 100 |
| Sleeping HR vs baseline | 15% | Cardiac recovery overnight |
| HRV 5-day trend | 10% | Directional trajectory of HRV |
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.
Your current morning HRV (rMSSD or SDNN) is compared to your personal trimmed mean from the last 30 days. At least 7 days of history are required; without enough data, this component is omitted entirely. rMSSD and SDNN are maintained on separate baselines and are never cross-compared.
| Ratio to personal baseline | Subscore |
|---|---|
| < 0.60× | 0 — severely suppressed |
| 0.60–0.80× | 0–40 — notably below baseline |
| 0.80–1.00× | 40–80 — normal fluctuation |
| 1.00–1.20× | 80–100 — at or above baseline |
| > 1.20× | 100 |
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, and REM ratios. Without stage data, duration alone drives 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.
| Ratio to personal baseline | Subscore |
|---|---|
| < 0.85× | 100 — well below baseline, excellent recovery |
| 0.85–1.00× | 70–100 |
| 1.00–1.10× | 40–70 — slightly elevated |
| 1.10–1.25× | 0–40 — poor recovery or possible illness |
| > 1.25× | 0 |
A linear regression slope is calculated over the last 5 days of HRV values and normalized by the mean. Only declining trends are penalized — stable or rising HRV is always ideal.
| Normalized slope | Subscore |
|---|---|
| ≥ −1%/day | 100 — stable or rising, ideal |
| −1% to −3%/day | 55–100 — mild decline |
| −3% to −5%/day | 25–55 — notable decline |
| < −5%/day | 15 — sustained steep decline |
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 | 35% | Total sleep duration |
| Deep Sleep | 25% | Deep sleep as % of total stages |
| REM Sleep | 25% | REM sleep as % of total stages |
| Restfulness | 15% | Breathing disturbances, or awake time if unavailable |
| Hours | Subscore |
|---|---|
| < 5h | 0–50 (linear) |
| 5–6h | 50–70 |
| 6–7h | 70–85 |
| 7–9h | 85–100 — optimal window |
| 9–10h | 100–85 — mild oversleep taper |
| 10–11h | 85–70 |
| 11h+ | 70 — floor |
| Deep sleep % | Subscore |
|---|---|
| < 5% | 0–25 |
| 5–15% | 25–80 |
| 15–20% | 80–100 |
| ≥ 20% | 100 |
| REM sleep % | Subscore |
|---|---|
| < 5% | 0–20 |
| 5–15% | 20–65 |
| 15–20% | 65–100 |
| ≥ 20% | 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 |
| Hours | Subscore |
|---|---|
| < 4h | 0–30 |
| 4–6h | 30–70 |
| 6–7h | 70–90 |
| 7–9h | 100 — flat optimal |
| 9–10h | 85–100 |
| 10–11h | 70–85 |
| 11h+ | 65 — 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 | Gradual ramp: 85→100 in 7–9h | Flat 100 across entire 7–9h window |
| Best for | Apple Watch users with sleep stage tracking | Users who want bedtime accountability |