Methodology

How your scores are calculated

Apex Trace's Sleep, Readiness, Cardio Load, Calm, and Body Age numbers are estimates, computed entirely on your device from your own data. Nothing is sent anywhere to produce them — there is no server, and no black box. This page shows exactly how each one is figured out.

Fitbit's Premium scores aren't available through the Google Health API, so Apex Trace builds its own from the raw signals your device records — sleep stages, heart rate, heart-rate variability (HRV), resting heart rate (RHR), breathing rate, and skin temperature. Every calculation below runs locally on your phone.

Two ideas show up throughout:

01 Sleep Score (0–100)

The Sleep Score blends three things about last night, then scales the result to 0–100:

duration (50%): min(time asleep / 8h, 1.0) deep+rem (30%): min((deep + REM) / (45% of sleep), 1.0) restful (20%): starts at 1.0, minus awake-time and low-efficiency penalties Sleep Score = round(100 × weighted sum of the three)

02 Readiness (0–100)

Readiness estimates how recovered you are this morning by comparing four signals to your own baseline:

HRV score (30%): centered at 0.5, ± your HRV z-score RHR score (20%): centered at 0.5, ∓ your RHR z-score (lower = better) sleep score (35%): last night's Sleep Score ÷ 100 load score (15%): eased down when yesterday's load exceeds target Readiness = round(100 × weighted sum) label = ≥70 "go for it" · ≥40 "steady" · else "take it easy"

The "biggest factor" note you sometimes see (e.g. "you slept 1h 47m less than usual") is just the single input that fell furthest below your baseline that day.

03 Cardio Load (today vs. target)

Cardio Load turns your day's effort into one number by weighting time spent in each heart-rate zone — harder zones count for more:

daily load = Σ zone minutes × (Fat Burn=1, Cardio=2, Peak=3) load target = average daily load over the previous 28 days

04 Calm

Calm is the recovery axis on the You-screen radar. It reads three overnight signals against your baseline and centers a typical night at the midpoint:

If any of the three wasn't recorded, it drops out and the others are re-weighted, so a missing sensor never zeroes the score.

Calm = clamp 0–1 of: 0.5 ∓ breathing-rate z-score × 0.10 (slower = calmer) ± HRV z-score × 0.10 ∓ skin-temp-deviation z-score × 0.05 (missing inputs drop out, weights re-normalized)

05 Body Age (physiological-age estimate)

Body Age estimates how old your body is physiologically — specifically, how your cardio fitness compares to the US population median for your age group. The core question it answers: if a typical person had your fitness level, how old would they be? A fitness age lower than your real age means your cardio system is ahead of the curve; higher means there's room to improve.

Everything is computed on your device. If you choose to enter body measurements (date of birth, sex, height, weight, and optionally waist circumference), those measurements are stored only on your phone and never transmitted anywhere. No exercise test is needed.

VO₂max estimate

The calculation starts by estimating your VO₂max — a standard measure of how efficiently your body uses oxygen, and the most widely used single marker of cardio fitness. Two published non-exercise regression models are used depending on whether you've entered a waist measurement:

With waist circumference (more accurate) — Nes et al. 2011, sex-specific model from the HUNT Study:

Men: VO₂max = 100.27 − 0.296·age + 0.226·PA − 0.369·waist(cm) − 0.155·restingHR Women: VO₂max = 74.736 − 0.247·age + 0.198·PA − 0.259·waist(cm) − 0.114·restingHR

Without waist circumference (BMI fallback) — Jackson et al. 1990:

VO₂max = 56.363 + 1.921·PA − 0.381·age − 0.754·BMI + 10.987·sex (male = 1, female = 0) BMI = weight(kg) / height(m)²

Adding your waist measurement improves accuracy over the BMI fallback — the app will prompt you to add it if it's missing. In both models:

Fitness age and delta

With an estimated VO₂max in hand, the app asks: at what chronological age does the typical person have this VO₂max? It answers that by inverting the US FRIEND/ACSM reference VO₂max-by-age curve — a piecewise-linear median curve built from a large US fitness database (Kaminsky et al., Mayo Clin Proc 2015). The US reference is intentional: it reflects the population the app primarily serves. The result is clamped to the range 20–80 years.

fitness age = age at which the FRIEND/ACSM median VO₂max equals your VO₂max (piecewise-linear inversion, clamped 20–80 years) delta = fitness age − your chronological age (negative = biologically younger; display-clamped to ±15 years)

Pace of Aging

Pace of Aging shows the direction your fitness age is moving, not just where it stands today. It compares how much your fitness age changed in the past 30 days against how much it changed in the 60 days before that, and expresses the ratio centered on 1.0:

Pace of Aging = (fitness-age change over last 30 days) ÷ (fitness-age change over the preceding 60 days) centered on 1.0: >1 → aging faster than your own baseline 1 → same rate as your baseline <1 → slowing down relative to your baseline

Because this ratio depends on trends over time, it is most meaningful after several months of data. When fewer than 14 days of VO₂max history are available, the gauge is hidden rather than showing a noisy early reading. It improves as your history grows.

Sources

06 What these numbers are — and aren't

These scores are estimates for general wellness, meant to help you spot your own trends. They are computed on your device from your own data and are not a medical measurement, diagnosis, or advice. They're also not the same as Fitbit's Premium scores, which use Fitbit's own private formulas. If a number ever looks off, the raw data behind it lives right alongside it in the app so you can check.

The above mirrors the scoring used in the app. For how your data is handled, see the Privacy Policy.

Get started

See these scores on your own data.

Private. On-device. No subscription.

Download on the App Store Get it on Google Play