Work · Case study · StandardStudio

Pool Club

A marketing site, a review system that publishes straight to the page, a resumable three-step quote flow, and twenty generated city pages — for a family-run residential pool-care business across the DFW metroplex.

Pool Club
ClientPool Club · DFW
ModuleStandardStudio
StackNext.js 15 · Postgres · Railway
StatusBuilt, pre-launch

01 · The build

A design system, turned into a running site.

The brand arrived as a design-system export — tokens, a component library, and a website kit. We ported it straight through: the tokens land untouched, the components keep their names, and a port script regenerates the stylesheet whenever the system ships an update, so the site never drifts from the brand. On top of that sit real Next.js 15 App Router routes, each one a server component holding its own metadata and wrapping a client view.

Pool Club home page. Family owned. Pool obsessed. headline over French Blue, with a pool photograph and Get a quote CTA

02 · Reviews

Reviews that publish themselves, with a one-click undo.

The client's top-ranked feature, and the one with the real design problem: moderation queues mean reviews sit unpublished for days, but open posting means anything can land on the page. We inverted it. A review goes live the moment it's submitted, exactly as written — and the notification email carries a signed HMAC link, scoped to that single review, that removes it in one click from the inbox. Reviews are stored in Postgres, rate-limited per IP, honeypotted against bots, and if the database is ever unreachable the review still arrives by email instead of vanishing.

Pool Club reviews page. What our clients say, with a star-rating picker and a leave-a-review form that posts straight to the page

03 · Quote flow

Three steps, and the step lives in the URL.

What you need, your pool, your details. Keeping the step index in the URL hash means a half-finished quote is shareable and resumable, and drop-off can be measured step by step rather than guessed at. City pages deep-link in with the first field already filled. Submissions are validated with Zod on the server and screened by a honeypot before Resend sends them on — and a failure at the email provider never loses the lead or throws an error at the visitor.

Pool Club quote flow on step two of three, with pool size, chlorine or salt, spa, and condition fields filled in

04 · Local search

Twenty cities, twenty pages, one config file.

A pool-care business is won or lost on local search, so every city the client works in gets its own static page — its own copy, its own metadata, and a quote link that arrives with the city pre-filled. The county map on the service-area page is drawn from the same data. All twenty render at build time from a single config file, alongside the service pages, which means adding a city is a one-line edit rather than a new page.

Pool Club service areas page. We work the DFW metroplex, with a county map of Denton, Collin, Tarrant and Dallas dotted with twenty cities

05 · Under the hood

Fast, self-contained, and locked down.

Everything the site needs it serves itself. The typeface is self-hosted, there are no third-party scripts, and a content-security policy allows exactly what the site actually uses — with the analytics origins appended only when the matching key is set, so turning on GA4 or Meta later can't be silently blocked. The image optimizer is switched off because the site doesn't use it and it's nothing but attack surface. Railway builds from main on every push, behind Cloudflare.

Stack

Next.js 15 App Router TypeScript Postgres Zod Resend Railway Cloudflare

Have something to build?

Fixed scope, fixed price, optional maintenance retainer. Tell us what you need.