Page heading and reassurance. Purpose: set expectations that this is a request, not a payment. Data: service title and teacher first name from the service record. SEO: noindex, no canonical to avoid duplicate funnel pages. Analytics: booking_request_started with service id and entry point (service page, profile, search card).
Step indicator. Slim funnel progress replaces the full nav. Completed steps are clickable to go back; later steps are not. Progress is saved as a draft in local storage and, when logged in, on the server so a returning customer resumes at the last step (draft expires after 14 days).
Step 1, event. Event type is a select prefilled from the service category. "Who is it for" is optional first name only (max 40 characters). Dance style chips are multi-select, prefilled from service styles. Validation: event type required, message "Choose an event type".
Step 2, date and place. Date picker blocks dates the teacher has marked unavailable and anything inside her lead time (example: 7 days). Error copy: "Amelia is not available on this date. Try another date or send a flexible request." Postcode validated against UK format and checked against the travel radius; the travel charge or "Included" line updates the summary live. Online option hides postcode and venue type. Data source: teacher availability and travel settings from WF-47.
Step 3, group. Guest count integer 1 to 500; min and max come from the selected package. Age range select (under 3, 3 to 5, 6 to 8, 9 to 12, teens, adults, mixed). Safeguarding: if ages include under 18s, the teacher sees "children present" on the offer. Accessibility text is optional, max 500 characters, shared only with this teacher.
Step 4, package and add-ons. Three package radio cards (Basic, Standard, Premium) with price, duration and group size from the service. Add-ons are checkboxes with price. Changing selection updates the order summary instantly. If the customer arrived with a package chosen on WF-07 it is preselected. Instant-book services skip this request and go straight to 22-checkout.html when the date is available.
Custom quote link. Switches the form to a free-text brief (budget range, what you need) and removes package selection. The teacher offer builder (WF-49) then starts blank.
Step 5, message and send. Message required, 20 to 1000 characters. Contact-detail patterns (phone, email, links) are detected and a gentle warning shows: "To stay protected, please keep contact and payment on Popdance." Multi-teacher option creates linked requests, max 3, each teacher sees only their own. Logged-out users enter an email and we create an account after sending (magic link). Submit button label: "Send request to Amelia". Disabled and shows spinner while submitting. Success goes to a confirmation toast and then 21-booking-offer-review.html in the awaiting state.
Sticky order summary. Shows service, teacher, rating, selected package, add-ons, travel, estimated total (example, GBP), date, place and guests. Links to Trust and safety. Not a final price; fee and VAT line is added at checkout. Analytics: booking_request_step_completed per step, booking_request_submitted with value.
Mobile
Single column. The summary collapses to a sticky bottom bar showing the total with a "View summary" drawer. One step at a time with Back and Continue buttons fixed above the keyboard. Date and time use native pickers.
States
Loading: skeleton for the summary while service data loads. Error: unknown or unpublished service shows a 404 with search link; save failures keep the form and show "We could not send your request. Your answers are saved, please try again." Logged-out: allowed through to step 5, then email capture. Teacher paused or fully booked: banner "Amelia is not taking bookings right now" with similar teachers. Offline: inline warning and drafts kept.