Every service-business schema guide online is either too shallow to be useful or built for a generic Product/Review e-commerce pattern that doesn’t fit. Applied to a medical practice, it’s structurally wrong. Applied to a law firm, it often fails validation. The result: thousands of service businesses with schema that technically exists, generates zero ranking lift, and earns almost no AI citations.
This is the field guide I’ve refined shipping schema on 40+ medical, dental, and legal client sites. Every JSON-LD pattern below is validator.schema.org-clean, tested in Google’s Rich Results tool, and in live production on sites currently ranking and being cited inside AI answers.
Copy the patterns, swap in your own data, validate, ship. If you want the whole workflow packaged, the Claude Code SEO Operator Kit includes the schema playbook with prompts that generate and validate the JSON-LD for you.
The 5 schemas every service business needs.
Not twelve. Not "every schema.org type." Five. Get these right and you’ve covered 90% of what Google and AI systems actually read for a service business:
- Organization (or
MedicalBusiness/LegalService/LocalBusiness), your business as an entity - Person (or
Physician/Attorney), your lead provider or operator - Service, each service you offer, as a first-class entity
- FAQPage, FAQ sections on service and location pages
- Review + AggregateRating, wherever real reviews exist
That’s the whole core. BreadcrumbList is useful but optional. Article / BlogPosting belongs on blog content, separate from the service-business pattern.
Schema 01: MedicalBusiness (or LegalService).
The parent entity for your business. Site-wide, included on every page, with a stable @id so everything else can reference it.
Here’s the validator-clean pattern for a medical practice:
{
"@context": "https://schema.org",
"@type": "MedicalBusiness",
"@id": "https://example.com/#medicalBusiness",
"name": "Chen Dermatology Brooklyn",
"url": "https://example.com",
"logo": "https://example.com/logo.png",
"image": "https://example.com/images/office-exterior.jpg",
"telephone": "+1-718-555-0123",
"email": "hello@example.com",
"priceRange": "$$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Flatbush Ave",
"addressLocality": "Brooklyn",
"addressRegion": "NY",
"postalCode": "11201",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 40.6782,
"longitude": -73.9442
},
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "09:00",
"closes": "18:00"
}],
"medicalSpecialty": "Dermatology",
"areaServed": {
"@type": "City",
"name": "Brooklyn"
},
"sameAs": [
"https://www.facebook.com/chendermbk",
"https://www.instagram.com/chendermbk",
"https://www.linkedin.com/company/chendermbk"
]
}
For a law firm, swap "@type": "MedicalBusiness" for "@type": "LegalService", drop medicalSpecialty, and add areaServed as a list of practice-area counties or states where the firm is licensed.
Watch: priceRange
Use $, $$, $$$, or $$$$, single-character price-tier notation is what Google’s rich results tool expects. Putting an actual dollar figure in priceRange validates loosely but gives you no rich result. If you want real prices, use PriceSpecification on individual Service entities (see below).
Schema 02: Physician (or Attorney).
The lead provider or operator as a Person-typed entity. This is what AI systems use to cite you by name. Critical for E-E-A-T and AI citation.
{
"@context": "https://schema.org",
"@type": "Physician",
"@id": "https://example.com/providers/dr-chen/#physician",
"name": "Dr. Sarah Chen, MD",
"url": "https://example.com/providers/dr-chen/",
"image": "https://example.com/images/dr-chen.jpg",
"jobTitle": "Board-Certified Dermatologist",
"medicalSpecialty": "Dermatology",
"knowsAbout": [
"Cosmetic Dermatology",
"Medical Dermatology",
"Mohs Micrographic Surgery",
"Pediatric Dermatology"
],
"affiliation": {
"@type": "Hospital",
"name": "NewYork-Presbyterian Brooklyn Methodist"
},
"alumniOf": [
{
"@type": "CollegeOrUniversity",
"name": "Columbia University Vagelos College of Physicians and Surgeons"
}
],
"worksFor": {
"@id": "https://example.com/#medicalBusiness"
},
"sameAs": [
"https://www.healthgrades.com/physician/dr-sarah-chen",
"https://www.vitals.com/doctors/dr-sarah-chen",
"https://www.linkedin.com/in/drsarahchenmd",
"https://www.docasap.com/providers/dr-sarah-chen"
]
}
The sameAs array is the single most important part of this schema. Each link is a verified external reference to the same person. AI systems use these to confirm identity before citing. Skip this, and you’re reducing citation likelihood by roughly half.
For an attorney, swap "@type": "Physician" for "@type": "Attorney", drop medicalSpecialty and knowsAbout medical terms, add knowsAbout practice-area terms, add a memberOf array for bar associations, and include state bar number references in sameAs.
Schema 03: Service.
Each service you offer gets its own Service entity, linked back to the business. This is what AI systems cite when answering "what does [business] offer" or "best [service] in [city]."
{
"@context": "https://schema.org",
"@type": "Service",
"@id": "https://example.com/services/mohs-surgery/#service",
"serviceType": "Mohs Micrographic Surgery",
"name": "Mohs Surgery for Skin Cancer",
"description": "Precision skin cancer removal procedure with the highest cure rate, performed by board-certified Mohs surgeons in our Brooklyn office.",
"provider": {
"@id": "https://example.com/#medicalBusiness"
},
"areaServed": {
"@type": "City",
"name": "Brooklyn"
},
"offers": {
"@type": "Offer",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}
Put one of these on each service page. If you have 12 services, you have 12 Service schemas, each on its respective page. Do not try to put all 12 on the homepage; that’s a different antipattern we’ll cover below.
Schema 04: FAQPage.
For service and location pages with real FAQ sections. Not for artificially inserted FAQ content just to game rich results (Google quietly downweights that pattern).
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How much does Mohs surgery cost in Brooklyn?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Mohs surgery in Brooklyn typically ranges from $1,200 to $3,500 depending on the size and location of the lesion. Most insurance plans cover medically necessary Mohs surgery for diagnosed skin cancer. We accept all major insurance plans and offer transparent out-of-pocket pricing for cosmetic cases."
}
},
{
"@type": "Question",
"name": "How long does Mohs surgery take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Mohs surgery is an outpatient procedure that typically takes 2 to 4 hours, though more complex cases can take longer. The technique involves removing and examining tissue in stages until the margins are confirmed clear."
}
}
]
}
2 to 6 questions is the sweet spot. More than 8 starts looking stuffed. Answers should be complete enough that AI systems can quote them, not one-sentence teasers.
Schema 05: Review and AggregateRating.
On the business’s main schema, include an aggregateRating if you have real reviews. On service or location pages where reviews are shown, include individual Review entities.
// Add to MedicalBusiness schema above:
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.9",
"reviewCount": "237",
"bestRating": "5"
},
"review": [
{
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5"
},
"author": {
"@type": "Person",
"name": "M. Rodriguez"
},
"reviewBody": "Dr. Chen is the best dermatologist I've ever seen. Extremely thorough, took time to explain every step."
}
]
Do not fake reviews
Only use aggregateRating numbers that match your actual Google Business Profile or Healthgrades count. Google cross-checks review schema against real review sources. Faking it gets your rich snippet permanently suppressed.
The 7 traps I fix every week on client sites.
Trap 1: Using Organization instead of MedicalBusiness or LegalService
Generic Organization works, but you lose the specific entity-type signal. A dermatology practice is a MedicalBusiness. A law firm is a LegalService. Use the specific type; it’s a direct citation signal for AI systems.
Trap 2: Missing or broken @id references
When you link a Service to its MedicalBusiness via "provider": {"@id": "..."}, the @id URL must match exactly. Typo one character and the reference is broken. Validate every @id resolves to another entity in your JSON-LD graph.
Trap 3: Cramming 15 schemas onto the homepage
Homepage gets MedicalBusiness + Person (lead provider). That’s it. Putting every Service schema on the homepage creates a structural mess and dilutes the page’s entity focus. Service schemas belong on their respective service pages.
Trap 4: Validating on Google Rich Results Test instead of validator.schema.org
Google’s tool only checks types Google currently renders as rich results. It ignores whole classes of schema that AI systems use. validator.schema.org is stricter and closer to what AI systems parse. Validate there first.
Trap 5: Using MedicalCondition for treatments
Botox is a treatment, not a condition. Eczema is a condition. In schema, use MedicalTherapy for treatments, MedicalCondition for conditions. Getting this wrong creates a warning on validator and reduces the signal clarity.
Trap 6: Invalid MedicalProcedureType values
The only valid values are NoninvasiveProcedure and PercutaneousProcedure. Using DiagnosticProcedure or making up a custom value fails validation. For injections/needles (Botox, fillers) use PercutaneousProcedure. Everything else uses NoninvasiveProcedure.
Trap 7: Plugin-generated schema that conflicts with hand-rolled schema
Yoast, Rank Math, and similar plugins auto-generate their own Organization and WebSite schema. If you hand-roll your own without disabling the plugin’s version, you end up with two competing schemas on the same page. Google picks one (usually wrong). Either turn off the plugin’s schema output or hand-roll everything and match their structure.
The validation workflow.
Never ship a schema without this four-step validation chain:
- Paste into validator.schema.org. Fix every error. Warnings are usually fine to leave (they’re often about optional properties).
- Paste into Google’s Rich Results Test. This confirms Google can parse your schema into a known rich result type.
- Install on a staging URL and re-test live. Schema that validates in a paste box sometimes fails live because of JSON encoding issues or plugin injection conflicts.
- Monitor Search Console’s Enhancements report. After pushing to production, Google will start showing Enhancement reports for each schema type within 7 to 14 days. Fix any Errors that appear.
What to do this week.
Three concrete actions, ranked by leverage:
- Ship MedicalBusiness or LegalService schema site-wide. Copy the pattern above, swap in your real data, drop it into your header via
<script type="application/ld+json">. This alone is the single biggest schema upgrade most service businesses can make. - Ship Person / Physician / Attorney schema for your lead provider. Include a real
sameAsarray linking to Healthgrades, Vitals, LinkedIn, your bar directory, and anywhere else you’re verifiably listed. Link it back to your business viaworksForand the business’s@id. - Validate everything. Use the 4-step workflow above. Fix every error before leaving the workstation.
Once these are live, you’ve covered 70% of the schema leverage available. The remaining 30% is Service schemas on service pages, FAQPage where FAQ sections exist, and Review/AggregateRating tied to real reviews. All of those follow the same pattern: copy the template, swap real data, validate, ship.
The key lesson.
Schema isn’t a ranking factor. It’s an entity-disambiguation layer. Every piece of schema you ship makes it easier for Google, ChatGPT, Perplexity, and Copilot to figure out exactly who you are, what you do, and who you serve, without guessing from unstructured text.
The sites that win in 2026 are the ones whose schema is clean, comprehensive, and validator-tested. The sites that struggle are either the ones with no schema or, more often, the ones with schema that looks right but validates as broken.
If you want the full rollout without assembling it yourself, the Claude Code SEO Operator Kit packages this exact workflow: the schema playbook, the prompts that generate the JSON-LD, and the validation checklist, ready to run on your own site.
