For Coaches Training & analysis

Macrocycle plans: the basics

What a macrocycle is, how the team-template-to-roster model works, and where to manage plans.

What a macrocycle is

A macrocycle is the long-range training plan that spans 4 to 12 months and anchors to one or more A races. Inside the macrocycle sit mesocycles (3 to 6 week blocks) and microcycles (one week each).

The two kinds of macrocycle plan in Grepiac

The MacrocyclePlan model supports two ownership modes:

A plan can be in three states: draft, active, or archived.

Where the planner lives

Build and edit a plan in the Annual Training Plan page at /athlete/<public_id>/year/ — a visual ATP builder where you lay out the season's periodisation, anchor it to the athlete's A races, and set weekly load targets. It saves to the MacrocyclePlan model (the structure lives in config_json, so it can hold complex builder state without a fixed schema).

Opened for an athlete, the builder seeds Current CTL / ATL from their real training history — the same chronic/acute load numbers the dashboard's fitness chart shows — so the plan ramps from where the athlete actually is. Athletes with no uploaded activities yet fall back to an estimate; either way both fields stay editable.

Editing or removing an athlete's existing plan

If the athlete already has a saved plan, the builder now loads it automatically when you open it, and a banner at the top of the page"Editing saved plan: …" — confirms which plan is loaded and how to edit it (this is the edit flow; you no longer start from a blank form). Change the start date or any input, click Generate overview to rebuild the schedule, then Save and Push (tick replace overlapping dates) to swap the calendar over. That banner also carries two buttons: Reload saved version (discard your edits and pull the saved plan back) and Remove plan, which removes the plan and clears the sessions it pushed to the calendar in one step (it asks first, showing how many upcoming sessions will go — completed ones are always kept). Only the plan you are editing is removed; other saved drafts or team-template deployments for the athlete are left alone. Sessions that came from a dynamic plan subscription are not touched — the confirm tells you how many remain, and you manage those from the dynamic plan itself (or by unsubscribing the athlete). If an athlete stops racing, that's all you need. To clear only part of a calendar, use the week checkboxes on the calendar and the Delete planned button in the selection bar — it removes the planned workouts in the selected weeks and keeps anything already completed.

Shifting the start date later? The race date stays fixed, so a later start compresses the plan — fewer weeks for the same race. The builder still generates it and scrolls you straight to the overview, so watch the phase preview badge above Generate: if it warns the timeline is very tight (for example the endurance block collapses to zero), either start earlier or accept the trade-off. A compressed plan packs the same fitness into less time, so expect amber/red ACWR and CTL-ramp warnings on the chart — those are real injury-risk flags, not errors; ease the ramp or lengthen the lead-in if you can.

Phase adjustments: rename & reshape a date range

The chosen periodisation model lays down the phases automatically (base → build → peak → taper for linear, and so on). When you want to override part of the season — e.g. force more accumulation from September to December — open Phase adjustments under the phase timeline. Pick a from/to date range and a phase intent (Accumulation, Intensification, Peak, Taper, or Recovery), optionally give it a custom label (e.g. "Big Base"), and click Add & regenerate. Every week overlapping that range takes the chosen phase.

It reshapes the load too, not just the label: Accumulation lifts volume, Taper and Recovery lower it. The change is relative — the plan's CTL target and ramp-safety limits still apply, so the emphasis shifts without blowing the ramp. Overridden weeks show a dashed outline on the timeline and a ✎ on their phase tag. Race weeks that carry a taper are never overridden — A, B and C race weeks keep their own taper structure, so a phase adjustment reshapes the surrounding weeks without stripping a race's taper. Adjustments survive a regenerate, so you can keep tuning other inputs. Remove an adjustment any time from the same panel to fall back to the model's default phase.

The intent maps to each model's own vocabulary — on a block plan "Accumulation" stays accumulation, on a linear plan it becomes base, on reverse it becomes endurance — so the phase stays valid and the per-phase session and strength logic keeps working.

Naming your mesocycles

A mesocycle is the block you actually think in — the 3–6 weeks of base, the build before a tune-up race. Grepiac reads them straight off the plan: every run of consecutive weeks sharing a phase is one mesocycle, shown as a band on the annual plan page next to the week rows ("Base 1", "Recovery 2", and so on).

Click a block's name to rename it. The picker offers this plan's own vocabulary — on a block plan Accumulation / Transmutation / Realization / Restoration, on a linear plan General Prep / Specific Prep / Pre-Competition / Competition / Transition — or type your own (up to 40 characters, e.g. "Tallinn build"). Choosing the blank option puts the automatic name back. Renaming is a coach action; athletes see the names but can't change them.

