Training state view
The Training state mode answers one question: who needs my attention this week, and why.
It puts ten weeks of training, the current fatigue balance, the athlete's cardio state and last night's physiology side by side for the whole roster, so the athletes worth opening announce themselves instead of having to be found.

What this view is, and what it is not
It is a triage list. That one question is put to the whole roster at once, and answered from the training you already have and, where a watch is connected, from last night's physiology.
It is not a ranking, a score, or an instruction. Nothing here compares one athlete with another, and nothing here tells you what to do with today's session.
| It answers | It does not answer |
|---|---|
| Who has drifted from what I expected of them? | Who is my strongest athlete? |
| What changed this week, and in which direction? | What should I write for Thursday? |
| Is what I am seeing in the training, or in the body? | Is this athlete ready to race? |
| Is there anything here I have not noticed? | Should this athlete rest today? |
Three properties follow from that, and they are worth knowing before you lean on it:
- Every reading compares an athlete with themselves. Cardio state, rTFF and readiness are all measured against that athlete's own history, so two rows that look identical can be hundreds of AU and twenty heartbeats apart.
- Nothing is ever styled as an achievement. There is no green and no top grade, because the cheapest way to reach a good-looking reading is to stop sending data. Peaked and Normal are deliberately neutral.
- An empty cell always says why it is empty. A blank reads as fine. Every absence is named instead, and the names mean different things — some you wait out, some you fix today.
This view's job is finished when the right athlete is in front of you. What to do about them is yours, with everything you know that the app does not.
Who can open it
The Training state mode is shown to anyone in the club holding the View Analytics permission — the same permission that opens Reports. Without it the mode does not appear in the view switcher at all, and the athletes list behaves as it did before.
Athletes in the club never see it. The view reports on other people — including their sleep, their night heart rate and anything they have said about illness or injury — so it stays on the coaching side of the club regardless of what permissions an athlete has been granted.
What it needs to be accurate
Every column here is only as good as what reaches it, and the two halves of the row depend on different things. Where something is missing the view says so rather than guessing — but a cell that is filled can still be built on a placeholder, and that is the case worth knowing about.
| For | It needs |
|---|---|
| Weekly load · rTFF · Cardio state · Ramp | Completed workouts carrying heart rate — a file from a watch, or an average heart rate entered on the completion |
| The athlete's maximum and resting heart rate in their Performance Data — see cardio load for how much they matter | |
| 21 days of history before rTFF appears, 42 days before cardio state does | |
| Readiness | A watch connected, or health import switched on in the athlete's mobile app |
| The watch worn overnight — readiness reads night HRV, night resting heart rate and sleep, none of which exist from a watch charged at night | |
| 14 nights of HRV and resting heart rate, or 5 nights of sleep, before there is a baseline to compare against |
Cardio load is built on heart-rate reserve — where the session sat between resting and maximum — and it rises as a steep power of that fraction, not in step with it. So the two numbers in Performance Data do not nudge the result by a few per cent; they scale it, and every figure downstream with it: rTFF, cardio base, cardio form, the ramp and the weekly bars.
Where they are not set the app estimates them, from the athlete's age and their own highest observed heart rate — deliberately, because the alternative is worse. But an estimate is what it stays, and an athlete with the real values entered is being read more accurately than one without.
Two things that are often assumed to belong here and do not: a 10 km race time drives pace zones rather than the cardio load, and a completion with no heart rate at all falls back to duration times perceived effort — which carries no intensity signal if the athlete did not rate the session.
Strava passes activities and no health data at all, so the column will always say No health data. Overnight measurements reach the app from Garmin, COROS, Suunto, Polar or Apple Watch — see health import.
The columns
| Column | What it shows |
|---|---|
| Weekly load · 10 wks | Ten weekly cardio load totals as bars |
| rTFF | Relative fatigue — this week's load against the last three weeks. Highlighted when it runs above its band. Empty for an athlete's first three weeks |
| Cardio state | Where the athlete sits between fresh and buried, with the comparison behind it |
| Ramp | The steepest weekly rise in structural load, and the sport it is in |
| Last workout | Days since their last completed workout — today on the day itself, and marked once it reaches a week |
| Readiness | How last night's physiology compared with that athlete's own recent normal |
The divider
A vertical line separates rTFF and the bars from Cardio state and the Ramp.
That line is not decoration, but what it marks is a difference in how the two halves are produced, not in which day they describe. Both sides are calculated up to now, and both move during the day as workouts arrive.
What differs is cost. Most columns are read from a fixed recent window and are always current. Cardio state and Ramp are the exception: they are rebuilt from the athlete's whole history, so they are cached — after a session arrives, those two can briefly read generating before the new value appears. The line marks where that half begins. Last workout and Readiness sit past it for layout reasons and are as live as the bars.
Because both sides are calculated up to now, neither is final until the day is over: a value read in the morning assumes the athlete does nothing more that day. Hovering the Cardio state heading tells you the day its value is for.
Weekly load bars
Ten bars, one per week, ending with the week in progress. Bar height is relative to that athlete's own ten-week peak — so the bars show the shape of their training, not how they compare with anyone else. Two athletes with identical-looking charts can be hundreds of AU apart.
Three kinds of empty, and they mean different things:
- A pale last bar — the current week, still incomplete. It is not a collapse; it is Tuesday.
- A hairline — a week inside their history with no training in it. A genuine zero.
- A faded hairline before the first bar — before this athlete had any history with you at all.
A legend under the table repeats this.
Cardio state
A label, not a number — because cardio base and cardio form are not comparable between athletes. An athlete with a large base swings further in both directions, so their raw numbers say nothing next to someone else's. What does compare is where they sit against their own history.
| Peaked | Fresh, on a base that is holding up |
| Building | Absorbing training — where most of a build is spent |
| Detrained | Fresh because the base has eroded, not because of a taper |
| Overreaching | Carrying more recent cost than the base supports |
| Unclear | The evidence does not separate two opposite readings — see below |
| Building history | Fewer than 42 days of training, so there is no cardio form yet. The cell counts the days |
Under the label sits the comparison it rests on: a percentile against their own history with the window it covers (base above 93% · 2 yrs), or, before that percentile exists, the direction the base is moving (↗ base +6%/wk).
A high freshness reading has two opposite causes: a taper that worked, or an athlete whose training — or whose data — stopped arriving. The load model cannot tell them apart, which is why Peaked is styled neutrally, never as a success, and why the Last workout column sits beside it. If an athlete has not trained for a week, the app withdraws Peaked and shows Unclear instead: silence cannot support the claim.
Unclear is an honest answer, not a failure. It appears when the athlete sits mid-pack against their own history, or when their base is steady while they read fresh — a state that could be a taper or an early decline, and the app will not guess. Hover the badge and it tells you which of those it is; if the athlete has also not trained for a week, it says that instead, because that is the one a coach can act on.

