Helix

How ATL, CTL and readiness are calculated

The formulas Helix uses for load and readiness. The same ones coaches and athletes see inside the app.

A number from 0 to 200 that reflects the intensity of a workout. Calculated automatically for each completed session.

Endurance (running / cycling / swimming)

Load = minutes × zone_multiplier × sport_factor
ZoneMultiplier
Z1 recovery0.5
Z2 aerobic1.0
Z3 tempo1.5
Z4 threshold2.0
Z5 maximum2.5

Sport factors: Running 1.0 · Cycling 0.85 · Swimming 1.1

Example: 46 min run in Z3 → 46 × 1.5 × 1.0 = 69 pts

Structured (interval) workouts are scored per segment: load = Σ over segments (minutes × zone multiplier × sport factor), including recovery legs.

Strength

volume = Σ (sets × reps × weight_kg) / 100
rpe_multiplier = 0.6 + RPE × 0.06
Load = round(volume × rpe_multiplier)

Example: 4×6×100 kg squat at RPE 8 → volume 24, multiplier 1.08 → 26 pts

Edge cases

  • If RPE is not set, defaults to 7.
  • Bodyweight exercise (weight = 0): volume contribution = (sets × reps × rpe × 2) / 100
  • No exercises entered at all: load = round(rpe × 6 × rpe_multiplier)

Maximum value is capped at 200 pts.

Reflects accumulated fatigue over the last 7 days. Rises quickly after hard weeks, drops quickly during rest.

ATL today = ATL yesterday + (load today − ATL yesterday) / 7
  • Load = 0 on rest days.
  • Daily load counts completed sessions plus unplanned Strava activities. For matched endurance sessions the actual Strava load is used (strength and structured intervals keep their planned load).
  • Initial value (seedATL) is set when the athlete is created, based on sessions per week.

Reflects accumulated fitness over ~6 weeks (42 days). Grows and falls slowly: the long-term picture of an athlete's form.

CTL today = CTL yesterday + (load today − CTL yesterday) / 42
  • Same rules as ATL: completed sessions plus unplanned Strava activities; rest days = 0 load.
  • Initial value (seedCTL) is set when the athlete is created.

Shows how recovered the athlete is: it compares fatigue (ATL) with fitness (CTL). The more fatigue exceeds fitness, the lower the score (0–100).

ATL/CTLReadinessStatus
≤ 1.0100Ready
1.185Ready
1.270Caution
1.355Caution
1.440Fatigue
1.525Fatigue

New athlete (CTL < 15): the score stays at 100 until a fitness base builds up, since the ATL/CTL ratio isn't reliable yet.

Training every day without rest lowers the score even at a steady load: streaks up to 7 days are free, each extra day costs 8 points (capped at 30, so monotony alone leads to Caution, never Fatigued). One full rest day resets the streak.

When the athlete has wellness data from Apple Health, readiness blends two components: training load (70%) and recovery (30%). Recovery looks at resting heart rate and HRV against the athlete’s own 28-day baseline (absolute values are not compared between athletes) and at sleep duration on an absolute scale (a 7-day average below 6.5h counts as recovery debt). Each signal needs about two weeks of history before it participates.

Without wellness data the score is the pure load formula, so nothing changes for athletes who don’t sync a watch. Poor recovery also caps the score: readiness never rises above recovery + 30. The cap is inert while recovery is 70 or higher; recovery of 10 caps readiness at 40 even on a perfectly steady load.

ValueStatusMeaning
75–100ReadyAthlete is ready for load
50–74CautionModerate fatigue, monitor
0–49FatigueRest needed

Sum of Load Score for all completed sessions in the current week (Mon–Sun). Planned and skipped sessions are not counted.

Weekly Load = Σ effective_load (completed) + Σ unplanned activities, date IN [Mon, Sun]
  • Displayed in the 'Total' column in Week Grid.
  • Unplanned Strava activities are included in the weekly total; matched sessions use their actual load.
  • If Strava is connected, weekly running km is taken from Strava activities rather than planned session data.

Support

Questions, feedback or something not working? Email us: dmitrii@helixtraining.ai

← Home