The name you set is pinned to the block's first week, so it survives regenerating and re-pushing the plan. If a later reshape moves that boundary — the block now starts on a different week — the custom name steps aside and the automatic one returns, rather than sitting on a block you didn't mean. Just rename it again.

Your calendar shows the same thing for the current week: the ATP panel reads "Base 2 · week 3 of 4", so you always know where in the block you are.

Saving and re-editing

Open the builder from an athlete's annual plan page (Athlete → Year → ATP Builder) or from the ATP Manager so it is linked to that athlete — unlinked, the save buttons are disabled with a note (JSON export still works). Save as ATP persists the plan to the athlete (it powers the annual view and calendar summary); when a saved ATP exists, the builder offers Load it into the form so you can re-edit and re-save. Save to Grepiac additionally logs the plan as a calculator result for the Load-from-Grepiac history.

Push to calendar

Save as ATP stores the load-target overlay (the bars and phases on the annual view); it does not create workouts. Push to calendar turns the generated weekly schedule into real planned sessions on the athlete's calendar — every session becomes a ScheduledWorkout with its sport, duration, planned load, phase and intensity, anchored on the Monday of the plan's first week.

Push also saves the ATP for you. You no longer have to click Save as ATP first — pushing saves the reusable annual plan and lays down the sessions in one step, so you can never end up with sessions on the calendar but no saved ATP to re-edit. If anything is wrong with the plan, the whole push is refused with an error rather than half-done.

Under the hood this builds a one-athlete static training plan and applies it, so the push rides the normal plan machinery: the whole block can be unapplied as a unit from the calendar (still-planned sessions are cleared; anything already completed stays as history). Pushing again replaces the previous push — its still-planned sessions are removed first so you never get duplicates. Generate the plan first; the button confirms how many sessions it will create.

Push to a dynamic plan (multi-season library)

The dynamic-plan picker sits open in the orange Deploy box as soon as the athlete is chosen — whether you opened the builder for a specific athlete or picked one from the "Deploy to which athlete?" list (pick an existing dynamic plan or type a new name, then its own Push to dynamic plan button) — you no longer have to hunt for it. It lays the same dated sessions onto a dynamic plan — a boundless, date-keyed shared calendar — instead of one athlete. Because dynamic-plan entries are keyed by absolute date, you can run the macrocycle planner for several seasons and push each onto the same dynamic plan: the seasons accumulate into a multi-year planning library, and every active subscriber gets all of it on their calendar. Pick an existing plan or name a new one. Leave replace overlapping dates on so re-running one season replaces just that season's dates; other seasons are untouched. Each session spawns a real workout for every subscriber via the normal dynamic-plan sync, so unsubscribe / per-athlete edits behave as usual.

Per-day session caps

Each day card in the microcycle template has a max/day cap (∞/1/2/3, strength included). When the generated schedule would exceed a day's cap, the builder first moves the most movable session (strength, then easiest) to the nearest day with room, else merges it into a same-sport session, else drops it — every adjustment is listed under that week's schedule. Race-day overlays ignore caps on purpose.

For lower-level access the plan is also editable in the Django admin (/admin/core/macrocycleplan/) and readable via the JSON API (/api/macrocycle-plans/).

One workout, every athlete: power, heart rate or effort

A structured workout stores its intensity as a percentage of the athlete's own threshold, never as raw watts — so the same session scales to whoever rides it. Since 2026-08-18 it also changes metric to suit them.

When a workout lands on an athlete's calendar (a library drag, a plan apply, an ATP push, or a dynamic-plan entry), the targets are translated into something that athlete actually has:

  1. The metric you authored, if they have that threshold — FTP for bike power, CSS for swim pace, and so on.
  2. Heart rate, if they have a threshold HR but not the authored one. 90% of FTP becomes about 95% of threshold HR — the relationship is not linear, so it is a proper conversion rather than the same number.
  3. Effort (RPE 1-10), if they have neither. Every athlete has this.

Heart rate is deliberately refused for short work. HR lags 30 to 60 seconds behind effort and drifts with heat and fatigue, so a target on a 30/30 set or a 20-second sprint arrives after the interval has ended. If most of a session's work sits in pieces shorter than two minutes, an athlete without power gets RPE instead — which is the honest answer.

Your own workout is never rewritten. The template, plan entry or dynamic-plan entry keeps the metric you wrote; only each athlete's copy is translated. A dynamic plan with three subscribers can therefore show the same session as watts, as heart rate and as RPE on the same day.

One thing to know: the translation happens when the session lands on the calendar. If an athlete has no FTP today and tests next week, the sessions already on their calendar keep the metric they were given — re-sync the dynamic plan (or re-apply) to pick up the new threshold.

Mixing ready-made plans with the macrocycle builder

You do not have to run a whole season through one system. The calendar is the common, additive substrate — ready-made plans, an ATP push, and hand-placed library workouts all land as the same scheduled sessions — so you can mix them per discipline.

