Work / Build / 47-URL Multi-Location Day Spa WordPress Build

47-URL Multi-Location Day Spa WordPress Build

A multi-location day-spa build with Square Appointments booking across three Oregon locations — 47 URLs across 9 templates, 138h over 103 days.

End client 47-URL Multi-Location Day Spa WordPress Build
Sector Wellness (Day Spa)
Engagement White-label delivery for a US marketing agency specialising in local-business websites
Timeline 103 calendar days
138h across 103 days
www.everberadiant.com · desktop
www.everberadiant.com · mobile

Screenshots captured by automated tooling — some elements may not have loaded fully or may layer on top of each other. For the most accurate view, visit the live site →

— The brief

Build the URLs across the agency's templates, wire the conversion primitive, then work the QA backlogs to closure.

Client (end user): Radiant Day Spa — Bend, Oregon (with Sisters and Jacksonville locations)
Engagement: White-label development for a US marketing agency
Delivered: September – December 2025 · 103 days · 138 hours across the build and its long fix-and-feedback tail

The Craft of a Build

A 47-URL Wellness build for a three-location Oregon day spa — where the conversion primitive was not a single contact form but a 33-treatment × 3-location booking matrix of per-service Square Appointments URLs. The agency’s staging review flagged that every “Book Now” button was routing to the location-wide service list rather than the specific treatment, forcing a treatment-by-treatment rewire before a guest scrolling a treatment menu could land on the right Square embed.

This case study is a record of one such build — delivered for a US marketing agency in the wellness day-spa segment — and it is the first Wellness-industry case in our portfolio.

Snapshot

Field Value
End-client industry Wellness — Day Spa (multi-location)
End-client Radiant Day Spa (Bend · Sisters · Jacksonville, Oregon)
Engagement White-label WordPress build for a US marketing agency specialising in local-business websites
Project Type Single-phase WordPress build on Kinsta with a Square Appointments booking matrix across three central-Oregon locations
Scope 47 unique URLs across 49 sitemap rows — homepage, treatment-menu lander, 33 treatment pages (each tagged with the locations that run it), 4 location pages, 3 location About pages, 3 location Reviews pages, blog lander + blog, loyalty programme
Multi-location Bend · Sisters · Jacksonville (Oregon); routing primitive: per-treatment location-availability flag (BD / SS / JV), with a popup picker for two- and three-location treatments and direct embed for single-location treatments
Timeline 103 days (5 Sep – 17 Dec 2025), delivered on schedule
Effort 138 hours against a 138-hour estimate — no overrun
Team 5 specialists (45h dev · 77h QA · 15h PM · 1h late-phase fixes — QA-heavy by Build standards, appropriate to the multi-location reconciliation tail rather than to a templated-design pass)
Templates 9 applied templates drawn from a 14-template agency library — Homepage, Services Lander (the treatment-menu lander), Service Page, Location, About Us, Reviews, Blog Lander, Blog, Loyalty Program. The library’s Doctor Page template was not applied — there is no doctor on a day-spa site.
Tech Stack WordPress · Kinsta hosting · Rank Math Pro · WP Rocket · Square Appointments embeds (booking widget, one per location) · Figma (design source) · Site Checker ( QA plugin)
Delivered 47 unique URLs built across 9 templates, the multi-location booking matrix wired against per-location Square Appointments embeds, 24/30 launch-checklist items signed off, two QA backlogs (Issues Backlog DEV: 26/49 Completed; Issues Backlog CX: 19/51 Completed/closed) worked in parallel through a long client-feedback tail
Engagement cadence 49 agency-raised issues · 46 of 49 closed by handoff (26-day active span, 2025-10-11 – 2025-11-05)
Review rounds ≈7 review rounds across the 103-day calendar window
Per-ticket effort 115 internal Redmine tickets · median 22m / P75 36m per ticket
Launch checklist 31 items, signed off before cutover

The Brief

A US marketing agency retained by Radiant Day Spa — a three-location wellness practice serving central Oregon from sites in Bend, Sisters, and Jacksonville — handed us a Google Sheets workbook with a sitemap of 49 rows resolving to 47 unique URLs, a 14-template Figma library, a 30-row launch checklist with Development / Pre-Launch / Both columns, an AutoQA Setup tab the agency runs against staging, and two empty issue-backlog tabs (DEV for developer-impacting items, CX for client-experience items) ready to fill once staging went up. The build sat on the agency’s Kinsta environment; SEO came from Rank Math Pro; performance from WP Rocket; and the conversion primitive — the thing a guest does on the site — was a set of Square Appointments embed widgets, one per location. Figma carried the homepage and treatment-page designs.

The ask was a single-phase build with a long reconciliation tail. Build all 47 URLs into the agency’s nine applicable templates; wire the multi-location booking logic so that each treatment’s “Book Now” button resolved to the right embed (direct for a treatment offered in only one of Bend / Sisters / Jacksonville, popup picker for treatments offered in two or three); then, through a stretch of weeks against staging, work down the DEV and CX backlogs in parallel and close the launch checklist. The agency owned strategy, copy, treatment menu, brand voice, and client-facing communication. We owned execution: templates, page wiring, booking-matrix logic, QA discipline, no improvisation on copy or design.

