Fix Playbook
Add schema.org structured data
Add a machine-readable business layer so assistants can bind facts to the right entity.
Use this playbook when the report flags limited schema, missing local business markup, invalid JSON-LD, or structured data that conflicts with visible page content.
What this fixes
- The assistant cannot confidently identify the business type.
- Hours, phone, service area, or address are hard to extract.
- Service pages do not connect back to the correct location.
- The website and profiles say different things.
Implementation steps
- Pick the right type. Use the most specific schema.org subtype that honestly fits the business.
- Create a stable entity ID. Use the canonical location URL plus a fragment such as
#business. - Add core facts. Include name, URL, phone, address, geo, hours, service area, and
sameAsprofile links where accurate. - Connect services. Add
ServiceorOfferCatalogwhen the page describes specific offerings. - Validate parity. Every marked-up business fact should appear visibly on the same page or a clearly linked canonical source.
Copy-paste starters
Med spa
{
"@context": "https://schema.org",
"@type": "HealthAndBeautyBusiness",
"@id": "https://example.com/locations/oakland#business",
"name": "Example Med Spa Oakland",
"url": "https://example.com/locations/oakland",
"telephone": "+1-510-555-0100",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "100 Broadway",
"addressLocality": "Oakland",
"addressRegion": "CA",
"postalCode": "94607",
"addressCountry": "US"
},
"areaServed": ["Oakland, CA", "Emeryville, CA", "Berkeley, CA"],
"serviceType": ["Botox", "Dermal fillers", "Laser hair removal"],
"potentialAction": {
"@type": "ScheduleAction",
"name": "Book consultation",
"target": "https://example.com/book/oakland"
}
}
Home services
{
"@context": "https://schema.org",
"@type": "HomeAndConstructionBusiness",
"@id": "https://example.com/locations/phoenix#business",
"name": "Example Roofing Phoenix",
"url": "https://example.com/locations/phoenix",
"telephone": "+1-602-555-0100",
"areaServed": ["Phoenix, AZ", "Scottsdale, AZ", "Tempe, AZ"],
"serviceType": ["Roof repair", "Roof replacement", "Storm damage inspection"],
"potentialAction": {
"@type": "QuoteAction",
"name": "Request roofing estimate",
"target": "https://example.com/request-quote?location=phoenix"
}
}
Restaurant
{
"@context": "https://schema.org",
"@type": "Restaurant",
"@id": "https://example.com/locations/manhattan#restaurant",
"name": "Example Bistro Manhattan",
"url": "https://example.com/locations/manhattan",
"telephone": "+1-212-555-0100",
"servesCuisine": "Italian",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "148 W 51st St",
"addressLocality": "New York",
"addressRegion": "NY",
"postalCode": "10019",
"addressCountry": "US"
},
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "11:30",
"closes": "22:00"
}]
}
Verification checklist
- JSON-LD parses in Schema Markup Validator.
- Google Rich Results Test shows no critical errors for supported types.
- The marked-up phone, hours, address, services, and URLs match visible content.
- Each location has a unique
@id. - Service pages link back to the correct business or location entity.
Schema is useful only when the answer changes
After validation and deploy, re-scan the same report. The goal is a clearer assistant read, not just a valid code block.
Re-run checkRelated: Structured data, Profile consistency, Action path