All algorithms

Strain · Methodology v2.0

Strain, From the Ground Up

How a heartbeat becomes a number.

Methodology v2.0 · June 2026 · Public reference

The short version

Strain is a single number from 0 to 21 that captures how much total load you placed on your body today. We build it the way a physiologist would: we watch your heart rate minute by minute, weight the time you spend in each intensity zone, fold in the mechanical load of any strength work, scale the result by how recovered you were to begin with, and finally bend it all onto a logarithmic 0–21 curve so the scale matches how the body actually experiences effort. This page explains every step and every constant.

Why we’re publishing this

Strain is the spine of the whole app. It decides how hard we suggest you train tomorrow, how much sleep we tell you to chase tonight, and whether your training is building you up or grinding you down. A number with that much influence shouldn’t be a black box. So here is the entire pipeline — the zone weights, the recovery scaling, the exact shape of the 0–21 curve — laid out so you can see the choice we made at every fork and the reasoning behind it.

What Strain is

Strain is a 0–21 score for total daily load, mapped onto a logarithmic scale so the numbers stay intuitive:

RangeMeaning
0–9Light — rest or easy movement
10–13Moderate — a solid training day
14–17High — a demanding day
18–21All-out — exceptionally taxing, hard to reach

Two properties matter:

  • It’s logarithmic. Each additional point is harder to earn than the last. Climbing from 2 to 4 is trivial; climbing from 16 to 18 takes enormous, sustained effort. This mirrors physiology — the marginal cost of the next bit of intensity rises sharply as you fatigue.
  • It’s a whole-day total. Strain isn’t just your workout. A long day on your feet, a stressful afternoon, a red-eye flight — your body pays for all of it during recovery, so it all counts. Your workout is usually the biggest single contributor, but it’s never the only one.

Under the hood, Strain is built in two currencies: load points (an internal, linear measure of physiological work) and the 0–21 score (load points bent onto the logarithmic curve). Almost everything interesting happens in load-point space, before the curve.

Step 1 — Heart rate becomes load points

Heart rate is the primary signal. For aerobic effort it’s an excellent proxy for how hard your cardiovascular system is working, and it’s available continuously from every wearable we support.

We don’t treat all elevated heart rate equally. Following the zone-weighted training-impulse (TRIMP) tradition pioneered by Banister and Edwards,[1] we divide heart rate into five intensity zones as a percentage of your maximum heart rate, and assign each zone a load weight in points per minute:

Zone% of max HRLoad (points/min)
Below Zone 1< 50%0
Zone 150–59%0.5
Zone 260–69%1.5
Zone 370–79%3.0
Zone 480–89%5.0
Zone 5≥ 90%8.0

The weights climb faster than the zones do — a minute in Zone 5 is worth 16× a minute in Zone 1, not 5×. That’s deliberate. The metabolic and recovery cost of near-maximal work is wildly disproportionate to its heart-rate number, and a linear weighting would badly under-count hard intervals. Time below 50% of max heart rate earns nothing: it’s living, not training.

For each pair of consecutive heart-rate samples we classify the zone and add weight × minutes to your running load total. Sum it over a session or a day and you have your raw cardio load — a single number in zone-weighted minutes.

Where your max heart rate comes from

The zones are anchored to your maximum heart rate, so getting it right matters:

  • We start from the age estimate 220 − age.
  • If your wearable has actually recorded a higher heart rate in the last three months (and it’s below a sanity ceiling of 250 bpm), we trust the observed value over the formula — real data beats a population average.
  • With no age on file, we default to 190 bpm.

We deliberately zone on percentage of max heart rate rather than heart-rate reserve. It’s the more robust choice when we don’t have a clean, trustworthy resting heart rate for every user every day — but it’s a real modeling choice, and we name it in the limitations below.

Step 2 — Strength work adds muscular load

Heart rate is close to the whole story for cardio, and close to useless for heavy lifting — a near-maximal set can wreck you at a heart rate you’d call a warm-up. So when you log a structured strength workout (sets, reps, and load), we don’t lean on heart rate to score the lifting. We run a dedicated muscular-load model that reads the actual mechanical work — volume, intensity relative to your own history, exercise type — and produces its own load points. That model has its own page.

The two streams are combined in load-point space:

combined load = cardio load + 1.2 × muscular load

The 1.2 multiplier puts a unit of muscular work on the same footing as a unit of cardio work before they’re summed — they’re different physiological currencies, and this is the exchange rate that makes a hard lifting session and a hard cardio session land in comparable places on the final scale.

A note on double-counting: a structured workout’s heart rate still contributes cardio load, but its non-cardiovascular toll is scored by the muscular model, not by an activity multiplier. That’s why structured workouts always sit at an Activity Load Factor of exactly 1.0 — applying one would count the same barbell twice.

Step 3 — Activity Load Factors correct what heart rate can’t see

For activities logged as a time window rather than a structured workout — jiu-jitsu, rock climbing, a sauna — heart rate systematically misreads the true load. Grappling under constant grip tension reads low; a sauna reads high for no training reason at all. We correct this with a per-activity multiplier applied to the cardio load earned during that activity’s minutes. This is the Activity Load Factor, and it has its own complete page with the factor for every activity we support.

