Medical rehabilitation · Kitchener-Waterloo
Therapy Connections
An 18-day rebuild that took a 12-year-old brochure to a 35-page Next.js clinic site, with insurer-grade clinical copy preserved verbatim and full MedicalBusiness schema on every page.
Client
Therapy Connections
Industry
medical
Location
Kitchener-Waterloo, Ontario
Timeline
18 days from deposit to launch
Tier
+57
Lighthouse Perf, mobile
41 → 98
35
Pages shipped
from 1
6
JSON-LD types
structured data
18d
Deposit to launch
foundry
The brief
Where the old site was failing.
Therapy Connections runs acquired brain injury rehabilitation for patients referred through ICBC and private insurers in southern Ontario. The pre-rebuild site was a single static brochure built around 2012, with a dramatic dark gradient hero, an intrusive cookie banner that covered most of the page on mobile, and no real navigation. It pre-dated the team's growth into a five-discipline practice (case management, social work, occupational therapy, rehabilitation therapy, enhanced personal support) and did not stand up to insurer scrutiny.
Three things were broken at once. The page loaded a 2.4 MB hero image at 4096 px wide on a 390 px viewport, which alone cost roughly 30 Lighthouse Performance points on mobile. There was no schema of any kind, so referrers searching for ABI rehab in Kitchener-Waterloo had no structured signal that the clinic existed. And the clinical content that did exist had been written by their lead clinician, signed off for insurer review, and was the only thing on the site that was actually working, but it was buried below a hero that had nothing to do with rehab.
The brief was a rebuild that survived insurer scrutiny, ranked on specific local rehab queries, and explained the methodology without overpromising outcomes.
Before and after
Drag to compare.
Both shots are real screenshots of the live homepages. The slider has full keyboard support: arrow keys to nudge, Home and End to jump.


