Science · Training load & fitness

HR-only load, Karvonen zones, and Banister TRIMP

How Koyaro keeps the PMC and zone charts honest without a power meter — hrTSS when LTHR is set, per-sample Banister TRIMP otherwise, and optional Karvonen %HRR heart-rate zones.

Last reviewed · Part of Koyaro’s public science knowledge base — the same method notes the coaching engine cites.

Athlete summary

Without a power meter, Koyaro still builds a training-load history for your PMC (fitness / fatigue / form). The engine picks the best available signal:

What you haveDaily PMC loadHR zones
Power + FTPTSS (full fidelity)Coggan %FTP (power)
HR + LTHRhrTSS (TSS scale)Friel %LTHR (default)
HR + max/rest HR, no LTHRBanister TRIMP (per second)Karvonen %HRR (auto)
NeitherManual RPE / duration estimate—

Nothing hard-fails for lack of a power meter. Mixed power/HR weeks stay comparable when LTHR is set, because hrTSS uses the same “1 h at threshold = 100” reference as power TSS.

hrTSS vs TRIMP

hrTSS anchors intensity to lactate-threshold heart rate (LTHR):

hrTSS = Σ (Δt_s · (HR / LTHR)²) / 3600 · 100

One hour at LTHR equals 100 — the same reference as 1 h at FTP = 100 TSS.

Banister TRIMP anchors intensity to heart-rate reserve (HRr = (HR − rest) / (max − rest)):

TRIMP = Σ (Δt_min · HRr · k · e^(b · HRr))
  • Male: k = 0.64, b = 1.92
  • Female: k = 0.86, b = 1.67

These match trimp_coefficients / banister_trimp in coach.domain.metrics.heart_rate (do not invert female k/b).

Koyaro integrates TRIMP per sample (usually 1 Hz). Using only session average HR under-weights surges because the exponential is convex. The session-average closed form remains available for steady-effort checks and matches the integral when HR is constant.

PMC precedence (bike): training_load = TSS → else hrTSS → else TRIMP. TRIMP is always stored as hr_load when max/rest HR are known, even when hrTSS drives the PMC.

Multi-sport: run/swim use sport-native external load when CS/CSS exist; HR fallbacks follow the same hrTSS → TRIMP chain for run, and TRIMPc → sRPE (preferred) for swim. Cross-sport Foster monotony may use sRPE or HR-TRIMP as a documented shared scalar — never assert bike TSS ≡ run-load ≡ swim-load. See.

Karvonen %HRR zones (optional)

Friel’s seven zones (%LTHR) remain the default when LTHR is set. You can also choose Karvonen heart-rate reserve zones:

zone HR = rest + %HRR × (max − rest)

Five ACSM-style bands with upper bounds at 60 / 70 / 80 / 90% HRR (open-ended top). Set hr_zone_model to karvonen on the athlete profile, or leave it unset: the engine auto-selects Karvonen when LTHR is missing but max and resting HR are present. Custom absolute bpm tables still override both models.

Literature

  • Banister / Morton — training impulse (TRIMP) with sex-specific exponential weights on heart-rate reserve.
  • Karvonen et al. (1957) — target HR from resting HR + % of heart-rate reserve.
  • Joe Friel — seven cycling HR zones as fractions of LTHR.
  • Allen & Coggan / TrainingPeaks — TSS and hrTSS (LTHR-anchored load on the TSS scale) for the Performance Management Chart.

Ready when there’s a seat.

Join the waitlist for closed beta. We’ll invite you when there’s room — then import your history and start a living plan.