StrideSync

© 2025 StrideSync. All rights reserved.

HomeDashboardProfilePricingSupportTermsPrivacy

Focus on your stride, we’ll handle the sync.

Powered by Strava
Back to blog
Cycling dashboard

Cyclist CTL/TSB Dashboard in Google Sheets (with StrideSync)

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.

Updated Feb 2026
14 min read
Start StrideSyncJump to template

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.

Template setup

Use this CTL/TSB template

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.

Connect StrideSyncNeed setup help?

Data you need

  • Ride date, duration, distance.
  • Average power and FTP (or estimated FTP) to compute intensity factor.
  • Heart rate (optional) for a secondary load metric if power is missing.
  • Bike/equipment used (helps tie wear + performance together).

StrideSync mapping

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).

Formulas you’ll use

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 - ATL

Tip: Use ARRAYFORMULA or LET to keep calculations dynamic as new rides sync.

Charts that matter

  • CTL + TSB line chart: 90-day window with a zero-line to spot freshness dips.
  • Weekly time-in-zone bars: minutes by Z1–Z6 to ensure distribution matches your block.
  • Bike wear tracker: chain/cassette mileage per bike from the same feed.
  • Peak power table: 5s/1m/5m/20m pulls to confirm fitness moves with CTL.
Build it fast

Column layout

  • Date | Duration (min) | Distance (km/mi)
  • Avg Power | FTP | IF | Session Load
  • CTL | ATL | TSB
  • Bike | Elevation | HR (optional)

Load calculation options

  • Power-based (preferred): IF-driven load.
  • HR-based fallback: Bannister TRIMP style if no power.

Quality checks

  • FTP changes: add dated FTP table + VLOOKUP by ride date.
  • Missing power: flag rows with zero/blank Avg Power.
  • Outliers: cap IF at 1.3 for sprinty rides.

Automate sync

Keep CTL honest with automatic syncs

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.

  • Webhooks, not cron: rides appear within minutes of upload.
  • Rename bikes and update FTP without touching the sheet.
  • Secure: OAuth to Strava, no manual tokens.
Get startedTalk to us

Common questions

  • Do I need a power meter?

    Power is best. If not, use HR/TRIMP as a fallback—template includes both.

  • Can I use W/kg instead of FTP?

    Yes—store FTP and weight per date; compute W/kg and feed IF.

  • How do I handle recovery days?

    Flag Z1/Z2-only rides and cap their load; TSB will rise accordingly.

Troubleshooting & tuning

  • Spiky TSB? Check for days with missing FTP or zero power; fill from your FTP history.
  • Indoor rides off? Ensure smart trainer power is pulling through Strava, not estimated speed.
  • Races overweight? Cap IF at 1.25–1.3, or reduce recovery weighting if you feel stale.
  • Season reset? Add a simple switch to start CTL from a base value after big time off.

Ship your dashboard

Copy the template, connect StrideSync, and watch CTL/TSB update after every ride.

Sync Strava nowGet help