Resting Heart Rate Is the Slow, Boring Metric That Actually Works
Your watch woke up this morning and told you a number. Garmin called it Body Battery 64. Whoop called it a 71% recovery. Oura gave you a Readiness of 78 and a little note about “elevated resting heart rate” that it then quietly ignored when it suggested a hard session. Runna has a tempo run queued. You have forty minutes before work, and you want someone to just tell you whether the plan is working.
Here is the uncomfortable bit: the readiness score is the least useful number on that screen. The most useful one is sitting underneath it, unglamorous and un-gamified, changing by a beat or two a month. Resting heart rate.
Why the daily score keeps letting you down
Readiness scores are composite. They blend HRV, resting heart rate, sleep duration, sleep stages, respiration rate, recent training load and, depending on the vendor, some proprietary seasoning. Each input carries its own noise. Stack six noisy inputs into one number and you do not get six times the signal, you get a number that moves for reasons you cannot name.
You already know this from experience. You sleep badly because the neighbour’s dog went off at 2am, and Garmin hands you a Body Battery of 38 and a Training Readiness of “Low”. Your legs feel fine. You run the session anyway and it goes well. The next week you sleep nine hours, score 89, and your tempo falls apart at 4k. The score was not wrong about your sleep. It was wrong about what your sleep predicted.
There is also the measurement problem. HRV on a wrist optical sensor is genuinely hard. Garmin samples it overnight and reports a seven-day average against your personal baseline, which is a sensible design, but a single night’s value can swing 15-20ms for reasons including what time you ate, how much you drank, whether you slept on that arm, and whether the strap loosened at 3am. Whoop and Oura have the same physics problem with slightly different maths on top.
Resting heart rate is a far easier measurement. It is a count. Your watch takes the lowest sustained heart rate over a window of sleep, and getting that roughly right does not require the sensor to resolve millisecond-level beat-to-beat variation. The error bars are small enough that a 4bpm shift is real.
What the trend actually tells you
Two things, and they pull in opposite directions, which is exactly what makes the metric useful.
Aerobic fitness pushes RHR down over months. Stroke volume rises, your heart moves more blood per beat, so it needs fewer beats at rest. This is slow. A recreational runner going from 20 to 45 miles a week over a marathon block might see RHR drop from 58 to 52 across sixteen weeks. It does not drop 4bpm in a fortnight because you had a good week.
Accumulated fatigue, illness and life stress push RHR up over days. Sympathetic drive goes up, RHR follows. This is fast. Two days of a hard block plus a bad week at work can add 5bpm.
So a chart of your seven-day rolling RHR is a chart of fitness and fatigue fighting each other, and the shape tells you who is winning. That is precisely the question you want answered about an AI-generated plan, and no readiness score answers it, because a readiness score is a snapshot and by design has no memory.
A worked example: sixteen weeks of a Runna marathon block
Here is what a healthy progression looks like. Seven-day rolling average RHR, pulled from Garmin Connect’s Health Stats page (it exports to CSV if you want to put it in a spreadsheet, and Apple Health does the same via any of the export apps):
Week Mileage 7-day avg RHR Notes
1 28 56
2 31 56
3 34 57
4 22 55 cutback
5 36 57
6 39 58
7 42 58
8 26 54 cutback
9 44 57
10 47 58
11 50 59
12 30 54 cutback
13 48 57
14 40 55
15 28 52 taper
16 18 51 taper
Look at what happens in the cutback weeks. Week 4 drops to 55, week 8 to 54, week 12 to 54. The floor is descending. That descending floor is fitness. Meanwhile the loaded weeks climb into the 57-59 range, which is fatigue doing its job, and after each down week the body clears it.
That is a plan working. The runner never felt “recovered” during weeks 9 to 11, and their Garmin Training Readiness probably sat in the 20s and 30s for most of that stretch, flashing amber. The cutback floor said otherwise.
And here is the same chart going wrong
Week Mileage 7-day avg RHR Notes
1 28 56
2 32 57
3 36 58
4 24 57 cutback
5 38 59
6 42 60
7 45 61
8 28 60 cutback
9 46 62
10 48 63
Same shape of plan. Completely different story. The cutback weeks are not clearing anything: 57, then 60. The floor is rising, not falling. By week 10 this runner is sitting 7bpm above their week-1 baseline and their down weeks have stopped working.
This is the failure mode that AI plans produce most often, and it is a specific one. A generated plan ramps volume on a schedule rather than on evidence. Runna, Garmin Coach and a ChatGPT-built 16-week block all share the same blind spot: they add mileage because it is week 9, not because week 8 went well. A human coach reading a rising RHR floor would hold the volume flat for a fortnight. The algorithm does not know to do that, because the algorithm is not looking.
The intervention here is unexciting and it works. Freeze volume at the week-8 number, keep the easy runs genuinely easy, and watch the next two cutback weeks. If the floor comes back down to 57-58, resume the ramp from there. If it does not after three weeks, you are looking at something that is not training: low iron, a subclinical infection, or a life-stress problem the plan cannot fix.
Rules for reading it without fooling yourself
Use a seven-day rolling average, never a single day. One night tells you about one night. Garmin Connect shows this natively under Health Stats > Resting Heart Rate with a 7-day view; Oura gives a 7-day trend in the Trends tab; Whoop shows a 30-day RHR chart under Monthly Performance Assessment. If your tool only shows dailies, thirty seconds in a spreadsheet gets you there.
Compare like with like. Your RHR on a taper week is not comparable to your RHR mid-block. The comparison that carries information is cutback week to cutback week, or the same point in consecutive months.
Judge over four weeks minimum. A 2bpm move over ten days is noise. A 4bpm move that holds for three weeks is a finding.
Know your own confounders. Alcohol is the big one: two or three drinks reliably adds 5-8bpm for a night and often bleeds into the next. Heat does it too. So does a late large meal, a cold coming on, and for many women the luteal phase, which can lift RHR 2-4bpm for a predictable stretch of the cycle. None of these break the metric. They just mean you annotate rather than panic.
Do not chase a low number. The goal is a descending floor, not the lowest possible reading. A runner whose RHR crashes 8bpm in three weeks while training hard is more likely under-fuelling than getting fit, and that is worth taking seriously.
Where this sits alongside the rest of your data
None of this makes HRV or readiness scores worthless. They are more sensitive than RHR, which means they catch things earlier, and if you want to understand what those scores are doing and when to trust them, our guide to reading readiness, HRV and recovery scores goes through the mechanics properly.
What RHR gives you that they cannot is a decision you can defend a month later. When Runna asks whether to progress you to 50 miles and you are not sure, the readiness score gives you today’s mood. The RHR floor gives you eight weeks of evidence about whether your body has been absorbing the last block.
Try this the next time you open your training app: before you look at this morning’s score, pull up the 90-day resting heart rate chart and find the three lowest weekly averages. Are they getting lower, and are they getting closer together? That is your answer about whether the plan is working, and it took you about fifteen seconds to get.