AI Running

Body Battery, Whoop Recovery and the Number That Disagrees With You

You wake up, roll over, and check your wrist before you check the weather. Whoop says 34% recovery. Your plan says 6 x 1km at threshold. And your legs, the ones you’ll actually be running on, feel fine. Better than fine. You ran an easy 8km yesterday and slept seven and a half hours.

So which one is lying?

This post takes a side. When a recovery score and your body disagree, the score should lose most of the time. Not always. There are specific, nameable exceptions and I’ll spell them out. But the default assumption that a number derived from overnight heart rate variability knows more about your training readiness than you do is backwards, and it’s costing recreational runners sessions they were perfectly capable of running.

What these scores are actually measuring

The question of whoop recovery score accuracy running isn’t really one question. It’s three, because the major scores are built from genuinely different inputs and they’re answering different things.

Whoop Recovery is dominated by heart rate variability, measured during your last slow-wave sleep period, plus resting heart rate, respiratory rate and sleep performance. The HRV component carries most of the weight. Whoop normalises against your own baseline, which is sensible, but the baseline is a rolling window so a rough fortnight quietly resets what “normal” means for you.

Garmin Body Battery is a Firstbeat algorithm. It’s a depletion-and-recharge model: stress (derived from HRV during waking hours, which is a much noisier signal than overnight HRV) drains it, rest and sleep refill it. Body Battery is not primarily a training readiness metric. It’s an energy budget metaphor that Garmin then reuses inside Training Readiness, which folds in sleep, recovery time, acute load and HRV status. Body Battery at 41 tells you something about your autonomic state over the past few hours. It tells you close to nothing about whether your quads can handle 6 x 1km.

Oura Readiness weights sleep more heavily than either, plus body temperature deviation, which is the one input in this group that reliably catches something your legs genuinely can’t feel: an infection three days before you’d notice it.

Polar Nightly Recharge splits ANS status from sleep charge, which is more honest than collapsing both into a single percentage, and it’s the one I’d point to as the best-designed of the bunch even though almost nobody uses it.

Here’s what none of them measure: muscle damage. Tendon irritation. Glycogen. Connective tissue adaptation. The actual physical stuff that determines whether tomorrow’s session goes well. Every one of these scores is inferring whole-body training readiness from cardiac autonomic signals, and cardiac autonomic signals respond to a long list of things that have nothing to do with running.

What actually moved your score last night

A worked example from a runner I’ll call R, marathon block, week 9 of 16, following a Runna plan with a Garmin Forerunner 265 and a Whoop 4.0 worn simultaneously for a month.

Tue  Whoop 71%  HRV 64ms  RHR 48  Body Battery 76  Plan: 5km easy      → felt good
Wed  Whoop 68%  HRV 61ms  RHR 49  Body Battery 71  Plan: 12km steady   → felt good
Thu  Whoop 33%  HRV 39ms  RHR 55  Body Battery 42  Plan: 5x1200 @ 10K  → ???
Fri  Whoop 64%  HRV 58ms  RHR 49  Body Battery 68  Plan: rest

Thursday looks alarming. HRV down 36%, resting heart rate up seven beats. Whoop flagged it red and suggested a recovery day.

What happened on Wednesday night: two glasses of wine at a friend’s birthday, dinner at 21:30, asleep by 00:15 instead of the usual 22:45. R ran the session anyway. Splits were 4:38, 4:36, 4:37, 4:35, 4:34. Faster than the previous week’s equivalent workout, and the last rep was the quickest. Friday’s score bounced straight back because the alcohol had cleared.

That’s not a story about R being tough. It’s a story about what the score measured. Alcohol suppresses HRV and elevates resting heart rate for roughly 24 to 48 hours, with a dose response that’s steep and well documented. So does a late meal. So does a warm bedroom, a full bladder, arguing with your partner, a flight, the first two days of a cold you’re going to fight off without symptoms, caffeine after 16:00, and in menstruating runners, the luteal phase, where HRV drops and resting heart rate rises by three to five beats for a week and a half out of every month as a matter of ordinary physiology.

Your Thursday score said “your autonomic nervous system is dealing with something.” It was right. The something was pinot noir.

Why the legs are the better instrument

Muscular readiness and autonomic readiness are related but they are not the same variable, and the correlation is loose enough that treating one as a proxy for the other produces frequent, confident, wrong answers.