The tooltip names both readings and declines to choose between them. That refusal is the feature — the alternative is a badge that guesses, and a coach with no way to tell the guess from a measurement.
Why rTFF is empty for a new athlete
rTFF divides this week's load by what the last three weeks built. For an athlete whose history is shorter than those three weeks, the bottom of that division is mostly days before they joined — so the number is not a comparison, it is an artefact of the missing weeks, and it comes out enormous. The column stays empty until the athlete has 21 days of history, for the same reason a bar is faded rather than drawn at zero for a week before they joined: an absence of history is not a reading.
The same holds one step in. An athlete with twenty-one real days behind them but only a token of training in them has a denominator that is real and tiny, and dividing by it produces a large number rather than a large stimulus — on a real squad one athlete reading 23.4 had done a single AU that week. Below about 50 AU a week the column stays empty too, for the same reason: a base that small is not something this week can be a multiple of.
Once past that, an athlete returning from a long break will read high, and that is correct — a session after three weeks off genuinely is a large stimulus relative to the base underneath it.
Opening a chart
Two of these columns open into ten weeks of their own, so you can check a reading without leaving the list for Reports.
| Click | What opens |
|---|---|
| The rTFF number — underlined to show it is clickable | rTFF over the last ten weeks, with the 8–13 band drawn as shading behind it |
| The chart icon in the Cardio state cell | Cardio base and form over the same ten weeks, on one shared axis |
Base and form share an axis deliberately: form is base minus recent fatigue, so on one scale the gap between the two lines is the fatigue the athlete is carrying, and the point where form crosses zero is a real event rather than a coincidence of two scales.
That is also what makes the pair readable where the badge alone is not — form above zero while the base holds is a taper; form above zero while the base falls is lost fitness. Both draw the same Peaked.

Read left to right: eight weeks of training with form wobbling either side of zero, then a taper — form climbing to +128 while the base eases back — and then a six-day stage race that takes the base to its highest point of the ten weeks and form to −335. Because the two share an axis, the widening gap on the right is the fatigue that race put into the athlete.
The taper is the part worth studying, because the two readings named under the chart sit closer together than they sound. A taper does pull the base down — cutting load lowers a forty-two-day average, and this one takes it from 320 to 271. What separates it from lost fitness is not the direction but how far and for how long: a taper's dip is shallow, brief, and reverses the moment training resumes, which is exactly what the right-hand side shows.
On the rTFF chart the shaded band is where the week's load matches what the last three weeks built. Above it the stimulus is greater than the base supports; below it the athlete is recovering — or losing fitness.

