Why This Matters

This is the core commercial decision of the booking. The experience type a guest selects — Ticket Only, Dinner Show, or VIP — determines the entire pricing structure, what add-ons are available, and what the guest can expect on the night. Getting this step right is critical because it shapes every subsequent choice and the final total on the invoice.

How It Works

The step presents three mutually exclusive experience paths through a tabbed interface: Ticket Only, Dinner Show, and VIP. Each tab reveals a different set of offers tailored to the guest’s party size and the event they have chosen. The guest must make a selection in order to proceed. The active tab is determined by the selected experience type. Switching tabs is possible when the event supports the target path, but the guest must land on a valid offer before continuing.

Ticket Only

Ticket Only bundles are fixed-price group add-ons — the stated bundle price is added once for the whole party, not per person. Ticket admission is still charged per guest. For each guest count tier, the guest is presented with exactly four options:
OptionDescription
Bundle AFirst tier bundle (e.g., Essentials)
Bundle BSecond tier bundle (e.g., Comfort)
Bundle CThird tier bundle (e.g., Premium)
No Extra BundleShow admission only — guest can pre-order add-ons after Menu Review when add-on offers exist
The three bundles are fixed offerings per guest count tier. Final Ticket Only pricing is ticket-only(showSlug) × guest count + selected bundle price. “No Extra Bundle” is a valid selection that allows the guest to skip bundle inclusions and instead browse available add-ons after Menu Review when add-on offers exist. This path is useful for guests who want show admission only or who prefer to build their own experience through add-ons. For groups of exactly 5, a special upsell appears below the four options: the 5-Guest Upgrade Options. This is a two-path decision:
  • Option A — 5-Seat A La Carte: Each guest pays individually at the per-person rate. No table hold is reserved.
  • Option B — 6-Seat Table Hold: The group secures a table for 6, with the 6th seat held as a placeholder. This option may be disabled if the venue has no remaining 6-seat capacity.
The backend owns all pricing. The frontend displays the fixed bundle price for the selected tier and renders the ticket and bundle breakdown from the backend estimate.

Dinner Show

Dinner Show starts with the show-specific base dinner ticket: ticket-with-dinner(showSlug) x guest count. Packs are optional fixed-price group add-ons on top of that base dinner ticket. When a pack is selected, the backend adds pack(packSlug) once and returns the final estimate; the frontend displays that backend estimate instead of recalculating Dinner Show totals. Guests select one pack based on their group size:
Group SizePackIncludesPrice
Solo (1)The Solo Toast1x Signature Cocktail200,000
Duo (2)The Romantic Pack1x Single Rose, 1x George XV Brut840,000
Trio (3)The Trio Pack1x Wine Bottle, 1x Souvenir Polaroid850,000
Table of 4The Celebration Pack1x George XV Brut, 1x Souvenir Polaroid960,000
Group of 5The Grand Pack2x Wine Bottles, 1x Souvenir Polaroid1,520,000
Group of 6The Legend Pack1x Wine Bottle, 1x George XV Brut, 1x Polaroid1,630,000
The guest can also decline all packs. Selecting “No Pack” is a valid choice and keeps the total at the base Dinner Show price. Pack prices are not multiplied by guest count. The guest-count tier controls which pack appears and what fulfillments are included; it does not turn the pack price into a per-person charge. The Romantic Pack carries a “MOST POPULAR” badge (using the isRecommended flag) and is pre-selected by default (using the isDefault flag) set by the admin in the bundle configuration. Both flags are independent — pre-selection can be removed with one click.

VIP

VIP represents a premium seating tier above the standard Ticket Only or Dinner Show experience. When VIP is available for the selected event, the tab shows the VIP offer with its price and included fulfillments. If VIP is sold out, the tab is disabled and shows a “Sold Out” badge. VIP pricing and inclusions are defined at the show level and override any standard bundle or pack selection.

Special Occasion

Below the offer cards, a Special Occasion section lets the guest mark the nature of their visit. Five occasion types are available:
  • Birthday
  • Date Night
  • Special Occasion
  • Business
  • Other
Each occasion type has an associated icon for visual identification. When the guest selects an occasion, a free-text field appears allowing up to 500 characters for a personal message. This message is passed to kitchen and floor staff so they can prepare accordingly — for example, a birthday cake for a Birthday booking, or a special setup for a Business event.

Key Concepts

Bundle vs. Pack distinction: A bundle is a Ticket Only offer. A pack is a Dinner Show offer. These are never interchangeable — the system filters which type appears based on the selected booking path and offer conditions. No Extra Bundle path: When a guest selects “No Extra Bundle” on the Ticket Only path, they skip bundle inclusions and can proceed to Add-ons after Menu Review when add-on offers exist. This is a valid commercial path — not an error state. Default pre-selection: For Dinner Show, the Romantic Pack is pre-selected by default using the isDefault flag. This is an admin-controlled flag, not a hard rule — if isDefault is false for all packs, no pack is pre-selected. 5-Guest Upgrade: This option appears only when guestCount === 5 and selectedType === "TICKETS_ONLY". Option B (6-seat table hold) internally increments the capacity-tracked guest count to 6 while keeping reservation.guests = 5.

Technical Details

The step state is built in buildBookingExperienceStepState (booking-context.selectors.ts). Key state fields driving the UI:
FieldTypePurpose
selectedTypeBookingSelectedTypeActive experience type: TICKETS_ONLY, DINNER_SHOW, or VIP
activeExperienceTabBookingExperienceTabWhich tab is currently displayed in the UI
experienceStep.ticketOnly.bundlesBookingTicketOnlyBundleCard[]Filtered to exactly 3 cards matching the guest tier
experienceStep.dinnerPacksBookingDinnerPackCard[]Packs filtered by guest count — one pack selected per group size
experienceStep.vipBookingVipPackageCardVIP offer built from vipPackageOffer or show-level defaultVipPrice
fiveGuestOption"A" | "B" | undefinedControls 5-guest upsell pathway selection
occasionOptionsOccasionOption[]Available occasion types with isSelected state
occasionMessagestringFree-text message, max 500 characters
buildTicketOnlyOffers filters offers by BookingPath.TicketsOnly. buildDinnerPackOffers filters packs by guest count — one pack is shown per group size. The continue button is disabled when selectedType === null, forcing the guest to pick an experience before advancing. See also: Offer concept — the unified offer model that underlies bundles, packs, and add-ons. Pricing model — the full pricing decision matrix. Ticket Only Bundles — all bundle tiers and prices. Dinner Show Packs — all pack types and upgrade options.