The signal that actually predicts a bad session: soreness that’s still there in your calves and hamstrings on day three, a warm-up where your legs feel heavy at paces that normally feel nothing, a resting heart rate elevated with no obvious explanation for more than three consecutive mornings, sleep that’s broken rather than merely short, and the specific flat mood that experienced runners recognise as the leading edge of getting run down.

Contrast that with a score in the low 30s on a morning where you walk downstairs without noticing your legs, your warm-up jog feels automatic, and the first rep comes out at goal pace at a perceived effort of 6 out of 10. The measurement instrument that is your own proprioception has been calibrated over thousands of kilometres on exactly one subject: you. The measurement instrument on your wrist is a green LED estimating beat-to-beat intervals through skin, tattoo ink, movement artefact and a manufacturer’s proprietary normalisation curve.

The manufacturers know this, by the way. Whoop’s own materials describe the score as a suggestion, not an instruction. Read the fine print on any of these and you’ll find hedging that the app’s colour scheme does not convey. Red feels like a verdict. It’s an estimate with error bars nobody shows you.

There’s a practical failure mode worth naming, because it’s the one that does actual damage to recreational runners. It’s not the person who ignores a red score and runs. It’s the person who takes a red score seriously in week 6 of a 16-week block, skips the session, takes another easy day when the score is amber, and arrives at week 12 having run eleven of their scheduled sixteen quality sessions. Their plan, whether Runna built it or ChatGPT did, assumed they’d run all sixteen. The progression was designed on that basis. They then run the marathon under-prepared and conclude the plan was too aggressive.

The exceptions, stated precisely

The argument isn’t “ignore the number.” It’s “the number is a prompt to think, not a decision.” Here’s when the score should win and your legs should lose.

Sustained multi-day suppression. One bad score is noise. Five consecutive days of HRV more than 15% below your 60-day baseline with resting heart rate up four or more beats is a trend, and trends mean something even when you feel fine. Fatigue that shows up in the data before it shows up in your legs is precisely the case these devices were built for. Act on the fifth day, not the first.

Elevated skin or body temperature. Oura’s temperature deviation and Whoop’s skin temperature are the most useful single inputs in the whole stack, because subclinical infection is the one thing your legs genuinely cannot report. Up 0.6°C with a suppressed score, in the absence of a hot bedroom or alcohol? Take the day. You’ll lose nothing and you might avoid three weeks.

Resting heart rate up more than eight beats with no explanation. Not HRV, which is volatile. Resting heart rate is the stabler, more interpretable signal, and a sustained jump of that size is worth respecting even on a morning when you feel ready.

The score and your legs agreeing. Obvious, but worth saying: when the number is red and you also feel like death, stop looking for reasons to run. That’s two instruments in agreement and you should believe them.

The taper and the days before a goal race. Cost asymmetry flips completely here. Running a hard session you didn’t need costs you a race. Skipping one costs you nothing measurable. In race week, let the conservative signal win every time.

Everything else — travel days, one poor night, alcohol the previous evening, the luteal phase, a stressful week at work, a red score the morning after a hard long run — do the warm-up and decide 15 minutes in. The warm-up is a better diagnostic than any overnight metric, and it’s free. If rep one at goal pace comes out at the right effort, run the session. If it comes out costing you 8 out of 10, convert it to easy running and move on without guilt.

Feeding this back into an AI-built plan

If you’re running a plan from Runna, Garmin Coach or something ChatGPT generated, there’s a second-order problem. Some of these tools now consume readiness data and auto-adjust. Garmin’s Daily Suggested Workouts do it natively. That means a score built from cardiac autonomic signals is being used to modify your training load, and if the score is wrong for the reasons above, the plan silently gets easier and no one tells you.

Audit it. Open Strava at the end of a block and count the quality sessions you actually completed against what the plan prescribed. If you’re below about 85%, your readiness score has been making training decisions for you. Below 70% and you should assume the plan you ran is not the plan you were given, and your race prediction is built on a version of your fitness that never happened.

The broader framework for interpreting these signals, including how to build a baseline worth trusting and how HRV trends differ from HRV days, sits in our pillar on reading readiness, HRV and recovery scores. Worth reading before you change how you use any of this.

What I’d actually do tomorrow morning: look at the score, spend four seconds asking whether anything last night explains it, then go and warm up. Let the first kilometre cast the deciding vote.