Customer Portal & Loyalty (PL-T198)
At a glance
The logged-in customer portal on each tenant's CMS. My-bookings split into three lazy-loaded buckets (upcoming, history, cancelled) paginated 50 per page, repeat-book lifting prior configuration via sessionStorage prefill, ChainPassport tier badge with animated progress arc, NPS prompt that auto-opens after a visit, self-service rebook/cancel with live quote preview and party-size modify, gift-card balance overview, and notification preferences with full audit trail.
How it works
Logged-in customers land at /account/bookings, which renders three lazy-loaded buckets — upcoming, history, cancelled — each paginated 50 per page, so the page paints instantly even for power users with hundreds of past visits. Repeat-book lifts the configuration of any past booking (resource type, party size, food package) via POST /me/bookings/{id}/repeat, prefills sessionStorage, and redirects to /book/{lane} so the customer just picks a date — every other field is filled. The LoyaltyTierBadge component shows ChainPassport tier (regular / gold / platinum) with an animated progress arc towards the next tier; tier rules and thresholds come from the venue profile.
After a completed visit, the platform schedules an NPS prompt — when the customer next opens the portal, NpsPromptModal auto-opens (0-10 score plus optional comment), feeding both analytics and the marketing automation post-detractor recovery loop. Self-service rebook and cancel use CancelBookingDialog with a live quote preview (shows what fee/refund applies under the venue's cancellation rules), a reason picker, and party-size modify in-place. /account/gift-cards shows balance, expiry, and redemption count for every card the customer has added. /account/preferences exposes per-channel opt-outs (email, SMS, push) with an audit trail so support can see when a preference changed. The whole portal is tenant-branded via ChainWhiteLabelConfig, just like the booking wizard.
Key capabilities
- /account/bookings with three lazy-loaded buckets (paginated 50/page)
- Repeat-book via POST /me/bookings/{id}/repeat + sessionStorage prefill
- ChainPassport tier badge with animated progress arc
- NPS prompt auto-opens when outstanding prompt exists
- Self-service rebook / cancel with quote-preview + party-size modify
- Gift-card balance overview with expiry + redemption count
- Notification preferences with audit-trail (tenant-branded throughout)
In practice
Three weeks after their first visit, a customer logs in to plan another evening. They open My Bookings → Past, find last month's reservation, and tap Repeat — sessionStorage fills with two lanes, party of four, and the previous food bundle. The wizard opens at the date-picker; they pick next Saturday and confirm.
Before submit they notice the LoyaltyTierBadge — they're 2 visits from gold tier with its 10% discount, which the next booking will trigger. After they confirm, the NPS modal from their previous visit pops asking how it went; they answer 9 and add "Lovely outdoor seating". The tenant operator sees the score in analytics, and the marketing engine quietly skips them from the post-detractor recovery loop since they're a clear promoter.
Features in this subsystem
8| ID | Status | Features |
|---|---|---|
| F22.16.01 | Shipped | "My bookings" view on tenant CMS (/account/bookings, three lazy-loaded buckets) ✅ |
| F22.16.02 | Shipped | Booking history (history + cancelled tabs, paginated 50 per page) ✅ |
| F22.16.03 | Shipped | Repeat-book ("same as last time") (POST /me/bookings/{id}/repeat + sessionStorage prefill → /book/{lane\ table|event}) | ✅ |
| F22.16.04 | Shipped | ChainPassport tier-progress badge (<LoyaltyTierBadge> med animerad progress-arc, regular/gold/platinum) ✅ |
| F22.16.05 | Shipped | NPS feedback after visit (<NpsPromptModal> 0-10 + comment, auto-open när outstanding prompt finns) ✅ |
| F22.16.06 | Shipped | Self-service rebook / cancel (<CancelBookingDialog> med quote-preview + reason, party-size modify) ✅ |
| F22.16.07 | Shipped | Gift-card balance overview (/account/gift-cards, balance + expiry + redemption count) ✅ |
| F22.16.08 | Shipped | Notification preferences (/account/preferences, email/SMS/push toggles + audit-trail) ✅ |
Related subsystems
Stakeholders who need this subsystem
Surfaces in 8 stakeholder analyses