The sawtooth through the first eight weeks is the training week itself — a hard weekend lifts the acute side of the ratio and the easy days after it settle it again — so an rTFF line is never smooth, and is not meant to be. What matters is where the run of peaks sits against the band, not any single day inside it.
Then the shape changes twice. The line slides out of the bottom of the band to 3 as the athlete tapers, which is the taper working: this week's load falling away from what the last three weeks built. Days later it leaves the top at 21, which is a six-day stage race. Both are correct, and neither is a state you would want smoothed away.
This athlete's line leaves the band at both ends, so both edges are drawn. The axis scales to the line, so on an athlete who never goes near 13 it stops below the upper edge and the shading marks above 8 rather than the whole band.
Ramp
The structural load ramp: this week against the average of the four weeks before it, for the sport where it is steepest, with the sport named underneath.
Structural load is tracked per sport because tissue adaptation is movement-specific — a road-to-trail switch can leave total load flat while the loading on bone and tendon rises by half. A combined figure would hide that entirely.
Which sports are considered follows, in order: the sports set for that athlete in your club, then your own main sport types from Preferences, then the athlete's own. So a coach who coaches running and cycling does not get a column narrating a walking ramp.
The column stays empty when nothing is rising. A decline is not a ramp — that an athlete is doing less is already said by the bars, by Last workout and by a Detrained state. Above the 10% rule the figure is highlighted; below it, it is shown quietly.
When an athlete takes up a sport, the column says new instead of a percentage. There is nothing to compare a first week against, and a percentage there is not a large number but a meaningless one — an athlete with a trickle of auto-detected walking behind her and then one real mountain week once read +25396%. She had not ramped her hiking; she had started hiking, and new is the honest word for it. What counts as essentially nothing differs by sport — structural load is measured on a scale where a running week runs tens of times a cycling week, so a base that is negligible for one is ordinary training for the other, and each sport is judged against its own. This only applies when the previous four weeks hold essentially nothing and this week is more than ten times it: a genuine tenfold rise from a base that actually exists keeps its number, because that is the loudest thing on the row.
A high ramp beside a positive cardio state is the case this column exists for. A mountain week lowers heart rate, so cardio load falls and the athlete reads fresh, while structural load is the highest all year. Read alone, the card says peaked and the legs are wrecked.
A high ramp during a build, with cardio state Building, is ordinary and is deliberately not flagged.
Readiness
The last column answers a different question from every column to its left: did last night look normal for this athlete?
It answers it in three levels — Normal, Unusual, Risk — and every readable night gets one, so a row is never silent. It is deliberately not a score. Every watch vendor already ships a number out of 100; a second one would be one more thing to reconcile, with no way to see why the two disagree. What this column gives you instead is a level with its reasons attached, and a panel with the measurements behind it. Normal is not a good result and there is no level above it — see Readiness for why.
Everything else on this row is what was asked of the body — load, fatigue, form. Readiness is what the body did overnight: night HRV, night resting heart rate and sleep, each compared against that athlete's own previous 28 nights. The two are never mixed, because the mornings worth noticing are the ones where they disagree.
| The cell shows | Means |
|---|---|
| Normal (neutral badge) | Everything this athlete normally records arrived, all of it is ordinary for them, and they slept over six hours |
| Unusual (amber badge) | Short of ordinary and short of a verdict — worth seeing, not a reason to change today |
| Risk (red badge) | Well outside their usual range, or a night short enough to say so on its own |
| short sleep / less than usual / broken sleep | Which of the three sleep readings went wrong. More than one can be lit |
| habitually short / short recently | Short sleep, and whether it is their life or their week |
| HRV · not recorded | A measurement they normally record did not arrive last night. Named, because waiting will not fix it |
| a flag line | The athlete reported illness, fatigue or an injury themselves |
| Building baseline · No night data · No reading · Too few inputs · No health data | The five reasons there is no reading, each named rather than left blank |

