A model reading a restaurant’s website sees text written for people. "Open daily from early" is clear to a human and useless to a machine. Structured data turns sentences like that into facts that cannot be misread.
Where it goes
The format Google recommends is JSON-LD: a separate script block, unconnected to your page layout. It goes in the <head> of your home page. On WordPress an SEO plugin or a custom header field handles it.
Ready code for a single-location business
Replace the values with your own. Leave the structure alone.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Bakery",
"@id": "https://yourdomain.com/#business",
"name": "Clock Tower Bakery",
"url": "https://yourdomain.com/",
"telephone": "+1 718 555 0142",
"email": "hello@yourdomain.com",
"priceRange": "$$",
"image": "https://yourdomain.com/img/shopfront.jpg",
"address": {
"@type": "PostalAddress",
"streetAddress": "214 Bedford Avenue",
"addressLocality": "Brooklyn",
"addressRegion": "NY",
"postalCode": "11211",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 40.7178,
"longitude": -73.9571
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "06:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "07:00",
"closes": "14:00"
}
],
"sameAs": [
"https://www.facebook.com/yourprofile",
"https://www.instagram.com/yourprofile",
"https://maps.app.goo.gl/yourlisting"
]
}
</script>
Which fields actually change something
| Field | Purpose | Required |
|---|---|---|
@type | The narrowest type that fits: Bakery, Dentist, HairSalon, AutoRepair. Generic LocalBusiness works but says less | yes |
name | Exactly as it appears on your sign and in Google | yes |
address | Broken into street, city and postal code, not one text string | yes |
openingHoursSpecification | Hours in a format that cannot be misread | yes |
telephone | One form, the same as everywhere else | yes |
geo | Coordinates, useful for neighbourhood questions | recommended |
sameAs | Links to your profiles. Ties the site to your listing and social accounts | recommended |
@id | A stable identifier, makes it easier to join data across pages | recommended |
address field. It has to be a PostalAddress object with separate fields, otherwise a machine is still guessing where the street ends and the city begins.Extensions worth adding
Questions and answers
If your site has a questions section, mark it up with FAQPage. It is the simplest way to hand a model ready-made question-and-answer pairs, which is exactly what it is looking for when assembling a reply.
Menus, services, price lists
A restaurant can mark up its menu with Menu, a service business its list with Service or hasOfferCatalog. That way the model knows you sell Neapolitan pizza specifically, not food generally.
Reviews
AggregateRating exists, but tread carefully: Google requires the rating to cover reviews actually visible on your own page. Copying your Google average into your own markup breaks the rules and risks a manual penalty.
How to validate it
- Paste your URL into Google’s Rich Results Test. It shows detected types and errors.
- For a stricter check use the schema.org validator, which tests against the vocabulary rather than only Google’s requirements.
- Open your page, hit Ctrl+U and search the source for
application/ld+json. If it is missing, your plugin never output the code. - After two weeks check the rich results report in Search Console. That shows what Google saw on its own crawl.
What structured data will not fix
This gets misunderstood, so plainly: structured data removes guessing, it does not create content. If your site does not answer customer questions, no markup makes up for it. It also will not help if a crawler cannot reach the site at all, which is a surprisingly common case covered in the post on AI crawlers in robots.txt.
Nor does it replace your Google profile, which is where the model gets your category, reviews and hours. The two should say exactly the same thing. How to sort out the profile is in the post on Google Business Profile and ChatGPT.
If you would rather somebody pasted and validated this for you, structured data is part of the paid repair. Scope and price are stated plainly on the Pricing page.