Risk context. A wellness day-spa website’s revenue surface is the booking — a guest scrolling a treatment menu, choosing a location, and arriving inside Square’s calendar without a tab change, a misroute, or a popup that fails to load. Three locations multiplied that surface by three, and per-treatment availability multiplied it again. The risk the agency was hedging against, in commissioning a white-label dev partner, was not whether somebody could build pages on Kinsta; it was whether the booking flow on the live site, on the day a guest in Sisters tapped “Book Now” on a treatment offered in Sisters and Bend, would land them on the right Square embed without the agency or the end client carrying that reconciliation in their heads. Every Build draft frames its operating risk in the agency’s terms; on this one, the operating risk was booking-flow continuity across a per-location matrix, and the brief was scoped to make that the load-bearing piece of dev work, not a footnote.

This was a net-new build with no inherited URL space and no migration. There is no “before” state to compare to, no rankings to preserve, no redirect map to honour — there is the workbook the agency wrote, the staging site we built against it, and the live site that finally cut over. The pre/post framing some Build cases lean on does not apply here.

How We Did It

1. Nine templates, 47 URLs, one build pipeline. Radiant Day Spa’s URLs spread across nine of the agency’s 14 standard templates: Homepage (1), Services Lander as the treatment-menu lander (1), Service Page (33 — the heaviest by far, one per treatment), Location (4), About Us (3 — one per location), Reviews (3 — one per location), Blog Lander (1), Blog (1), Loyalty Program (1). Each URL was built on its assigned template per the sitemap row; nothing was hand-rolled outside the template system. The agency’s library also carries a Doctor Page template — appropriate on a healthcare build, not on a day spa where the conversion pages are treatment menus rather than provider bios — and we left it unused.

2. The workbook is the contract — including the per-row Hours Estimated column. The agency’s Sitemap tab carried an Hours Estimated value on every row (Homepage at 12 hours, About-Us pages at 0.5 hours each, treatment pages typically at 1 hour, the Services Lander and Location pages priced higher). The aggregate of those row values represented the build estimate; the 138-hour project estimate carried that build aggregate plus the QA, project management, and post-staging reconciliation budgets. Both held against actuals.

The discipline this represents is straightforward. On a build with a pre-costed sitemap, the dev team’s job is to deliver inside the row-level budgets, not to re-open pricing page by page. We honoured the row figures and surfaced surprises back to the agency rather than absorbing them silently into the next row.

3. The multi-location booking matrix. This was the load-bearing piece of custom development on the build. Each of the 33 treatments carried a location-availability flag — BD (Bend), SS (Sisters), JV (Jacksonville), or some combination. The “Book Now” affordance behaved differently per case: for a treatment available at one location, it linked direct to that location’s Square Appointments embed; for two- or three-location treatments, it opened a picker popup with one option per location, each option carrying its own Square embed code. We implemented the matrix once against the agency’s spec, exposed it in the Service Page template via a small custom field set keyed to the BD/SS/JV flags, and then defended it through both QA backlogs as the agency added, removed, and re-tagged treatments through the long tail. We opted for the custom-field approach over separate per-location-treatment pages because the workbook listed 33 treatments with overlapping location flags — keeping each treatment on a single URL with embed routing in the custom field set held the template count at 9 instead of multiplying it by the number of locations offering each service. The booking widget — Square Appointments — sits in the Tech Stack row of the Snapshot for a reason: on a wellness build it is the conversion primitive, in the way Gravity Forms is on a healthcare build.

4. Two parallel QA loops, worked through a long staging-feedback tail. Issues were tracked in two agency-side backlog tabs: Issues Backlog DEV held the developer-impacting items (layout regressions, broken links, missing content rows, image swaps, the booking-matrix edge cases as they surfaced). Issues Backlog CX held the agency’s account-side concerns (copy edits, image-replacement requests, brand-voice corrections, location-specific content asks routed back to the end client). Of the 49 DEV items raised, 26 closed as Completed; 10 sat in QA awaiting agency or end-client confirmation, 9 were To Do, 3 In Progress, 1 held on Info Needed at handoff. Of the 51 CX items raised, 19 closed as Completed (one additionally marked closed); 15 in QA, 3 To Do, 1 In Progress, 13 held on Info Needed pending agency or end-client decisions. The 30-row launch checklist — Development / Pre-Launch / Both — closed at 24 items signed off behind both backlogs, with the residual six checklist items themselves dependent on the same Info-Needed waits.

Issue #1222 — “The Book Now logic” — cost 14 hours against a 4-hour estimate, a 3.5× overrun that tells you what the load-bearing piece of the build actually was. The booking-matrix reconciliation, not the page build, was where the engagement’s time went; the two parallel QA backlogs running alongside it across 103 days kept every other fix in the open rather than backlogged silently.

