Sports, Fitness & Athletics// definition

A session series is not eighteen sessions: the recurrence record explained

In short

A recurring session is stored as a rule plus a list of exceptions, not as 18 rows — until somebody edits one week, at which point the system either records an exception against the rule or turns that occurrence into its own object. Every confusing this-event-or-all-events prompt, and every booking that survives a cancelled week, comes from that single storage decision.

Key takeaways

  • A series is a rule plus an exception list. The occurrences you see may not exist as rows at all.
  • Store a local start time and a named timezone, never a fixed offset, or the clock change moves your sessions.
  • Editing one week writes an override; editing all following splits the series into 2 and renumbers the future.
  • Bookings, attendance, payments and credits must attach to the occurrence, never to the series.
  • An open-ended series with no horizon quietly inflates the denominator in every utilisation report.

A recurring session is a rule with exceptions attached, not a set of sessions. "Under-14s, Tuesdays and Thursdays, 18:00, pitch 2, from 9 September to the end of term" is 1 record. The 18 sessions a coach sees may be rows in a table or computed on the fly, and which it is decides what happens when somebody moves one week.

Read it as a compound object rather than a setting — the habit behind what the delay on a live match stream is made of. Get the parts right and the awkward behaviour stops being mysterious.

The fields a recurrence record has to hold

FieldWhat it holdsWhat breaks when it is missing or wrong
AnchorLocal date and start time of the first occurrence, with durationEvery occurrence inherits the error, and fixing it moves history
TimezoneA named zone, not an offsetSessions shift by an hour at a clock change, or fail to shift
RuleFrequency, interval, and which weekdaysA Tuesday-and-Thursday class becomes 2 series nobody can edit together
End conditionAn occurrence count or a final date — 1 of the 2, never bothA series that runs forever, filling calendars and reports
HorizonHow far ahead occurrences are generated or shownMembers cannot book far enough ahead, or book past the term
Exception listDates the rule generates that do not happenCancelled weeks reappear when the series is rebuilt
OverridesPer-occurrence changes to time, venue, coach or capacityA moved week silently reverts when the series is edited
The recurrence record, field by field

Materialised rows or computed on read

There are only 2 strategies, and every scheduling product picks one. The trade is not subtle.

OperationOccurrences written as rowsOccurrences computed from the rule
Move one weekCheap: update 1 rowExpensive: materialise the occurrence, then exclude the generated one
Change the ruleExpensive: rewrite future rows, decide what happens to edited onesCheap: change 1 record
Attach a bookingNatural: the booking points at a rowNeeds a stable occurrence id derived from series and start date
Ask who is on pitch 2 at 18:00One indexed lookupExpansion at query time, degrading across venues and seasons
Audit what happenedEach occurrence carries its own historyThe past is recomputed, so a rule change rewrites it
Use it whenBookings, attendance or money attach to sessionsThe calendar is display-only, such as a public fixture list
The 2 storage strategies, compared on the operations a club actually performs

What "this one" and "all following" actually do

  1. Edit this occurrence. Writes an override against 1 date. The rule is untouched, so a later series edit must decide whether to respect the override — products differ, which is why a moved session sometimes reappears in its old slot.
  2. Cancel this occurrence. Adds the date to the exception list. That is half the job: the bookings, credits and attendance attached to it need their own decision, and no scheduling library makes it for you.
  3. Edit all following. Splits the series in 2 — the original ends the day before, a new one starts at the edit date. Everything referencing later occurrences by series id has to survive the split.
  4. Edit the whole series. Rewrites the past as well as the future unless past occurrences are protected. Freeze anything already marked, paid for or attended, and apply changes forward of today.

Bookings, attendance and money attach to the occurrence

This rule survives every product decision above: nothing concerning a specific date may reference the series.

  • A booking names a date, not an intention. "Booked onto Thursdays" cannot express "coming on the 14th", and cannot be cancelled for 1 week without ambiguity.
  • An attendance mark is meaningless without the occurrence it was taken at — the vocabulary that makes a register countable is in present, absent, excused.
  • A credit is consumed against 1 occurrence, and a cancelled occurrence must return it: a credit is an entitlement with a scope and an expiry.
  • A waitlist promotes into an occurrence, never a series, which is where promotion quietly fails: full class, empty floor.
  • Utilisation counts occurrences, so an open-ended series inflates the denominator all year — the arithmetic in the denominator that hides.

A series is a plan and an occurrence is a fact. Anything that can be booked, marked, paid for or refunded belongs to the fact.

When specifying a club system, write the recurrence record out in full before anyone draws a screen: 7 fields, 2 storage strategies, 4 edit operations. Making them explicit keeps scheduling, attendance and the facility coherent as terms, venues and coaches change. Building that layer is routine AI agents and automation work in our sports and fitness practice, with the caveats in agents in production.

Frequently asked questions

Short answers to the follow-ups this page tends to raise.

What happens when you edit one session in a recurring class?

The system either records an override for that date and leaves the rule alone, or it turns that occurrence into an independent object and excludes the generated one. Both are correct implementations with different consequences: the first can be overwritten by a later series edit, the second drifts from the rule. Ask which your platform does before relying on a moved week staying moved.

Should recurring sessions be stored as rows or generated from a rule?

Generate from a rule, and materialise an occurrence the moment anything attaches to it — a booking, an attendance mark, a payment or an override. That hybrid keeps rule changes cheap while giving every real event a stable object to point at. Pure generation is only adequate when the calendar is display-only.

How far ahead should a series generate occurrences?

Far enough to cover the booking window plus a margin, and no further: usually the end of term or a rolling few months. An unbounded series fills reports, inflates utilisation denominators and makes rule changes expensive. How far ahead members may book is a separate policy, and the shorter of the 2 numbers.

What happens to bookings when a coach moves one week's session?

Nothing automatic, and that is the point: moving an occurrence changes a time, while a booking is a member's commitment to attend. Decide explicitly whether bookings follow the move, whether members are notified, and what happens to anyone who cannot make the new slot.

  • recurrence
  • scheduling
  • data model
  • bookings
// shipped work

The work behind this page

Builds from our portfolio that this page draws on.

Working on something in this space?

Tell us where you are in a sentence or two. We'll tell you honestly whether we're the right team, and what a sensible first slice of the work looks like.

Start the conversation