
Training
9 min read
How Moku Calculates CTL: Our Source of Truth
The exact formula behind Moku's Fitness number, why we picked the cycling-canonical version, and what CTL can't tell you about your training.MC
Moku Coach Team
Your Moku Fitness number says 62. TrainingPeaks says 71. Both are right. Here's why — and exactly how we calculate ours.
This post is our canonical explanation of Moku's CTL math. If you ever see a number from us that disagrees with TrainingPeaks, Strava, or another platform, this is the document that explains the gap.
Why it matters: CTL drives coaching decisions across the app — taper timing, recovery cues, "is this workout too hard?" judgments. You should know exactly what the math is doing.
The first two are nearly identical (within ~1%) — they're both the cycling-canonical version. The third is the finance convention; it's roughly twice as reactive and produces a CTL that swings further with recent training.
We chose 1/42 because it's what TrainingPeaks uses, what GoldenCheetah's open-source implementation uses, and what most coaches mean when they say "42-day CTL." If you're coming from those tools, the numbers should look familiar.
You can verify this in GoldenCheetah's source code — it computes
Want a coach that shows you the math instead of guessing? Try Moku free →
What CTL Actually Is#
CTL stands for Chronic Training Load. In Moku, we label it "Fitness." Two related metrics travel with it:- ATL (Acute Training Load) — recent fatigue, weighted over the last week
- TSB (Training Stress Balance) — freshness, the difference between fitness and fatigue
The Formula We Use#
Each day, we update CTL using this recurrence:CTL_today = CTL_yesterday + (TSS_today − CTL_yesterday) × (1 / 42)
ATL_today = ATL_yesterday + (TSS_today − ATL_yesterday) × (1 / 7)
TSB_today = CTL_today − ATL_today
Where:
- TSS is the Training Stress Score for that day's workouts (zero on rest days)
- 42 is the CTL "time constant" in days
- 7 is the ATL time constant
- TSB is Training Stress Balance — the difference, sometimes called Form
Why We Use 1/42, Not 2/43#
There are two competing math conventions floating around the internet for "an N-day exponential moving average." They give noticeably different numbers.| Convention | α coefficient | α at N=42 | Used by |
|---|---|---|---|
| Banister continuous-decay | 1 − exp(−1/N) | 0.0236 | GoldenCheetah, cycling tradition |
| Friel/TrainingPeaks practical | 1/N | 0.0238 | TrainingPeaks, Joe Friel, Moku |
| Finance/stats EMA | 2/(N+1) | 0.0465 | Stock market indicators, some academic articles |
lte = exp(-1/42) and applies (1 - lte) as the weight on new TSS, which is the continuous-decay form of our 1/42.
Why not switch to 2/43? It would make Moku's CTL incomparable with TrainingPeaks/Strava without giving athletes anything new. Our coaching prompts, taper logic, and ramp-rate guidelines are all calibrated to the 1/42 scale used across the sport.
How TSS Gets Calculated#
TSS is the per-workout input to CTL. We pick the most accurate method we can, given your data:- Cycling with power data: power-based TSS using your FTP. One hour at FTP = 100 TSS by definition.
- Any sport with heart rate: TRIMP, calibrated to your max and resting HR (Banister's method).
- Run, no HR, with distance: pace-based intensity bucketed against your effort (faster pace = higher intensity contribution).
- Fallback (no HR, no power, no usable pace): duration × a sport-specific default (60/hr bike, 70/hr run, 45/hr swim).
How To Read Your CTL Trend#
Coaches care about three things, in order:- The trend — is it climbing, flat, or falling?
- The rate of change — gentle ramps build fitness; steep ramps build injuries.
- The absolute number — least important, mostly useful for comparison to your own past.
What Our CTL Cannot Tell You#
Honest list of limitations:- It's only as good as the input data. Missing activities = artificially low CTL. Mis-categorized walks logged as runs = inflated CTL.
- It can't tell strength training apart from endurance. A heavy gym day shows up the same way a tempo bike does.
- It assumes consistent thresholds. If your FTP changed and you didn't update it, recent TSS values are wrong.
- It ignores sleep, stress, nutrition, and life load. Those affect adaptation as much as training does.
- The first ~90 days from a cold start are biased low. CTL starts at zero on your first synced day and converges toward your true value over roughly five time constants (about 210 days). For users with less than ~6 months of synced history, displayed CTL is a few points below where it would settle with full history.
Where It Appears In The App#
CTL shows up in three places, all backed by the same calculation:- Analytics screen — the "Fitness" card, alongside Fatigue (ATL) and Form (TSB).
- Weekly plan emails — the "Where You're At" section in your Friday plan email pulls real CTL/ATL/FTP straight from the analytics service. No memory, no estimates.
- Chat coach — when you ask the coach about fitness, fatigue, or FTP, it queries the analytics tool live before answering rather than carrying the numbers in its system prompt. That keeps the chat fast and the numbers fresh.
Why We Wrote This Down#
Two reasons. One: AI coaches can hallucinate numbers when they're under pressure to write something that sounds plausible. The weekly plan generator now receives real CTL/ATL/FTP values pre-injected into its prompt before it writes a word. The chat coach has a strict rule to query the analytics tool live before citing any number — never from memory. If a cited number doesn't match this formula, it's wrong, and our tests catch it. Two: When athletes hit confusing readings — "my CTL dropped 60 points in three days, what's broken?" — we want a single document we can point to that says exactly what the math does and where the limits are. Most of the time the answer is in the limits section above, not in a code bug. If you ever see a CTL value from Moku that you can't reconcile against this post, that's a real bug. Tell us.Want a coach that shows you the math instead of guessing? Try Moku free →
Further Reading#
On Moku Coach:- How AI Training Plans Adapt When Life Happens — what changes in your CTL trend mean for the rest of your plan
- AI Coach vs Human Coach — what data-driven coaching can and can't replace
- How to Choose a Triathlon Training Plan — picking a plan that actually fits the load you can handle
- Calculating Training Load in Cycling — Spencer's mathematically rigorous breakdown of the EWMA formula and an alternate α convention
- Chronic Training Load: How to Measure and Interpret — practical interpretation guide with target CTL ranges by athlete level
- TrainerRoad forum: CTL Understanding — community discussion of how different platforms have historically handled CTL, including non-EWMA approaches
- TrainingPeaks: Performance Management Chart — the canonical PMC chart Moku's Fitness/Fatigue/Form tracks against
- Banister EW, Calvert TW, Savage MV, Bach T (1975). A systems model of training for athletic performance. Australian Journal of Sports Medicine — the original fitness-fatigue impulse-response model.
- Coggan A, Allen H. Training and Racing with a Power Meter (3rd ed., 2019) — definitive reference for power-based TSS and the modern PMC.
- GoldenCheetah PMCData source — open-source reference implementation. Our formula matches this within 1%.
- Joe Friel — Applying the Numbers, Part 1: Chronic Training Load (search recent versions on joefrieltraining.com). The popularizer of CTL/ATL/TSB language for everyday coaches and athletes.
Ready to train smarter?
Get an AI-powered training plan that adapts to your life. No more rigid PDFs that break when things change.
Start Free TrialFrom $19/month after trial. Cancel anytime.