Serene Spa runs out of a converted Victorian shopfront in Birmingham's Jewellery Quarter. Two qualified therapists, twenty-four treatments on the menu, six days a week, evenings until 8 PM. The trade was healthy; the no-show problem was eating the margin. Yasmin had been quietly absorbing a 12% no-show rate for two years, and the bookings she lost were disproportionately the higher-margin evening slots that walk-ins could not fill.
The brief
A booking-integrated site that took refundable deposits on the higher-margin treatments, synced cleanly with Yasmin's existing Google Calendar (her booking and her therapists' rotas), let customers self-reschedule inside a 24-hour window, and presented the treatment menu in a way that pre-empted the most common questions before they hit the phone. No bespoke booking engine — Yasmin had no appetite to maintain one. Calendly under the hood, with Stripe handling the deposit logic.
What the no-show problem actually looked like
A twelve-month audit of the Google Calendar showed: 168 no-shows out of 1,402 bookings (12.0%); 73% of no-shows were evening or Saturday slots; 41% of no-shows were first-time customers; 0% of no-shows were customers who had paid a deposit (the previous booking system did not collect them). The diagnostic was straightforward: friction at booking was correlating with attendance at appointment. Adding a small friction at booking would filter the casual no-shows without offending the genuine customers.
What we built between 10 AM and 4 PM
A multi-page Next.js site with the treatment menu, a booking flow that wrapped Calendly's embedded scheduler with a Stripe Setup Intent flow to capture the deposit before the Calendly slot was confirmed, a per-therapist availability section, an "about" page covering the qualifications and accreditations, a contact and location page, and a refund-policy page that documented the deposit terms in plain English. The Stripe deposit was £25 on any treatment over £80, refundable in full if the customer rescheduled or cancelled more than 24 hours out, and applied as a credit toward the treatment if they attended. Customers under £80 booked without a deposit.
The integration choices
Calendly Pro handled the calendar logic — round-robin assignment to the available therapist, time-zone handling for the occasional out-of-town booking, the actual Google Calendar two-way sync. Stripe handled the deposit capture via Setup Intent, with the actual charge happening only on no-show or late-cancel (the Setup Intent gives you Strong Customer Authentication compliance without taking money at the wrong moment). The two systems talked to each other through a small server-side webhook handler that fired when Calendly confirmed a booking, ran the Setup Intent, and only then locked the calendar slot. The whole integration was about 80 lines of typed code; it has not needed maintenance since.
The schema and SEO layer
HealthAndBeautyBusiness schema with the day-spa sub-type, the address, the opening hours, the twenty-four Service entries each with a Price field tied to the actual treatment cost, an aggregateRating from the existing Google reviews (4.8 / 89 reviews), and a BookAction entity for the booking endpoint. The site indexed inside 36 hours and ranked page-one for "spa Jewellery Quarter" inside the first three weeks.
The launch sequence
DNS swap at 4:20 PM. The first online booking landed at 6:18 PM that same evening — a £140 facial booked by a customer who later told Yasmin she had been trying to book by phone for two days. By the end of the first week the site had taken 31 bookings online against an average of 0 (the previous site did not offer online booking at all).
Two-week results
Two weeks post-launch: 67 online bookings, 24 phone bookings, £1,800 in deposits captured (none charged through to the customer — all attended or rescheduled inside the 24-hour window), and the no-show rate had dropped from 12% to 4.5%. Yasmin reckoned she recovered roughly £620 of treatment revenue in the two weeks that would previously have walked through the door uncollected.
The demographic shift
The booking demographic moved noticeably. Pre-launch, the average customer skewed 35-55 and booked by phone during work hours. Post-launch, the under-35 share of bookings rose from 18% to 40% — these were customers who had discovered the spa on Instagram, never followed through on the phone-only booking step, and now found a frictionless online path. The newer demographic also booked higher-margin facials and skincare treatments more frequently than the established phone-booking customer base.
The maintenance footprint
Twelve months in, the booking flow has run 4,800+ transactions without intervention. The treatment menu has been edited by Yasmin through the CMS approximately quarterly. The deposit policy has not changed. The no-show rate is stable at the 4.5% range. Yasmin moved to the bundled care plan after month three for the content cadence on the spa's social-tied blog (skincare advice, treatment explainers) but has otherwise not needed to call us. The site does its job and stays out of the way.
The deposit-policy concern that did not materialise
Yasmin's biggest pre-launch worry was that asking for a deposit would suppress new-customer bookings — particularly on the under-£80 walk-in treatments where the deposit was waived. The data showed the opposite: total booking volume rose 38% in the first three months, with the rise concentrated on the over-£80 treatments where the deposit was charged. The hypothesis we now use to explain it is that the deposit acts as a quality signal — customers reading reviews from a phone screen interpret "they take deposits" as "they are a professional operation" in the same category as Pure London or Cowshed, rather than as a hostile friction point. The competitor spas in the local area mostly do not take deposits; the differentiation became a positive rather than a negative.
The Calendly + Stripe integration architecture
Worth a paragraph for anyone considering a similar build. The web of systems looks like: customer browses the menu, picks a treatment, clicks "book" → embedded Calendly modal loads (consent-gated) → customer selects therapist and slot → on-form-submit, our serverless endpoint receives the Calendly webhook → endpoint runs Stripe Setup Intent for the deposit amount → on Setup Intent success, the Calendly booking is confirmed via API → if Setup Intent fails or is abandoned, the Calendly slot is released. The actual charge against the saved card only fires on no-show or late-cancel, fired by a second webhook from the Google Calendar that tracks attendance status (which Yasmin updates via her phone after each appointment). Total integration code: about 80 lines of typed TypeScript across two small files. Stripe handles SCA and PSD2 compliance entirely.
What we got wrong on the first launch
One miss in week two. The Calendly modal opened correctly on mobile but the embed's default font was a system serif rather than the spa's brand font, which created an unflattering visual mismatch on the booking step. Calendly Pro allows custom-font embedding via CSS variables but we had not configured it on the initial build. Fixed in the first ten-minute change-request slot and not noticed by any customer in the interim, but a missed detail at launch. We have since included the Calendly font-and-colour customisation in the standard booking-site launch checklist.
If you have a similar business
If you run a beauty, wellness, or healthcare practice that takes appointments and accepts a no-show rate above 8%, the Serene template applies. Multi-page Growth-tier build (£899), the Calendly-plus-Stripe deposit architecture, a treatment menu with per-item Service schema, an opening-hours setup that handles your variable rota, AggregateRating fed from Google reviews, and a refund-policy page that documents the deposit terms in plain English. Pre-condition: your no-show rate is genuinely cost-significant — for sub-£40 treatments the deposit friction is rarely worth the conversion drag, but for £80+ treatments the calculus flips clearly in favour. Expected outcome: no-show rate drops to 4-6%, AOV rises 15-25% as the booking-friction step filters lower-intent customers out, and the customer demographic skews younger as the online booking flow becomes accessible to the under-35s who were not phoning.
The refund-policy page that did more work than expected
Worth its own paragraph because it is consistently a higher-engagement page than the spa's service menu. The deposit policy page sits in the footer and is rarely promoted, but Google Analytics shows it is the third-most-visited page on the site after the homepage and the booking flow itself. Customers reading reviews on a mobile phone navigate to it before booking, confirm the refund terms are reasonable (full refund if rescheduled or cancelled with 24+ hours notice), and return to book. The page is approximately 400 words, written in plain English, with the policy stated as a single bulleted list rather than buried in legalese. Customers tell Yasmin in pre-treatment chats that they specifically checked the refund policy before booking — confirmation that the friction step is filtering rather than blocking.
The under-35 demographic shift, in detail
Yasmin's pre-launch customer base skewed 35-55, with bookings clustered Tuesday-to-Thursday daytime. Post-launch, the under-35 share of bookings rose from 18% to 40%, with the additional demographic clustering Friday evening and Saturday afternoon (the slots Yasmin had historically struggled to fill at full price). The customer-acquisition pathway for the new demographic is consistent: discover the spa on Instagram (typically through a reel of treatment process or interior), tap through to the website on mobile, browse the menu, book via the Calendly flow with deposit. Pre-launch, the under-35 audience was discovering the spa on Instagram but the website-to-phone-call conversion step was lossy enough that few converted to bookings. The frictionless online booking flow closed that gap.