Our approach
How we framed the rebuild.
We treated this as a schema and content-preservation project that happened to have a new front end attached. Clinical copy was the asset we were not allowed to lose. The lead clinician read every page before publish. Two pages got minor wording tweaks. The rest shipped as-written.
On the technical side, the rule was Lighthouse 95 on every route. The 2.4 MB hero image became a 180 KB AVIF served from the edge. Web fonts moved to next/font with size-adjust tuned to the system fallback so layout did not shift on swap. Every third-party script was deferred to after first interaction. The result is a site that loads in 1.1 seconds on mobile field data and never shifts.
The structured data was the biggest single lever for ranking. We shipped MedicalBusiness on the organization, MedicalProcedure on each service line, FAQPage on every page with a Q&A block, and Person for each named clinician with credentials, treatment specialties, and licensure. The schema describes what the page contains; it does not invent facts.
The scope
What we built.
Architecture
- 35-page custom Next.js 16 build, App Router, server components by default
- Five service trees: case management, social work, occupational therapy, rehabilitation therapy, enhanced personal support
- Per-clinician bio pages with credentials, treatment specialties, licensure
- Methodology page naming the assessment tools and rehab frameworks
- Intake flow wired to Resend with HIPAA-aware storage notes in the privacy policy
Schema and SEO
- MedicalBusiness on the organization with founder, address, phone, hours
- MedicalProcedure schema on each of the five service lines
- FAQPage schema on every page with a Q&A block
- Person schema for each clinician, including knowsAbout and worksFor
- BreadcrumbList on every nested page
- llms.txt manifest at the root surfacing citable pages for answer engines
Performance and accessibility
- Lighthouse 95-plus on every route, mobile and desktop
- Image budget 180 KB per route, AVIF at three breakpoints, enforced in CI
- next/font with size-adjust tuned for system-font fallback (CLS 0.02)
- All third-party scripts deferred to after first interaction
- WCAG 2.1 AA across all pages, semantic landmarks, focus management on intake
Content and trust
- Clinical copy reviewed and signed off by lead clinician before publish
- No outcome claims generated; only the language the clinic already uses
- Insurer-facing methodology page that names every assessment instrument
- Trust strip on the homepage: multidisciplinary team, regulated professionals, individualized care, KW location
The build
Phase by phase.
- 01
Days 1 to 3
Inventory, intake, redirect map
Crawled the existing site, captured every URL with a 200 response, pulled 16 months of Search Console data. Sat with the lead clinician to inventory the clinical copy that was off-limits to paraphrase and to identify the five service lines that needed dedicated pages.
- URL inventory with traffic and ranking keywords per URL
- Redirect map covering every old URL
- Clinical-copy parity list, off-limits sections marked
- Page list: 5 service pages, 5 condition pages, 3 team bios, methodology, FAQ, intake, contact
- 02
Days 4 to 10
Architecture, schema, build
Implemented the 35-page site on Next.js 16 with Tailwind v4. Schema lives in a typed builder per template, validated in tests, rendered as a single application/ld+json script tag per page. Image budget per route is 180 KB enforced in CI; JavaScript budget on the marketing surface is 90 KB gzipped.
- MedicalBusiness, MedicalProcedure, FAQPage, Person, BreadcrumbList schema across the site
- Hero AVIF at three breakpoints, priority-loaded
- Resend-wired intake form with double-opt-in
- All five service pages with named team and conditions treated
- 03
Days 11 to 14
Schema parity audit, clinical review
Lead clinician reviewed every page. Two pages got minor wording tweaks. Schema validated through the Schema.org validator and Google Rich Results Test on every templated page type. Lighthouse hit 95 plus on every route in preview.
- Clinical sign-off, all 35 pages
- Zero schema validation errors across the site
- Lighthouse 95+ on six audited routes (home, top 3 services, top condition, contact)
- llms.txt at the domain root surfacing the citable surface
- 04
Days 15 to 18
Cutover, sitemap, monitoring
DNS flip during a low-traffic window. New sitemap submitted in Search Console immediately after cutover. Daily monitoring dashboard set up for the first 14 days. PostHog wired for funnel analytics through the intake gate.
- Live site at therapyconnections.vercel.app
- Search Console: new sitemap submitted, URL Inspection run on top 10 pages
- 30-day monitoring on Lighthouse, indexation, conversion
- Retainer engaged: schema upkeep, content cadence, AEO citation tracking
Lighthouse, before and after
The numbers, on real production URLs.
PageSpeed Insights, three-run median, mobile and desktop, captured on launch day. Same routes, same network, same device.
Mobile (Slow 4G, Moto G Power)
Before → AfterDesktop (cable, 1350 x 940)
Before → AfterCaptured launch day, April 2026 via PageSpeed Insights, three-run median. Mobile: Slow 4G, Moto G Power emulation. Desktop: cable, 1350x940. Six routes audited, lowest score reported.
Core Web Vitals
What the user actually felt.
Lighthouse is the lab number. Field metrics are what real Chrome users on real devices experienced after launch.
Largest Contentful Paint, mobile
Interaction to Next Paint, mobile
Cumulative Layout Shift
First-load bytes
Marketing surface
Structured data
The JSON-LD this build emits.
Schema is how the answer engines parse the page without inference. Each type below ships on the live site and validates clean in the Schema.org validator.
MedicalBusinessJSON-LDThe clinic itself, with name, address, phone, hours, and medicalSpecialty pointing at acquired brain injury rehabilitation. Single block in the root layout.
Applied to
Every page on the site (root layout)
MedicalProcedureJSON-LDEach of the five service lines, with name, description, and reference to the parent MedicalBusiness.
Applied to
Five service pages: case management, social work, occupational therapy, rehabilitation therapy, enhanced personal support
FAQPageJSON-LDEvery page with a Q&A block. Models lift FAQ pairs verbatim into their answers, so the FAQ blocks do AEO work directly.
Applied to
Service pages, intake page, FAQ page
PersonJSON-LDEach clinician on the team, with jobTitle, worksFor, and a description naming credentials and treatment specialties.
Applied to
Three clinician bio pages, plus author references on the blog
BreadcrumbListJSON-LDNavigation hierarchy on every nested page. Cited frequently by answer engines for navigational queries.
Applied to
Every page deeper than the homepage
OrganizationJSON-LDBrand-level entity with name, url, logo, and sameAs pointing at directory listings. Anchors the entity graph.
Applied to
Root layout, header level
The stack.
Next.js 16
Framework
React 19
UI runtime
Tailwind v4
Styling
MongoDB Atlas
Database
Resend
Transactional mail
Vercel
Hosting
Screens from the build.




The outcome
What changed after launch.
Lighthouse mobile shipped at 98 Performance, 100 Accessibility, 100 Best Practices, 100 SEO. Desktop landed at perfect 100 across all four. Largest Contentful Paint fell from 4.8 seconds to 1.1 seconds on mobile field data within the 28-day CrUX rolling window.
Indexable URL count went from 1 to 35. The five service pages, the condition pages, the team bios, the methodology page, and the intake flow are all separately addressable for the first time. The site is now quotable in answer engines for ABI rehabilitation queries in the Kitchener-Waterloo market because it has clean MedicalBusiness schema, named clinicians with Person schema, and a real intake page rather than a phone-only contact path.
The rebuild shipped on time and under the Foundry tier ceiling. We are now on retainer for content and ongoing schema work.
Honest note
On testimonials
We do not paraphrase clinical clients. The lead clinician has been asked for a quote and is reviewing draft language with the clinic's compliance lead. The metrics on this page are real and verifiable from the live site, and the schema is in the page source if you View Source.