How Vitalstat Calculates Your Scores
Vitalstat computes sleep, recovery, and strain scores tailored to each data source. Here is exactly how each score works for every supported device.
Score Overview
Sleep Score (0–100) — summarizes your overall sleep quality for a given night. Factors include total duration, time in each sleep stage, heart rate patterns, and sleep consistency.
Recovery Score (0–100) — measures how well your body has recovered overnight. Based on heart rate variability, resting heart rate, sleep quality, restorative sleep stages, and respiratory rate. Compared against your personal 28-day baseline.
Strain Score (0–100) — quantifies the total physical stress accumulated during the day through workouts, heart rate elevation, and calorie expenditure. Use it alongside recovery to balance training and rest.
Scoring by Device
| Score | Polar | Apple Watch | Garmin | Oura Ring |
|---|---|---|---|---|
| Sleep | Native API | Native or Calculated | Native API | Native API |
| Recovery | Calculated (5 metrics) | Calculated (5 metrics) | Synthesized (4 metrics) | Native (Readiness) |
| Strain | Calculated (3 metrics) | Calculated (3 metrics) | Approximated | Not available |
Polar
Sleep Score
Native from APIPolar provides a native sleep score (0–100) directly from the API. Vitalstat applies dynamic adjustments via a volatile sleep score calculation that compares the current night against your 28-day historical average.
Recovery Score
Calculated in-appA weighted composite of five overnight metrics, each compared against your 28-day rolling baseline:
Volatile sleep score adjusted against baseline
Current HRV vs. your 28-day average
Deep + REM sleep ratio vs. baseline
Lower is better, compared to baseline
Stability compared to baseline
Strain Score
Calculated in-appThree components combined into a 0–100 score:
Active calories from daily activity
Average heart rate above resting baseline
Inverse of sleep quality — poor sleep increases strain
Apple Watch
Sleep Score
Native or CalculatedUses the native HealthKit sleep score when available. When Apple does not provide a score, Vitalstat calculates one using sleep duration, sleep efficiency, deep/REM percentage, and interruptions — all compared against a 28-day baseline.
Recovery Score
Calculated in-appSame weighted methodology as Polar, using only overnight vitals from HealthKit:
Duration and quality vs. baseline or target
Overnight HRV/SDNN vs. 28-day average
Deep + REM ratio vs. baseline
Overnight resting HR, lower is better
When available from HealthKit
Strain Score
Calculated in-appThree components with logarithmic scaling for duration:
HR elevation above resting baseline
Logarithmic scaling prevents saturation at high durations
Calories burned through activity
Garmin
Sleep Score
Native from APIGarmin provides a native sleep score (0–100) along with component subscores for REM, NREM, and awakenings. Sleep stress data (0–100) is also available for deeper analysis.
Recovery Score
Synthesized from componentsGarmin does not provide a single recovery score, so Vitalstat synthesizes one from available metrics:
Native Garmin sleep score (0–100)
Normalized from 10–70ms range to 0–100
Mapped from 80–40 bpm to 0–100
Daily high from Garmin's proprietary metric
Strain Score
ApproximatedGarmin does not expose a native strain metric. Vitalstat provides a rough approximation based on active calories burned during the day.
Oura Ring
Sleep Score
Native from APIOura provides a native sleep score (0–100) from the daily sleep endpoint. When the daily score is unavailable, Vitalstat falls back to the session-level sleep efficiency score. Only "long sleep" records are included — naps are excluded.
Recovery Score
Native from APIUses Oura's Readiness Score directly — a comprehensive metric that Oura calculates from multiple contributors:
Recent activity relative to your baseline
Deviations from your personal norm
Current HRV trend vs. baseline
Overnight resting HR trends
Recent sleep debt or surplus
How quickly your HR stabilizes during sleep
Strain Score
Not availableThe Oura API does not expose a strain metric. Activity stress minutes are tracked but not mapped to a strain score.
Frequently Asked Questions
How is the recovery score calculated?
The recovery score is a weighted composite of overnight metrics: heart rate variability (HRV), resting heart rate, sleep quality, restorative sleep (deep + REM), and respiratory rate. Each metric is compared against your personal 28-day baseline. For Oura Ring users, we use the native Readiness Score directly from the Oura API.
What is the strain score?
The strain score measures the total physical stress your body has accumulated during the day. It factors in heart rate intensity above your resting baseline, workout duration, and active calories burned. A higher strain score means your body needs more recovery time.
Are the scores the same across all devices?
Scores vary by device because each source provides different raw data. Polar and Garmin provide native sleep scores from their APIs. Oura provides both a native sleep score and a Readiness score. For Apple Watch, Vitalstat calculates scores using HealthKit data. The methodology is tuned per source to ensure accuracy.
What is a good recovery score?
Recovery scores range from 0 to 100. A score above 70 generally indicates your body is well-recovered and ready for intense training. Scores between 40 and 70 suggest moderate recovery — lighter activity is recommended. Below 40 indicates your body needs rest.
Why does the recovery score use a 28-day baseline?
Using a rolling 28-day baseline personalizes the score to your body. Instead of comparing against population averages, the score reflects how today compares to your recent normal. This means improvements in fitness are reflected over time as your baseline shifts.
See your scores in action
Download Vitalstat and get personalized sleep, recovery, and strain scores from your Apple Watch, Garmin, Polar, or Oura Ring.