Booking — End-user view
This page describes who clicks what in the booking flow, from the customer and admin/staff side.
Customer (Customer Portal / AimyMe)
Step 1 — Select sessions
- Open Booking Flow → Course List, pick a course → see available sessions.
- Select sessions for an attendee. At this stage the system creates no booking state — it only keeps client-side selection.
- If not signed in: click Next → login popup opens; the selection is preserved after login.
Course List — URL context & site filter
- Customer Portal (
/programs): keeps_eandorg_id(allowed sites), drops_b; site access is not limited by_b. AimyMe and the Embedded Booking Page also never carry_b. - Admin Mode (Admin Portal / Onsite App): always has
_b; the site list only contains sites per BusinessUnit + user permissions. GlobalBookingView = False→SiteIdis preselected and the Site Filter is hidden — applies whether coming from the Landing Page, Course Details, make-another-booking, or a direct URL.- Landing Page Book Now → opens Course List with that site preselected; make another booking → keeps the site preselected if the site is still accessible.
- User clears the filter → sees programs of all accessible sites;
_bis not re-added on the customer surface. - A site param outside the allowed set → ignored, access is not expanded; going back from Course Details → filter state is restored if the site is still in the access set.
Real-world example: A parent opens
/programsfrom a marketing link that carries_b=siteAoutside their permissions. → Do not let a client parameter decide the customer's site scope. → Course List drops_band only shows programs of sites allowed byorg_id.
Course List — course cards by category
| Category | Tag on card |
|---|---|
| Class | Has a weekday tag |
| Subscription | Has a weekday tag |
| Holiday | No weekday tag shown |
| Term Care | No weekday tag shown |
- A card shows manually overridden
Term Planner Requirements/Pricevalues, not regenerated ones, unless the Term Planner actively overrides again. - Card height follows content; cards in the same row are as tall as the tallest card in that row (per-row, not uniform across the grid).
Real-world example: Admin overrides the price of a Holiday course, then opens Course List for the customer. → The manually edited price is shown, not recomputed. → The Holiday card has no weekday tag and shows the saved manual price.
Step 2 — Review & pay
- The customer's account holder is preloaded and locked (cannot be changed).
- Review sessions, add-ons, and applied discounts.
- Choose a payment method → Submit:
- Pay Now (full / deposit), Direct Debit, or Pay Later (if eligible).
- After submit, depending on configuration: confirm immediately, or receive a Quote to review then Accept.
My Bookings
- View placed bookings, Edit (if still editable), or cancel per policy.
- When editing a booking related to another attendee/course (same
ActionLogId), a combine popup may appear — see Combine booking rule.
Bookings → View Calendar
- Each event's time range uses the shared time display format: the user's saved
timeFormatif present, otherwise the business unit'stimeDisplayFormat. - 12-hour format → shows proper
AM/PM, notttoken; 24-hour format → noAM/PM/tt. - Session/calendar popups show times per the enterprise timezone mode (INV-ENTTZMODE-003):
- Enterprise
Local→ shows the enterprise's local time (original wall-clock), not shifted by the user/browser timezone. - Enterprise
MultiZone→ converts to the user's savedtimezoneIdentifier; none → falls back to the browser timezone (chain: user saved timezone → browser timezone). - Mode concept: see Timezone & DateTime.
- Enterprise
Real-world example: A user in Vietnam opens the session popup of a
Localenterprise based in Sydney. → Avoid showing the wrong time by auto-shifting to the user's timezone. → The popup shows the original Sydney time; with aMultiZoneenterprise, it shifts to the user'stimezoneIdentifier.
Admin / Staff (Admin Portal / Onsite App)
New booking
- Open Normal Booking Step 2 for a new booking: Account Holder Info starts empty — the system does not preselect from login/route/profile, nor from the account Subscription Booking just selected.
- Staff must select an account (or select an attendee to derive the account) before submit is enabled.
- Changing the account clears attendees and account-scoped selections.
Actions & confirmation
- Admin Mode groups submit into a single
Submitcontrol → opens a 3-choice menu: Submit, Submit & Confirm, Submit & Confirm Attendance (no longer separate buttons). - A selection not eligible to submit → the
Submitcontrol is disabled, all 3 choices do not run. Customers outside Admin Mode keep the old buttons and do not seeSubmit & Confirm/Submit & Confirm Attendance. - Other actions: Confirm Booking, Cancel Booking.
- Each action shows a confirmation popup listing bookings as
BK-xxxx(with attendee names when available). - For an edited confirmed booking: the Billing Difference preview appears before the confirmation popup — except
Submit & Confirm Attendance(never needs a preview). - The popup has a Mute Notifications option (off by default) — applies to submit/confirm/ submit-confirm/submit-confirm-attendance/cancel.
Editing a confirmed booking
Submit & Confirmin edit mode is split into two steps: submit (silent, muted) → review Billing Difference → click Confirm to actually confirm.Submit & Confirm Attendancedoes not open Billing Difference: after submit → confirm attendance immediately (statusAttendance_Approved, not yet fully confirmed).- Staff may Edit again, or View Submitted Booking in Booking Manager without confirming.
Booking Rule Options (admin override)
Admins can turn off individual rules in the Booking Rule Options panel, for example:
- Booking Cut-off OFF → past sessions become selectable (all program categories).
- Height / Weight Restriction OFF individually → bypass that one rule; the other still blocks.
Closure Day Booking Adjustment
Admin Portal → the Closure Day Booking Adjustment page: manage bookings affected by a closure day.
- Layout:
PageHeader→ content card → filter group → programme info → action area → booking table. Narrow viewport → filters wrap, table keeps horizontal scroll. - Filters: Site, Closure Days, Programmes, Sessions (multi-select); use
Programme, notProgram. - States: no Site → prompt; no Closure Days → prompt to pick 1+; no bookings → empty state (not implying a finance/worker error); filters match nothing → prompt to adjust.
- No booking selected →
cancel-and-creditdisabled; bookings selected → shows selected/total eligible. - Cancel confirmation: danger, distinguishes singular/plural, states it cancels bookings and generates matching credit notes.
- UI-only: no change to API payload, persistence, finance, or worker processing.
Real-world example: Admin picks a site + one closure day to see who is affected before bulk cancelling. → Avoid blind actions on empty data and make the destructive action clear. → The page lists the affected bookings; admin selects them and clicks cancel-and-credit, a danger dialog confirms and generates a credit note per booking.
Notification template — Checkout Instruction
- Booking templates have a
CheckoutInstructionfield (plain text) and aplaceholder inserting the whole block; no token in the template → no block inserted. - Renders by the booking's
Billing.PaymentOptionId:PayNow/PayNowDeposit→ render;PayLater/DirectDebit/null → replaced with an empty string.→ checkout URL, keeping line breaks. - The Booking Confirmation - Parent template adds
,,,,,. - The
ConfirmBooking_Accountgenerator replaces every placeholder before sending (no token leaks as-is):→ enterprise logo;→ attendee/program/price/date range;→TermProgramSet.Instruction;/→ rich-text HTML (PDF: view/download link). Not configured → empty.
Real-world example: Admin writes "Booking Confirmation - Parent" with a reminder to pay before class. →
PayNowcustomers receive the checkout instruction at the right time;PayLatercustomers are not misled. → The template inserts; aPayNowbooking rendersCheckoutInstructionwith the link, aPayLaterbooking replaces the block with an empty string.
Next: Core concepts.