Endurance Debrief / Guides / Swim Training Metrics

Swim Training Metrics: CSS, Pace, SWOLF and sTSS Explained

Guide 7 min read Test, formulas & example

There are no watts in the water. Your threshold is called CSS, you read intensity off your pace per 100 m, and the load lands in the same fitness curve as your rides and runs — as sTSS. Here is how it all fits together, with the test protocol and a worked example.

If you come from cycling or running, your measurement system is already in place: FTP, threshold pace, heart-rate zones. In the pool almost none of it survives. There is no power meter, GPS doesn't work, and heart rate is least reliable exactly where it would help most. Swimming is still very measurable — it just needs different quantities.

Why swimming needs its own metrics

Three peculiarities make the difference:

  • Drag grows disproportionately. Water is roughly 800 times denser than air, and resistance rises with about the square of your speed. Swimming ten percent faster therefore costs a lot more than ten percent extra energy — which is why small pace differences in the water are large differences in intensity.
  • Technique beats strength. In running, better form buys you a few percent. In swimming it can be the difference between 2:10 and 1:50 per 100 m at identical fitness. That's why every swim analysis needs at least one technique metric.
  • Heart rate runs lower. Horizontal position, cool water and the pressure on your chest mean your heart typically beats a few bpm slower at the same effort than it would on land. Carrying your run zones straight over to swimming misleads you systematically.

CSS: your threshold in the water

Critical Swim Speed (CSS) is the swimming counterpart to FTP. It describes the pace you can hold steadily over a longer distance without fatigue running away from you — effectively the line between "fast but controlled" and "this won't last". It is almost always expressed as a pace per 100 m, for example 1:45/100 m.

The 400/200 test

You determine CSS with two time trials in the same pool, after an easy warm-up and with a full recovery in between (8–10 minutes easy). Swim both distances as fast as you can, but evenly paced:

CSS_m/s = (400 − 200) / (t400 − t200)
CSS pace_s/100m = 100 / CSS_m/s

Worked example: 400 m in 6:40 (400 s), 200 m in 3:10 (190 s). The difference is 200 m covered in 210 s → CSS = 200/210 = 0.952 m/s. Converted, that is 100/0.952 ≈ 105 s, so a CSS pace of 1:45/100 m.

The point of taking the difference: whatever you put into the dive start, the turns and the initial surge goes into both times and largely cancels out. What remains is the pace you can genuinely sustain. Repeat the test every six to eight weeks — and always in the same pool, because a 25 m lane gives you more turns, and therefore more push-off, than a 50 m one.

Training zones from CSS

Your zones fall straight out of CSS pace, as an offset in seconds per 100 m. In the pool that is far more practical than heart-rate zones, because you can read the clock at every wall:

ZonePaceExample at CSS 1:45Purpose
EnduranceCSS + 10 … 15 s1:55 – 2:00long steady volume, technique
TempoCSS + 3 … 8 s1:48 – 1:53long intervals, long-course race pace
ThresholdCSS ± 2 s1:43 – 1:47the classic threshold stimulus, e.g. 8 × 100
VO₂maxCSS − 3 … 6 s1:39 – 1:42short hard intervals with generous rest
Sprinteverything below< 1:3925–50 m, technique under speed

The bands are deliberately narrow. Ten seconds per 100 m is a different training stimulus in the water, not the same session "taken a bit easier".

Pace per 100 m instead of km/h

Swim speed isn't given in km/h but as the time for 100 m — simply because the numbers stay manageable and map directly onto pool lengths. The conversion is trivial:

pace_s/100m = duration_seconds / (distance_meters / 100)

What matters is what goes into "duration". A session of 20 × 100 m on 20 seconds rest has a completely different overall pace than the same distance swum straight through. For week-to-week comparison, use the pace of the intervals, not of the whole session — or, put differently, always note the rest interval alongside it.

SWOLF: the technique metric

SWOLF (from swim and golf) measures efficiency. For each length you add:

SWOLF = time_length in seconds + number_of strokes on that length