Step 4 — Recovery scales the load

The same workout costs you more when you’re run-down than when you’re fresh. Before we convert load to a score, we scale it by how recovered you were that day:

recovery factor = 1 + (1 − recovery_score / 100)
adjusted load   = combined load × recovery factor
  • At 100% recovery, the factor is 1.0 — no change.
  • At 50% recovery, it’s 1.5 — the same effort banks 50% more strain.
  • At 0% recovery, it’s 2.0 — load is doubled.

The logic: when your body is already depleted, an identical external effort represents a deeper draw on a smaller reserve, and we want Strain to reflect the real internal cost, not just the external work. If we have no recovery score for the day, the factor is 1.0 and load passes through untouched.

Step 5 — Load points become the 0–21 score

Finally we bend the linear load onto the logarithmic curve:

Strain = 16 × log₁₀(1 + load / 130)
Capped at 21.

The constant 130 sets the characteristic scale — the load at which you’ve earned your first chunk of strain — and the 16 stretches the curve so a genuinely brutal day approaches 21 without quite getting there. (Saturating the scale would take roughly 2,800 zone-weighted minutes of load — the equivalent of several hours of continuous maximal effort, which is to say: practically unreachable, by design. 21 should feel mythical.)

Why a logarithmic curve at all

Because that’s how strain behaves. The first 20 minutes of a workout change your day far more than the 20 minutes after a two-hour session. A logarithmic curve gives you diminishing returns: the same chunk of load adds a lot of strain near the bottom of the scale and very little near the top. Critically, we apply every adjustment — zones, recovery, activity factors — in load space, before this curve. That keeps the diminishing-returns shape intact no matter what we add. Scaling the final score directly would break it.

The resting baseline

Just being awake and alive costs something. For your daily Strain (not individual sessions) we add a small baseline that accrues across your waking hours:

baseline load = 101.18 × (waking hours so far / 16)

Over a full ~16-hour waking day at complete rest, this resolves to a Strain of about 4 — our floor for “you were a living human today.” It scales with how much of your day has elapsed, so your Strain builds gradually from morning to night rather than appearing all at once. Individual session scores carry no baseline; they measure only the session.

How a whole day adds up

Your day’s Strain is computed over a waking window — from the end of last night’s main sleep to right now. Within that window we make a single pass over all your heart-rate data, so two workouts and a long walk merge into one continuous load stream rather than being scored in isolation and bolted together. Structured-workout muscular load is added on top, activity factors adjust the relevant minutes, recovery scales the whole thing, and the curve produces the number you see.

This is why your Strain rises through the day and why your hardest activity doesn’t simply define it — it’s an honest integral of everything your body did, not a label stuck on your toughest hour.

For users who track their menstrual cycle, we add a small fixed bump to the final daily score — +0.3 in the luteal phase, +0.2 during menstruation — reflecting the well-documented rise in cardiovascular and metabolic cost during those phases at an identical external effort.

What we’re honest about

What we’re honest about

  • We zone on percentage of max heart rate, not heart-rate reserve. Reserve-based zoning (which accounts for your resting heart rate) can be more personalized, but it’s only as good as your resting-HR data, which isn’t always clean. We chose the more robust option. It can slightly under- or over-read for people whose resting heart rate is far from average.
  • Max heart rate is estimated until your data corrects it. Until your wearable records a true near-max effort, your zones ride on 220 − age, a population average with real spread. Your zones sharpen as we see your actual ceiling.
  • Heart-rate-only strength is conservative. If you log lifting as a plain activity instead of a structured workout, we only have heart rate, and heavy lifting barely moves it. Log the sets to get the muscular model.
  • The curve constants are tuned, not derived from first principles. The 16 and the 130 were chosen so the 0–21 scale lands intuitively across a wide range of athletes. They’re defensible and stable, but they’re calibration, and we may refine them as we gather data.
  • It’s a population model. Two people with identical heart-rate traces get identical cardio load. The factor captures typical physiology; it can’t yet personalize to your individual efficiency.

How this metric evolves

Strain is versioned so changes are legible. The system on this page — zone-weighted cardio load, a dedicated muscular model, activity factors, recovery scaling, and the logarithmic curve — is v2.0. Scores recorded under the earlier heart-rate-only method (v1) carry no version stamp; you may notice that strenuous-but-low-heart-rate work scores more heavily going forward than it did in your older history. As we collect more data we’ll keep tuning, and we’ll note material changes here.

References

  1. [1] Banister E.W. Modeling elite athletic performance. In: MacDougall J.D., Wenger H.A., Green H.J. (eds), Physiological Testing of the High-Performance Athlete, 2nd ed., pp. 403–424. Champaign, IL: Human Kinetics Books (1991). · Edwards S. The Heart Rate Monitor Book. Sacramento, CA: Fleet Feet Press (1993). The zone-weighted training-impulse (TRIMP) method — assigning escalating load weights to time spent in successive heart-rate zones — is the foundation of our cardio-load calculation.

This document describes a proprietary metric. The reasoning and constants are published in the interest of transparency; the underlying implementation is our own.