Skip to content

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

Foundry$12K-$18K

+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.

Therapy Connections homepage before the rebuild
Therapy Connections homepage after the rebuild

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.

  1. 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
  2. 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
  3. 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
  4. 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 → After
Performance4198+57
Accessibility82100+18
Best Practices78100+22
SEO85100+15

Desktop (cable, 1350 x 940)

Before → After
Performance71100+29
Accessibility82100+18
Best Practices78100+22
SEO85100+15

Captured 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.

LCPimproved

Largest Contentful Paint, mobile

4.8s1.1s
INPimproved

Interaction to Next Paint, mobile

≈350ms76ms
CLSimproved

Cumulative Layout Shift

0.180.02
Page weightimproved

First-load bytes

2.4 MB180 KB
JS budgetimproved

Marketing surface

≈1.1 MB90 KB gz

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.

The 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)

Each 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-LD

Every 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-LD

Each 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

Navigation hierarchy on every nested page. Cited frequently by answer engines for navigational queries.

Applied to

Every page deeper than the homepage

Brand-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.

Therapy Connections old site, mobile view, with intrusive cookie banner and unreadable hero
Old site, mobile. Cookie banner covered the hero, no clear nav, no CTA above the fold.
Therapy Connections new site, mobile view, clean hero with two CTAs
New site, mobile. Clear nav, two CTAs above the fold, phone number visible, trust strip below.
New Therapy Connections services page
Services page. Five service lines, each with their own page and MedicalProcedure schema.
New Therapy Connections occupational therapy detail page
Per-service detail page. Description, named team, Person schema for each clinician.

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.

The live site

therapyconnections.vercel.app

Live at therapyconnections.vercel.app. The cutover to the .ca apex is scheduled with the clinic's IT contact.

Currently on Foundry retainer for content cadence and schema upkeep.

Want one of these on your site?

Send the URL. Two days later we send back a Vercel preview.

We use analytics to understand which pages help, with PII redacted and session inputs masked. Your form submissions always reach us regardless of this choice.