As in golf, lower is better. 25 m in 22 seconds with 18 strokes gives SWOLF 40; the same time with 15 strokes gives 37 — same speed, less effort. That is exactly the point: SWOLF penalises buying speed through stroke rate instead of through distance per stroke.

Two caveats are worth knowing. SWOLF is only comparable within the same pool length — a 50 m value is roughly twice as high and says nothing about your 25 m value. And it is stroke-specific: breaststroke naturally produces different numbers than freestyle. So compare freestyle with freestyle, in the same pool. Then a SWOLF that falls over weeks at unchanged pace is the best evidence you have that the technique work is paying off.

sTSS: swimming in the fitness curve

For a swim to show up in the same fitness curve as your rides and runs, it needs a comparable load number. The swim Training Stress Score (sTSS) is built exactly like its running counterpart rTSS: the ratio of threshold pace to actual pace, squared, scaled by duration.

IF_swim = CSS pace / actual pace
sTSS = (duration_seconds × IF_swim²) / 3600 × 100

Both pace values are in the same unit (seconds per 100 m), so the intensity factor is dimensionless. Because the slower pace sits in the denominator, swimming faster produces a larger IF — just as in running.

Worked example: 1500 m in 30:00 (1800 s) at a CSS of 1:45/100 m (105 s). Actual pace = 1800 / 15 = 120 s/100 m → IF = 105/120 = 0.875. sTSS = (1800 × 0.875²) / 3600 × 100 ≈ 38. A steady endurance swim — plausible for half an hour well below threshold pace.

The definition is the same as everywhere else in the TSS system: one hour exactly at threshold equals 100. So an hour precisely at CSS pace is sTSS 100. That is what makes swim, bike and run load genuinely additive — and it is the reason CTL, ATL and TSB mean anything at all for a triathlete. How the curve is built from those numbers is covered in How to calculate TSS.

And without a CSS?

Without a CSS on file there is no sTSS to compute, which leaves the detour via heart rate (hrTSS). That works, but it is the weaker number: heart rate responds slowly in the water, drops fast during rest intervals and sits lower overall. Short, intense interval sessions end up systematically undervalued. Ten minutes spent on the 400/200 test are well invested.

Heart rate in the water: what actually works

Optical wrist sensors are the least reliable measurement in swimming — water between sensor and skin, constant arm movement, cooler skin. What does deliver is a chest strap with onboard memory: radio barely propagates under water, so these straps record the session and transfer it once you surface. You see nothing live in the pool, but afterwards you have the full trace.

In practice: steer by pace in the water, not by heart rate. Reading the pace clock at the wall is easier than any zone display anyway. Heart rate is your control variable for afterwards — or the fallback while you have no CSS.

An export pitfall: GPX is empty in the pool

When you swim laps, your watch records no GPS — it counts lengths from motion sensors. Export such a session as GPX and you get a practically empty file: no track, no distance, no duration. TCX is incomplete too, because the format has no swimming sport at all and Garmin files it as "Other".

So for swims the rule is: always export as FIT ("export original"). That is the only format carrying pool length, lengths, strokes and SWOLF. Getting the file onto your iPhone is covered in the FIT file guide.

What to take away

  • Establish your CSS once with the 400/200 test and retest every 6–8 weeks — it is the reference point for everything else.
  • Pace per 100 m is your control variable in the water, not heart rate.
  • Track SWOLF in the same pool and the same stroke over weeks — falling at unchanged pace means the technique is holding.
  • sTSS makes swim load comparable with bike and run, which is what makes the fitness curve meaningful for triathletes in the first place.
  • Export FIT, not GPX — otherwise the session carries no data at all.
Endurance Debrief

Set your CSS once in your profile, import the .fit file of your swim — and Endurance Debrief works out pace / 100 m, IF and sTSS, shows pool length, lengths, strokes and SWOLF, and files the session into the same CTL/ATL/TSB curve as your rides and runs. All on your iPhone, no cloud, no account.