How Moku Calculates CTL: Our Source of Truth
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.

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
CTL is not a fitness test. It's a model of how much training stress your body has absorbed over roughly the last six weeks, weighted so recent days count more than older ones. The model came from physiologist Eric Banister in the 1970s and was popularized in cycling by Andrew Coggan and Joe Friel through TrainingPeaks. It's the most widely used training-load metric in endurance sport. The bottom line: higher CTL means a bigger engine. But CTL alone doesn't say you're fit today — it says you've been training enough, recently enough, for adaptations to compound.

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
The day-to-day weight on a new TSS value is 1/42 ≈ 0.0238. Old days fade exponentially: a workout from 42 days ago contributes about 36% of its original weight. A workout from 90 days ago contributes about 11%. This is an exponentially weighted moving average (EWMA), not a simple rolling average.

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=42Used by
Banister continuous-decay1 − exp(−1/N)0.0236GoldenCheetah, cycling tradition
Friel/TrainingPeaks practical1/N0.0238TrainingPeaks, Joe Friel, Moku
Finance/stats EMA2/(N+1)0.0465Stock market indicators, some academic articles
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 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:
  1. Cycling with power data: power-based TSS using your FTP. One hour at FTP = 100 TSS by definition.
  2. Any sport with heart rate: TRIMP, calibrated to your max and resting HR (Banister's method).
  3. Run, no HR, with distance: pace-based intensity bucketed against your effort (faster pace = higher intensity contribution).
  4. Fallback (no HR, no power, no usable pace): duration × a sport-specific default (60/hr bike, 70/hr run, 45/hr swim).
Method 1 is the gold standard. Method 2 is solid when HR is reliable. Method 3 captures the rough cost of running pace when HR data is missing. Method 4 is a stand-in — it assumes "moderate effort" and will undercount very hard sessions and overcount very easy ones. If your activities don't include HR or power, your CTL is built from method 3 and should be treated as a rough estimate, not a precise number.

How To Read Your CTL Trend#

Coaches care about three things, in order:
  1. The trend — is it climbing, flat, or falling?
  2. The rate of change — gentle ramps build fitness; steep ramps build injuries.
  3. The absolute number — least important, mostly useful for comparison to your own past.
A healthy build phase moves CTL up by 3–7 points per week. Experienced athletes can sometimes tolerate up to 8. Faster than that for more than a couple of weeks usually shows up as elevated injury risk, illness, or staleness. Slower means you're maintaining, not building. When CTL drops by 5+ points in a week, you're either tapering on purpose, sick, traveling, or unintentionally detraining. The chart can't tell which — you have to. Form (TSB) interprets the gap. A negative TSB means fatigue is outpacing fitness, which is normal in build blocks. Positive TSB means you're fresh — useful entering a race, costly if it stretches on for weeks. Pro tip: Don't compare your CTL to other athletes. Compare it to your own past build phases. The trajectory matters; the absolute number is mostly noise across people.

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.
That last point matters specifically for new Moku users. We use a 210-day activity lookback — five CTL time constants. Assuming roughly steady training, an EWMA seeded at zero reaches ~63% of its true value after 42 days, ~88% after 90 days, and >99% by 210 days. Real training varies, so treat those numbers as upper-bound intuition rather than a precise discount on what you're seeing today. If you have less than ~6 months of synced history, your displayed CTL is still slightly under what it would settle at with a longer record.

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.
All three surfaces use the same underlying calculation so the numbers should never disagree across them. If they do, it's a bug — see how Moku adapts when reality breaks the plan for how the rest of the system reacts to changing inputs.

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: External — math and methodology: External — primary sources:
  • 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.
Share this article

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 Trial

From $19/month after trial. Cancel anytime.