Results

Metric Outcome
URLs built 47 unique URLs across 9 templates (1 Homepage · 1 Services Lander · 33 Service Pages · 4 Location · 3 About Us · 3 Reviews · 1 Blog Lander · 1 Blog · 1 Loyalty Program)
Templates applied 9 / 14 from the agency’s standard local-business library — only the templates the sitemap actually called for; the Doctor Page template was correctly absent on a day-spa site
Multi-location booking matrix 33 treatments × 3 locations (BD / SS / JV) wired against per-location Square Appointments embeds, with a popup picker for two- and three-location treatments and direct embed for single-location treatments
DEV issues backlog (Issues Backlog DEV tab) 26 / 49 closed as Completed; 10 in QA, 9 To Do, 3 In Progress, 1 Info Needed
CX issues backlog (Issues Backlog CX tab) 19 / 51 closed as Completed/closed; 15 in QA, 3 To Do, 1 In Progress, 13 Info Needed (pending agency or end-client decisions)
Launch checklist 24 / 30 items signed off across Development / Pre-Launch / Both columns; residual six items chained to the same Info-Needed waits in the CX tab
Timeline 103 days (5 Sep – 17 Dec 2025), delivered on schedule
Effort 138h / 138h estimate — no overrun, no scope creep
Handoff Site live on production, https://www.everberadiant.com/ returning HTTP 200 from a fresh check
Site status, verified 2026-04 Production live and serving 200; Kinsta-fronted, with Rank Math Pro and WP Rocket present in the page head

The outcome, restated plainly: the agency’s 47-URL multi-location day-spa build shipped across 9 templates on Kinsta, inside the 138-hour quoted budget. Two QA backlogs ran in parallel through a long reconciliation tail; 45 of the 100 raised items closed as Completed before the end of our engagement, with the remainder split between in-flight QA and Info-Needed waits on agency or end-client decisions. The launch checklist closed at 24 of 30 signed-off items; production cut over at the end of the 103-day window.

Operational Integrity at handoff

Pre-handoff Site Checker ran on the initial build before the first agency review — QA flagged open findings («ммм-чекера и исправить косяки», chat #963, 2025-09-23) — and the agency’s post-handoff pass then raised #1222, which showed that every “Book Now” button across the 33-treatment matrix was routing to the location’s general Square service list rather than the per-treatment-specific booking URL. Pre-handoff QA ran through Site Checker — see our QA discipline for the categories and the fail-zero gate. The agency’s own QA layer — their tools, their process — ran post-handoff and surfaced issues into the shared backlog for our fix loop until they signed off.

Process

Phase Duration Outcome
Brief & estimation ~1 week Workbook reviewed, row-level hours confirmed against the 49-row Sitemap tab, 138h quoted and agreed
Build phase (URLs + templates) ~5 weeks All 47 URLs built against 9 templates on Kinsta staging; first DEV backlog rows opened against staging
Multi-location booking matrix ~2 weeks (in parallel) 33-treatment × 3-location matrix wired via per-location Square Appointments embeds plus the picker popup; defended through ongoing CX-tab edits
Reconciliation tail (DEV + CX QA) ~6 weeks Both backlogs worked in parallel; high-priority CX items (image swaps, copy fixes, mobile-layout regressions, booking-matrix edge cases) closed first
Launch checklist + delivery final ~1 week 30-row checklist signed off to 24 items; cutover; production live at https://www.everberadiant.com/

Phases overlap heavily — the booking-matrix work began before every Service Page had finished its first build pass, and the DEV/CX reconciliation tail ran alongside both, which is why the 103-day calendar is materially shorter than the sum of individual phase durations.

Team

Delivery team

  • Nikita Tumasevic — lead developer across the build phase and the multi-location booking-matrix piece
  • Pavel Sazhin — QA iterations and fixes across both DEV and CX backlogs
  • Timur Arbaev — QA support, with primary ownership of the long reconciliation tail (the largest single QA contribution on the project)
  • Lyudmila Travkina — QA pass and pre-handoff review coordination
  • Anton Hersun, — project lead (estimation, agency-side communication, sign-off)

Agency-side project management and client-facing communication remained with the partner agency throughout. Our team was invisible to the end client. Treatment-menu copy, brand voice, location strategy, and the booking-flow product decisions were the agency’s; the wiring of those decisions into a multi-location WordPress build was ours.

For agencies commissioning a white-label WordPress build

On a multi-location build with a SaaS booking widget, the failure mode is a dev partner who builds the pages but does not own the routing — and the agency finds misroutes in the client’s first post-launch feedback. If your agency has a workbook and a Square, Acuity, or similar booking configuration to reconcile, send us the workbook. We will flag the rows that carry routing risk and return a fixed-hours quote within 24 hours. No cost, no obligation.

Request a spec review →

Don't have a spec yet? Send a one-paragraph description — we'll come back with the questions worth asking. Send a description →


xaver.pro · 2026 · Case #102 White-label · Partner agency not named
Scroll to Top