Skip to main content

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

  1. Pick the right type. Use the most specific schema.org subtype that honestly fits the business.
  2. Create a stable entity ID. Use the canonical location URL plus a fragment such as #business.
  3. Add core facts. Include name, URL, phone, address, geo, hours, service area, and sameAs profile links where accurate.
  4. Connect services. Add Service or OfferCatalog when the page describes specific offerings.
  5. 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 check

Related: Structured data, Profile consistency, Action path