What a macrocycle is, how the team-template-to-roster model works, and where to manage plans.
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 MacrocyclePlan model supports two ownership modes:
is_template=True, team set, athlete blank).
A master plan attached to a team. Designed to be cascaded down
to every athlete on the team.parent_template link).A plan can be in three states: draft, active, or archived.
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.
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 (delete the saved plan without leaving the page — already-pushed calendar workouts stay until you re-push or clear them on the calendar).
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.
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.
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.
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 dynamic plan… 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.
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/).
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 microcycle template still schedules run days, pushing it adds run sessions on top of C25K. So set the shared discipline to 0 sessions/day in the microcycle template (the per-day caps above), so the ATP fills only swim, bike and strength and the run stays owned by C25K.
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.
parent_template link if the plan was
derived from a team template.config_json): the full builder state
including dates, phases, weekly volume targets, and any
per-week overrides.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-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.
Still stuck? Ask us a question and we'll write up an answer.
Ask a question