Onsen booking UX
Audit, new flow and handoff
Everything in the prototype was read from the live IBIS booking iframe (book.onsen.co.nz) and the onsen.co.nz experience pages on 4 November 2026, using code only. No bookings were made and nothing was added to a cart.
What gets in the way today
The new flow
Today
- Pick one of 7 experience pages
- Read the rules on the page
- Set "Number of Pools" and shuttle people
- Scan a 5-day grid for a cell that is not full
- Pick quantities from up to 13 dropdowns
- See a price for the first time
- Add to cart, repeat on another page for anything else
Proposed
- Say who is coming. Every option shows its price and fit for this group
- Choose an experience, or a suggested combination
- Confirm guests and treatment length
- Pick a day from an availability calendar, then a time
- Choose a treatment per guest from cards
- Add platters and notes
- Review the visit, add more, add the shuttle once
- One checkout screen
Design notes
Switch on "UX notes" in the prototype to see these in place.
- Ask who is coming, once, up front. Group size and whether children are coming are captured before anything else. Every experience card then shows the price for this group and whether it fits, instead of guests finding the limits after they pick a time.
- Show the price for this party. Totals use the real tiers (an Original hot pool is $122 for 1, $180 for 2, $225 for 3, $260 for 4). Today the widget hides the unit price for soak-only bookings and only shows a total after a time is chosen.
- No dead ends. When an experience cannot take the group, the card says why and offers a combination that works, in one tap. Example: 3 guests on Original Onsen + Treatment becomes twin share for 2 plus Oval Onsen + Treatment for 1.
- Rules where the decision is made. Age limits, twin share, child hours and evening rules sit on the card. Today they only appear on the WordPress page, and the widget enforces twin share by silently disabling Add to cart.
- Choose the treatment length before the time. Guests pick 1, 1.5 or 2 hours first, so every time shown is bookable for them. The live grid mixes 60, 90 and 120 minute sessions in one table and the length selector is hidden with CSS.
- A calendar that shows availability. Each day is marked open, limited or full, with a jump to the next available date. This replaces a 5-day grid where most cells read "Fully booked".
- Times grouped by part of day. Morning, afternoon and evening (lantern light from sunset). Low stock is shown honestly. Evening sessions are locked with a clear reason when children 5–11 are booked, instead of failing later.
- Full day? Waitlist plus alternatives. If nothing is left, offer the waitlist and the other experiences that still have times on that date, keeping the date and group.
- One treatment card per guest. Each guest picks from cards showing price, length and nut and pregnancy notes. This replaces 6 to 13 quantity dropdowns (0, 1, 2) that had to add up to exactly 2.
- Add-ons after the main choice. Platters use steppers capped at the number of guests (the same limit IBIS enforces) with a running total. Today they show a quantity of 0 until a treatment is chosen, with no explanation.
- Book a visit, not a single slot. Guests can add more experiences to the same visit (Tri-Bathe then Treatment Only, or an Original and an Oval hot pool side by side for a group), see the day as a timeline, and book the complimentary shuttle once for everyone.
- One short checkout screen. Contact details, gift voucher or promo code and payment on one screen, with the hold time visible. Mobile is required only when the shuttle is booked, as the driver may call.
- A confirmation that helps people arrive. Itinerary, add to calendar, shuttle pick-up point, address and what to bring.
- The total is always visible. A running summary sits beside every step on desktop and as a bottom bar on mobile, so the next action and the cost are never off screen.
What the booking system contains
| Experience | IBIS filter / codes | Guests | Ages | Price | Start times seen |
|---|---|---|---|---|---|
| Original Onsen + Treatment | prodgroup-ultimateURE2P1HURE2P90URE2P2H | 2 guests per experience | 16+ | Per person, set by the treatment you choose | 16 / 6 / 8 |
| Original Onsen Soak Only | prodgroup-originalORIGINAL | 1–4 guests per hot pool | 5+ (evenings 12+) | $122 / $180 / $225 / $260 | 46 |
| Oval Onsen + Treatment | prodgroup-serenitySS1P1HSS1P2H | 1–2 guests | 16+ | Per person, set by the treatment you choose | 8 / 4 |
| Oval Onsen Soak Only | prodgroup-ovalSP | 1–2 guests | 16+ | $127 / $185 | 20 |
| Tri-Bathe Only | TriExpTriExp | 1–2 guests | 18+ | $137 / $195 | 34 |
| Treatment Only | prodgroup-treatTREATTREAT2H | 2 guests | 16+ | Per person, set by the treatment you choose | 8 / 4 |
| Pool for Charity | prodgroup-charityCHARITY | 1–4 guests | 5+ | $75 per hot pool, 1–4 guests | 1 |
| Treatment | Length | Original + Treatment | Oval + Treatment | Treatment Only |
|---|---|---|---|---|
Aotearoa Escape ESCAPE | 60 min | $265 | $285 | $170 |
Onsen Revival Skiers | 60 min | $280 | $300 | $185 |
Paradise Bespoke Massage PARA | 60 min | $270 | $290 | $175 |
Hanakasumi by Sothys HANAKASUMI | 60 min | $295 | $315 | $195 |
Seasonal Care Facial by Sothys SEASONAL | 60 min | $270 | $290 | $175 |
Organics Radiance Treatment by Sothys ORGANICS | 60 min | $285 | $305 | $195 |
Aotearoa Oasis OASIS | 90 min | $340 | – | – |
Onsen Revival 90 Skiers | 90 min | $360 | – | – |
Pure Fiji Hot Stone Massage HOTSTONE | 90 min | $345 | – | – |
Seasonal Treatment by Sothys (90) SEASONAL2 | 90 min | $350 | – | – |
Aotearoa Journey JOURNEY | 120 min | $400 | $420 | $305 |
Ultimate Paradise Hot Stone Experience ULTIMATE | 120 min | $410 | $430 | $315 |
Seasonal Treatment by Sothys (120) SEASONAL2 | 120 min | $430 | $450 | $335 |
Add-ons on every experience except Pool for Charity: Antipasto Platter $26, Cheese Platter $26, Vegan Crudites $22, Seasonal Fruit Platter $20, Salmon Bagel $22, Chicken Bagel $22. Maximum one of each per guest.
Developer handoff: IBIS endpoints
| Method | Path | What it does |
|---|---|---|
| GET | /hire/selection?filter={filter} | Selection page for one product group. Hidden field SinglePageGroupCode (ULTIMATE, SERENITY, TREAT). |
| POST | /hire/Method_RefreshSelection | Form: SinglePageGroupCode, WorkingDate ("12 Nov 2026"), ProductCode, ResourceCount, Transport. Returns a 5-day HTML grid. Each open cell links to a departure code hire.YYYYMMDDTHHMM.{CODE}.. with "Avail: n". |
| GET | /hire/add?departureCode=…&resourceCount=n&transport=n | Unit options for that session: adult and child rates, or the treatment menu with per-person prices, plus the six platters. Read only. |
| POST | /hire/Method_RefreshEdit | Recalculates totals for chosen units (Resources[i].Options[j].Units). Read only. Used here to confirm the tiered pricing. |
| POST | /hire/addedit | Adds to cart and holds stock. Not called during research. |
| POST | /cart/Method_SetPromoOrVoucher, /cart/Method_Checkout | Voucher and checkout. |
Rules found in Onsen's custom IBIS script: twin share forced to 2 guests per room on Original + Treatment and Treatment Only; Original + Treatment capped at 5 experiences (10 guests); Oval + Treatment capped at 2 guests; Treatment Only limited to one room; Original Onsen capped at 6 hot pools; Tri-Bathe and Oval soak capped at 2 per selection. The prototype caps Original + Treatment at 8 guests because no session showed more than 4 rooms available.
Questions for Onsen and IBIS
- Can IBIS expose availability as JSON, or do we build a thin server adapter that parses Method_RefreshSelection?
- How long does IBIS hold a cart, so the timer on the details screen is accurate?
- What are the Oval Onsen bath scent and soak options, and should guests choose online?
- Can one shuttle booking cover several experiences in the same visit?
- Guests aged 12–15 book at the adult rate in the Original Onsen (IBIS only has Adult and Child 5–11). Confirm this is intended.
- Does the current payment provider support Apple Pay and Google Pay?
- Should Pool for Charity offer platters online? IBIS did not show add-ons for it.