Crystal Palace Osteopathy.
osteopathcrystalpalace.co.ukThe work,
in three scrolls.
Scroll to see the site move through its three key sections. Hero. Editorial. Social proof.
An established practice, a site that
wasn't carrying its weight.
Crystal Palace Osteopathy has been treating patients in SE19 for years. Virginia has a waiting list. The website hadn't kept up. Hard to read on a phone, slow to load, and buried on page three of Google for osteopath Crystal Palace. Patients were finding her by word of mouth, which is great until it isn't.
Rebuild it from the ground up.
Keep what worked.
Editorial, not clinical.
Warm palette. Instrument Serif for the display headings. One signature photograph of a woman holding her lower back, stopping the scroll where every other physio site fades into stock imagery.
Hand-coded, no bloat.
No CMS, no plugins, no tracking bloat. Ships as static HTML and a handful of WebP assets. Lighthouse 98 on mobile. Under 300KB on first load.
Full MedicalBusiness schema.
Geo coordinates, opening hours, areas served, practitioner credentials. Everything Google needs to show her at the top of the local pack for osteopath Crystal Palace.
The same page,
two views.
What Google sees is different. Every card in that grid, every treatment category, every address line and opening hour is typed directly into a hand-written MedicalBusiness JSON-LD block in the <head>. No plugin, no generator, no CMS plumbing. Four separate schema blocks totaling 272 lines of structured data, wired by hand and validated against the Rich Results Test.
-
Dual @type:
["MedicalBusiness", "HealthAndBeautyBusiness"]. Covers both health intent and local services intent without keyword stuffing. -
16
areaServedentries. Crystal Palace, Dulwich, Sydenham, Penge, Bromley, Croydon and 10 more. Primary location carriesGeoCoordinates(51.4186, -0.0765). -
4
EducationalOccupationalCredentialentries on the practitioner. BSc(Hons), ITEC, APNT, NLSMR. Each withrecognizedBy. Registered with the General Osteopathic Council. -
Explicit
openingHoursSpecification.dayOfWeekas an array. No string parsing, no ambiguity for the crawler. -
Four separate blocks.
MedicalBusiness,FAQPage,BreadcrumbList,WebSite. Split so Google can index each independently. - Zero runtime JavaScript for the schema. Ships static in the initial HTML. First byte already contains everything the crawler needs.
// index.html · head · schema[0]
{
"@type": ["MedicalBusiness",
"HealthAndBeautyBusiness"],
"medicalSpecialty": [
"Musculoskeletal",
"PhysicalTherapy",
"RehabilitativeMedicine"
],
"geo": {
"@type": "GeoCoordinates",
"latitude": 51.4186,
"longitude": -0.0765
},
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday",
"Wednesday",
"Friday"],
"opens": "10:00",
"closes": "20:00"
}],
"employee": {
"@type": "Person",
"name": "Virginia Spencer-Smith",
"hasCredential": [
{ "name": "BSc(Hons) Osteopathy" },
{ "name": "ITEC Massage Therapy" },
{ "name": "APNT Sports Injury" },
{ "name": "NLSMR Remedial" }
]
}
}
- Schema blocks
- 4
- Structured data
- 272 lines
- Runtime JS
- 0 KB
- Initial HTML
- 66 KB
- CSS
- 42 KB
- Hero image
- 116 KB WebP
Live in under two weeks.
- 98
- Lighthouse, mobile
- 12days
- Brief to live
- 0
- Templates used
The site is live at osteopathcrystalpalace.co.uk. Virginia got a site she can send people to without a wince. I got my first case study.
If you run a local business in Crystal Palace, East Dulwich, Peckham, Herne Hill, Forest Hill, or anywhere across South East London and your website isn't doing its job, get in touch. The process is the same. See pricing for the full breakdown.
Your business could be
case study 02.
Got a local practice or studio that needs a proper website? I'm taking on new projects now.
Start a conversation