Example. Drop the Couch to 5K plan (or your own run sessions) on the run, and build swim and bike with the macrocycle builder: apply C25K from the calendar's Library / Plans panel, then generate and push the ATP for the other disciplines.

They coexist safely. A ready-made plan and an ATP push are independent applications on the calendar. Re-pushing the ATP with replace overlapping dates clears only the ATP's own previous sessions — a C25K run plan (or any separately-applied plan) is left untouched.

One gotcha — do not double up the shared discipline. If the ATP still schedules run days, pushing it adds run sessions on top of C25K.

Set the shared discipline's frequency max to 0. In Sport frequency, set Run min/ideal/max to 0. That takes running out of the plan completely: it stops being chosen as a day's main session, it is dropped from race-week openers, and no brick run is added to a long ride. Unticking Run on each day card does the same job day by day, and the two work together.

A day with all three sports unticked is a rest day. If you clear swim, bike and run on a day card, the builder leaves it empty rather than picking something for you — including strength, which is placed separately but respects an emptied day too.

This generalises: any combination of ready-made plans, ATP blocks and your own workouts, layered by discipline — a proven run plan plus custom bike work, a self-coached runner adding structured swim/bike, and so on. See Workout library and ready-made plans.

What a plan holds

Deploying a plan

Team templates are deployed to cascade their structure to every athlete on the team. See Deploying a macrocycle. Individual plans take effect when status is set to active and the configured dates fall within the current calendar window.

Re-planning

Re-plan when:

Re-planning is done by editing the active plan's JSON config (or re-deriving from an updated team template). Previous versions remain in history because the plan record itself is preserved; only the config evolves.

Saving your plan: which button does what

The builder holds your plan in the browser until you commit it. At the bottom, "Deploy to this athlete" has the three saves that reach the platform:

Save to browser, Export JSON, and 💾 Backup snapshot (not the plan) are your own drafts/backups. The snapshot is a raw copy of the builder state on the athlete's record — handy as a backup, but it does not assign the plan; only 📅 Save as this athlete's ATP does that. A successful save shows a green banner, so you'll know it worked.

Which weekday a template slot lands on

The microcycle template is weekday-keyed: the slot labelled Sat is a real Saturday, whatever date your plan starts on. If your plan begins mid-week the template is rotated to match, so "Saturday = rest" stays on Saturday.

Before 4 Aug 2026 it was not: a plan starting on a Sunday with a Monday-start template put every day one slot early — rest landed on Friday and Saturday became the biggest day of the week. If you built a plan before that date, re-generate and re-push it, or check the weekday of your rest day before sending it to athletes.

If you opened the builder without an athlete

Opening it from the ATP Manager's "Open ATP Builder" link starts a plan with no athlete attached, so the three deploy buttons have nothing to save to. Pick one in "Deploy to which athlete?" in the same card and they all unlock — your plan stays exactly as it is on screen.

Browser drafts are stored per athlete, so a plan drafted with no athlete lives in a separate "standalone" draft. If you re-open the builder from an athlete's page and your work is not there, re-open the plain builder URL (no athlete in the address) and use Load a browser save — then pick the athlete and save properly.

Team template, dynamic plan, static plan: three layers, not three choices

This is the thing coaches most often read as a fork in the road. It isn't one. The three things answer different questions, and one macrocycle can become all three.

What it holds How an athlete gets it
ATP / team template the shape of the year — phases, volume, periodization you deploy it, and each athlete gets their own ATP to adapt
Dynamic plan the sessions, on a shared calendar they subscribe, and your later edits reach them
Static plan the same sessions, copied you apply it, and it is frozen from that moment

So a finished macrocycle can be saved as the team's template for the record and for review, pushed onto a dynamic plan so the squad actually receives the sessions, and still never deployed to anyone individually. Deploying per athlete is a choice you make when someone needs their own version to diverge — an injury, a different race, a different starting point.

Saving to a team without picking an athlete

Save to a team at the bottom of the builder writes the macrocycle straight to a team template. You do not have to build it on one athlete and promote it afterwards, which used to be the only route and made the squad's plan start life as somebody's personal one.

Re-saving under the same name updates that template rather than adding a second one, so refining a draft over a week leaves one entry, not five. Give it a new name when you genuinely want a separate version to compare.

Which one for a squad?

If everyone trains the same week, a dynamic plan is what you want: one calendar, one edit, everyone updated. Reach for deploy to athletes when their weeks need to differ — then each athlete's ATP is theirs and your changes to the template no longer follow them automatically (the ATP Manager marks those copies stale so you can see which ones have drifted).

Last updated Aug 20, 2026

Still stuck? Ask us a question and we'll write up an answer.

Ask a question