Customer Portal & My Home — Overview
Customer Portal is Tuke's customer-facing front end: per-site landing, booking, subscription booking and management. My Home is the home page (staff + portal): header navigation + display-timezone handling.
The portal runs in its own app mode, separate from the Admin Portal: bootstrap only calls the APIs that match the mode. All data shown to customers is scoped to the signed-in account and read-only — the portal does not mutate enrollment, billing, invoice, payment, or credit note.
Quick mental model
What the customer portal covers
| Area | One line |
|---|---|
| Bootstrap scope | Staff-context APIs only in Admin Mode; caller account outside Admin Mode; identity/timezone hydrate in every mode. |
| Layout | Content width follows the Booking UI max width; full-width only via an explicit exception. |
| My Home header | Title on the left; Calendar/Timetable/My Profile menu on the right, per BusinessUnit permission/config. |
| Local time | Time by ServiceAreaId (Local vs MultiZone) and User.TimezoneIdentifier. |
| Timezone prompt | First-time prompt per session for staff My Home; session popup for the portal. |
| Sidebar quick-select | Changes the timezone right from the drawer, auto-save, no confirm needed. |
| My Subscriptions | Account-scoped, read-only subscription management, route /{curl}/enrollments. |
| My Bookings section | "My Subscriptions" section by status tab inside My Bookings. |
| Share link | Booking/program links use the Customer Portal origin, never leaking admin context. |
| Site contact | Email/phone/address icons on the Booking UI and the landing site card. |
| Subscription self-service | My Bookings supports Extend according to start/end permissions; the flyer appears in Step 1. |
| Settings bootstrap | Context-keyed snapshot with request deduplication and stale-response guard; old BU data is not reused. |
Suggested reading order
Related
- Booking — customer-facing booking flow, Program Details Page, checkout.
- Finance — invoice/payment are read-only in the portal.
- Master Data — site/account/attendee scope,
BusinessUnitPermission. - Subscription — enrollment, My Subscriptions, subscription manager.
Current implementation
- Customized Bookings and Subscriptions Course List grids show four cards per row at
xxl; smaller breakpoints and the booking flow remain unchanged. - Subscription Booking Step 1 renders the Flyer from a public-safe manifest; a broken image does not block booking.
- My Bookings supports submit-only Extend at the permitted start/end boundary; past schedules are not selectable. The portal has no Confirm or billing mutation.
Real-world example: A customer changes from BU A to BU B while BU A is still loading. → The context-keyed loader drops the stale response and renders only the BU B snapshot.