Build a cycling performance dashboard that tracks CTL, ATL, and TSB using Strava data synced into Google Sheets. Ship it in an afternoon—no manual exports or scripts to maintain.
Sync cycling data automatically
Use StrideSync to push every Strava ride into a Sheet (duration, distance, TSS, FTP, and bike used). No CSV export loops.
Calculate daily load
Normalize ride intensity by FTP, convert to training load (TSS-style), and separate endurance vs. high-intensity sessions.
Roll CTL/ATL and TSB
Use exponential moving averages (42/7 day defaults) to compute CTL/ATL, then TSB = CTL - ATL to flag freshness.
Visualize season health
Chart CTL and TSB, show time-in-zone per week, and add gear wear tracking for each bike in the same dashboard.
Duplicate the sheet, connect StrideSync, and let the calculations run. It auto-separates endurance vs. interval days, applies IF-based load, and updates charts whenever StrideSync syncs a new ride.
In StrideSync, map your Strava fields to columns: Date, Duration, Distance, Avg Power, Max Power, Heart Rate, Bike. Add a column for FTP (static per period or dynamic if you store FTP history).
Intensity Factor (IF)
=IFERROR(AVG_POWER / FTP, 0)Session Load (TSS-style)
=ROUND(((DURATION_MINUTES * 60) * IF^2) / (FTP * 3600) * 100, 1)CTL (42d EMA)
=EMA(SessionLoadRange, 42)ATL (7d EMA)
=EMA(SessionLoadRange, 7)TSB (Freshness)
=CTL - ATLTip: Use ARRAYFORMULA or LET to keep calculations dynamic as new rides sync.
Column layout
Load calculation options
Quality checks
Automate sync
CTL/ATL is only useful if it updates after every ride. StrideSync pushes your Strava activities into Google Sheets automatically—no App Script upkeep or manual exports.
Common questions
Power is best. If not, use HR/TRIMP as a fallback—template includes both.
Yes—store FTP and weight per date; compute W/kg and feed IF.
Flag Z1/Z2-only rides and cap their load; TSB will rise accordingly.
Ship your dashboard
Copy the template, connect StrideSync, and watch CTL/TSB update after every ride.