pediatric therapy website design Vancouver
Web Development & SEO

KidStart Pediatric Therapy.

Pediatric therapy website design in Vancouver — 780 location pages, 90 blog posts, bilingual Chinese-English, generating form submissions by day two.

Visit Site
Next.jsSanity CMSnext-intlTailwind CSSResendVercel
Scroll to explore
780

Location Pages

90

Blog Posts

Day 2

Time to First Lead

KidStart Pediatric Therapy
(How We Built It)
01

Challenge

A pediatric therapy clinic stuck on WordPress with Elementor page blobs, no bilingual support, and 780 location pages that were 45KB HTML dumps with zero portability.

02

Approach

Built a custom Next.js application with next-intl for Chinese/English, Sanity CMS for content management, and a programmatic page generation system that creates 780 service-location combinations from structured data.

03

Results

The site was generating form submissions within 48 hours of launch. Client reported increased reviews. 780 location pages are now indexed and targeting long-tail local keywords.

(Screenshots)
KidStart Pediatric Therapy screenshot 1
KidStart Pediatric Therapy screenshot 2
KidStart Pediatric Therapy

The full story behind KidStart Pediatric Therapy.

(Case Study)
01

The client needed patients, not a prettier website

KidStart Pediatric Therapy is a Vancouver clinic specializing in speech therapy, occupational therapy, and specialized services for children. They serve a diverse community — many of their families speak Mandarin as a first language.

Their WordPress site was doing almost nothing for them. The design was fine. The content was adequate. But it was not generating leads. It was not ranking for local searches. And it absolutely was not serving their Chinese-speaking families.

Here is what we inherited: 90 blog posts trapped in WordPress. 780 location pages built with Elementor — each one a 45KB HTML blob with no clean text, no semantic structure, and no way to extract content programmatically. 21 team member profiles scattered across pages with inconsistent formatting. And zero bilingual infrastructure.

The clinic's founder, Shawn Chuang, is a Registered Autism Service Provider and occupational therapist. She understood what her families needed: a site they could navigate in their own language, find the right service for their child, and book an appointment without friction. The old site could not do any of that.

02

780 pages, two languages, zero manual entry

The location page challenge was the hardest part of this build.

KidStart offers 52 service types across 15 Vancouver neighbourhoods. That is 780 unique combinations. On WordPress, each one was a manually created Elementor page — a brittle, unscalable approach that made updates nearly impossible.

We replaced all of it with a single Sanity document type parameterized by service and neighbourhood. Next.js generates all 780 pages at build time using generateStaticParams. Each page has a unique title, unique meta description, service-specific content, neighbourhood-level geo schema, and cross-links to related services and locations.

The bilingual system was not an afterthought. Every route, every component, every piece of metadata renders in both English and Chinese through next-intl. We extracted 40-plus hardcoded English strings from the original codebase and moved them into properly structured translation files. The middleware handles locale detection and routing. Hreflang tags ensure Google indexes both language versions without duplicate content issues.

The content migration required five custom scripts. The WordPress REST API did not expose Yoast SEO metadata, so we built a scraper that pulled raw HTML and extracted titles, descriptions, Open Graph tags, and schema JSON-LD. Internal links — 313 of them — were stripped during the initial import and had to be restored by re-parsing the original WordPress HTML. 104 inline blog images that the REST API failed to return were downloaded, uploaded to Sanity, and re-inserted at their original positions.

03

Security, performance, and the details that matter

Healthcare sites carry a higher standard. Parents trust you with information about their children. The site needs to earn that trust at every layer.

We hardened the entire application. Content Security Policy headers block unauthorized script execution. HSTS forces encrypted connections. Origin validation on API routes rejects requests from unknown domains. Rate limiting caps form submissions at five per hour per IP address. A honeypot field catches automated bots without adding friction for real users.

The contact and newsletter forms deliver through Resend — no third-party form handlers, no data leaving the controlled pipeline. Every submission generates a formatted email to the clinic with all the context they need to follow up.

We consolidated the tracking mess. The old site had four GTM containers and three Facebook Pixels running simultaneously. We stripped it down to one GA4 property, one measurement ID, clean event tracking.

Performance is where the technical decisions pay off. The site loads in under two seconds. Images serve through Sanity CDN with automatic format negotiation. Static pages are pre-rendered and cached at the edge. There is no WordPress, no PHP, no database query on every page load.

04

Day two: the forms started coming in

The site launched and the results were immediate.

Within 48 hours, the clinic received form submissions through the new contact system. Not test submissions. Real parents looking for therapy services for their children.

The client reported an increase in Google reviews following the launch — the kind of signal that compounds over time as review velocity feeds into local pack rankings.

780 location pages started appearing in Google Search Console within the first week. Long-tail queries like "speech therapy Kitsilano" and "occupational therapy Surrey" — the exact searches that parents in those neighbourhoods are making — now have dedicated, optimized landing pages.

The bilingual capability opened a channel that did not exist before. Chinese-speaking families can now navigate the entire site, understand service offerings, and submit inquiries in a context that feels natural rather than translated-as-an-afterthought.

The 21 team member pages sit at flat root-level URLs — /shawn-chuang/ instead of /team/shawn-chuang/ — maximizing their authority for name-based searches and reinforcing the clinic's E-E-A-T signals.

This project moved fast because it had to. The clinic needed patients, not a six-month development timeline. We delivered a production application with 780 pages, bilingual support, enterprise security, and a content management system the team can operate independently — and it was generating business within 48 hours.

Want Something Like This?

Every project starts with a conversation. Tell me the problem — I'll show you the system that solves it.