Reading that column from the top: a watch not worn at night, two Building baseline counters — one counting HRV nights, one counting sleep nights, and the two counts differ because the two measurements need different numbers of them — an athlete with no health data at all, a red flag line where the athlete reported strong symptoms themselves, an Unusual on a habitually short sleeper with the hours and their usual printed beside it, a Risk carrying three sleep reasons at once, and a Risk where HRV and resting heart rate moved together.
Nothing is ever coloured as an achievement. Normal is neutral: it says nothing stood out, not that the athlete is fresh, and there is no level above it. Every cell, including every absence, carries an ⓘ button that opens the measurements behind it without loading anything.
Building baseline and No night data look alike and mean the opposite: the first says wait, the second says waiting will not help — the watch is not being worn overnight, or the source has stopped.
A Risk badge beside an ordinary rTFF and a Building cardio state is the case this column exists for: the training is fine, the athlete is not. The reverse — a hard block with clean overnight numbers — is an athlete absorbing it well, and is deliberately not flagged.
Full explanation, thresholds and the research behind them →
Reading one row
Each column answers a narrower question than the row does. The row is read left to right, and the answer is the combination. From the roster at the top of this page:
Bars climbing week on week, rTFF 12.1, cardio state Overreaching, a +11% running ramp, a workout today, readiness Unusual · resting HR.
Four columns are saying the same thing there, and that agreement is what makes it worth acting on: the training has been rising, the model says the athlete is carrying more recent cost than the base supports, the structural load is climbing with it, and the body agreed overnight. Any one of those alone is ordinary — a hard week is usually the week you wrote.
The combinations worth learning are the ones that mean the opposite of how they first read.
Five more rows worth recognising
A hard block being absorbed. Bars climbing, rTFF above its band, a modest ramp, cardio state Building, readiness Normal. Four columns and nothing to do: the athlete is taking the work you gave them. This is deliberately not flagged — a filter that fires on a build that is going well is a filter you stop reading.
The mountain week. Cardio state Unclear with the base steady, a +62% ramp, readiness Normal, and the bars flat or falling. Nothing looks wrong, and the legs took the heaviest week of the year. Hills and trails lower heart rate for the same effort, so cardio load falls while structural load climbs — the one case this pair of columns exists to catch. Ease next week's descending volume, not the cardio.
The athlete who stopped. Cardio state Unclear, rTFF 0.0, last workout 9 d, base still above the 91st percentile. The reading was going to be Peaked — a fortnight of silence looks exactly like a taper that worked — so the app withdraws it and says the useful thing instead. The base is real; the silence is what to ask about.
The base that eroded. Detrained, rTFF 0.0, last workout 11 d, bars shrinking to a hairline. The same silence, a different story: here the base has gone with it. Before you plan a conversation, check the athlete is still syncing — a broken integration produces this row exactly.
A bad night on a plan that is fine. Cardio state Building, rTFF inside its band, a small ramp, readiness Risk · HRV, resting HR. The training is fine; the athlete is not. Both autonomic measurements moved together, which is what illness and sleep debt look like a day or two before anyone mentions them. Open the ⓘ and see how far from their own normal they are before deciding anything.
Needs attention
A filter beside Unread and Without plans, shown only in this mode. It selects athletes matching any of:
- the athlete reported illness, pain or more than ordinary fatigue themselves,
- readiness Risk,
- cardio state Detrained or Overreaching,
- a structural ramp above the 10% rule together with a positive cardio state,
- no completed workout for 7 days or more.

With the filter on, the roster drops to the rows that matched, and each still shows which trigger caught it: a nine-day gap since the last workout, a +62% ramp on an athlete reading fresh, Overreaching, Detrained, an athlete who reported strong symptoms, and two readiness Risk rows. Seven rows out of a full list is the size this filter should be. If it selects half your roster, one of the triggers is miscalibrated — which is exactly what happened to rTFF.
Flagged athletes are tinted across the whole row and their bars change colour, so they are visible before you read a single column. Hover the weekly load bars of a flagged row and it lists what triggered it — one line per reason, ordered from what needs no interpretation to be true down to what needs the most, so the first line is always the one that best explains the row. A row can carry more than one, and a row carrying two is worth more of your time than either alone.

The row hovered above is the mountain-week case: a +62% hiking ramp on an athlete whose cardio state reads Unclear. The tooltip gives the reason as a sentence rather than the name of a rule, so you can disagree with it — which is the point of listing reasons at all.
Deliberately not flagged: a clean taper, a high ramp during a build, an athlete still building history, an athlete with no health data, a single readiness measurement moving on its own, and a habitually short sleeper. A filter that fires on a correct taper is one coaches stop trusting — and a chronically short sleeper would sit in it every morning for ever, until the other triggers there lost their meaning.
The self-report trigger is the one with no threshold behind it, and that is the point: nothing about it can be miscalibrated, and it is the only trigger that reaches the athletes who have no watch at all.
A hard week on its own is not on the list, and used to be. rTFF above its band was a trigger until it turned out to be flagging nearly half a roster — and on its own it usually describes the plan you wrote. What matters about a hard week is already caught: on an eroding base it is Detrained, with an elevated ramp it is the conjunction above, after a poor night it is Risk.