Everything the recap shows: predicted vs actual splits, energy, transitions, fueling log, per-leg FIT stats, pacing, decoupling, matches burn, CdA from FIT.
After a race is logged, the post-race recap surfaces every useful comparison the platform can make from the data on file: predicted vs actual splits, calorie burn, transitions, fueling plan vs what was actually consumed, per-leg power / HR / pace stats, pacing analysis with decoupling, matches-burn / W' depletion, and a CdA estimate from the bike FIT.
It's the single page a coach opens after a race to understand what happened. Athletes can use it for the same purpose, plus log their own fueling and download a PDF copy.
/my-races/ — finished races on the athlete's
race dashboard show a "Race recap" card under the race entry./race/<id>/recap/ — same content with
simpler chrome, suitable for sharing a link or printing.[⬇ Download PDF] button at the bottom
of the recap card. One-page A4, Yousuli-branded, mirrors the
web layout for offline review.Permissions: athletes see their own races; coaches see races for athletes they coach; superusers see all.
Three big tiles at the top of the recap:
actual_finish_time
on the race row).triathlon_finish_time calculator result linked to the
race. If no calc was saved before the race, this column is
hidden gracefully.goal_finish_time).Each tile is colour-accented (orange / amber / navy) so they're distinguishable at a glance. The two headline deltas immediately below ("vs Model: -1.9% faster", "vs Coach: -1.2% faster") are colour-coded green for faster, red for slower, neutral within ±1%.
The next block breaks the comparison down by leg (swim / bike / run + a bold finish row). Each row has Actual / Model / Coach times + percentage delta pills against each. Green pills = faster than the prediction; red = slower; neutral = within ±1%.
Estimated calorie burn for the race, computed server-side using the MET model × athlete weight × actual durations:
Within ±10% of more sophisticated estimates for healthy adults at race intensity. Shows total burn, per-leg breakdown, the bike power target (if set), and the run pace per km.
The energy section is hidden when the athlete has no weight on
file (we can't compute the gravity term without it). Set
Athlete.weight_kg on the profile to make it appear.
Two small cards labelled "T1 · Swim → Bike" and "T2 · Bike → Run"
showing the transition times from Race.actual_t1 /
Race.actual_t2. When a dedicated transition FIT child exists
(rare — most uploads are single-discipline files), the card also
surfaces transition distance + HR; a follow-up adds this for
multi-leg multisport FITs that Garmin records as one file.
Per-product log of what the athlete planned to consume vs what they actually consumed. Each entry has product name, leg (pre / swim / T1 / bike / T2 / run), carbs (g), fluid (mL), sodium (mg), caffeine (mg), and optionally the minute it was taken.
The recap shows a 4-row comparison table (CHO / fluid / sodium / caffeine) with planned, actual, and delta. When the athlete has logged actuals, it also lists the products consumed per leg.
Open /race/<id>/fueling/ from the "Add your fueling log →"
link on the recap. Two ways to populate the planned side:
Athletes log actuals post-race the same way (select "Actual" as the Kind). Both planned and actual entries can be edited or deleted from the fueling-log page; the recap updates immediately.
When a bike, swim, or run Activity is matched to the race date, the recap shows a per-leg detail card with all the data the FIT contains. Matching rule:
Per-leg card shows:
critical_power or ftp).run_power_threshold from MetricHistoryFor bike + run legs the recap re-parses the FIT stream and splits it in half by time, then shows:
For bike + run legs (when the athlete has CP + W' in MetricHistory), the recap runs the Skiba CP/W' model per-second on the power stream to surface:
The matches table is the most diagnostic piece of the recap. Use it to ask "what happened at that moment?":
For shorter races (sprint, Olympic) where the anaerobic budget is the main pacing constraint, this block is essential. For long events with a steady tempo strategy, it confirms the strategy was followed ("no significant matches burned — clean pacing").
Athlete.MetricHistory for critical_power + w_prime
(bike) or run_power_threshold + run_w_prime (run). The
platform auto-estimates these from your historical files —
see the Critical Power calculator
if you want to override.The recap auto-computes a CdA estimate for the bike leg by back-solving the cycling power equation per-second on the FIT stream:
P = ½·ρ·CdA·v³ + Crr·m·g·v + m·g·v·grade
Filters out swim and run portions of multisport files via a minimum-speed cutoff (5.5 m/s ≈ 20 km/h). Trimmed mean across all valid samples (drops top/bottom 5% to suppress gust / draft outliers).
This matters a lot for aero calcs (4% density change = 4% CdA change). The recap uses the most accurate density it can:
The card surfaces which source was used + the computed value, so the coach can see whether the estimate is high-confidence or back-of-envelope.
Athlete.weight_kg (required — hidden if
missing)For a more rigorous estimate with tunable filters, open the CdA calculator via the activity picker — same physics, more knobs.
Each section degrades gracefully when data is missing:
| Section | Hidden when… |
|---|---|
| Headline tiles | No actual_finish_time |
| Model column | No saved finish-time CalculatorResult |
| Coach column | No goal_finish_time |
| Per-split table | No actuals at all |
| Energy | Athlete weight missing |
| Transitions | actual_t1 / actual_t2 empty |
| Fueling | No fueling-log entries AND no saved plan |
| FIT leg detail | No Activity matched to that leg |
| Pacing analysis | < 20 stream samples |
| Matches burn | No CP/W' in MetricHistory OR no power stream |
| CdA estimate | Athlete weight missing OR < 60 valid bike samples |
The empty state never confuses the user — only sections with real data render.
/race/<id>/recap/ is
permissioned the same way as the inline view (athlete owns,
coach has relationship, superuser). Send the link to your coach
or share in a private context.[⬇ Download PDF] button generates a
printable A4 mirroring the web layout, with a Yousuli header
and the race ID footer. Filename auto-generated from race namerecap-Cairns-70-3-2026-05-28.pdf).The transition cards now show HR avg / range when a matched FIT exists. Two sourcing strategies:
For race-day FITs with a known race format, the leg card now shows a distance-discrepancy flag when the FIT distance differs from the race spec:
The flag includes an Edit → link that opens the activity's trim & adjust panel, where you can either trim the over-recorded section or override the distance directly.
When you trim or override on the source activity, the precomputed recap-stat columns are wiped automatically. Reload the recap and every stat (pace, IF, TSS, decoupling, W' burn, CdA) recomputes against the cleaned-up window — same data on the PDF and the race-comparison page since they share the precompute.
Still stuck? Ask us a question and we'll write up an answer.
Ask a question