Technical

LocalBusiness structured data: copy-paste code for a local business

Structured data is a note for machines, hidden in your page source. No customer will ever see it, and a crawler gets your name, address, hours and trade from it without guessing.

·Updated May 11, 2026·8 min read

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

FieldPurposeRequired
@typeThe narrowest type that fits: Bakery, Dentist, HairSalon, AutoRepair. Generic LocalBusiness works but says lessyes
nameExactly as it appears on your sign and in Googleyes
addressBroken into street, city and postal code, not one text stringyes
openingHoursSpecificationHours in a format that cannot be misreadyes
telephoneOne form, the same as everywhere elseyes
geoCoordinates, useful for neighbourhood questionsrecommended
sameAsLinks to your profiles. Ties the site to your listing and social accountsrecommended
@idA stable identifier, makes it easier to join data across pagesrecommended
The most common error: the address written as a single string in the 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

  1. Paste your URL into Google’s Rich Results Test. It shows detected types and errors.
  2. For a stricter check use the schema.org validator, which tests against the vocabulary rather than only Google’s requirements.
  3. Open your page, hit Ctrl+U and search the source for application/ld+json. If it is missing, your plugin never output the code.
  4. 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.

Find out whether the assistants name your business

We ask ChatGPT three of your customers’ questions and show you the full answers with timestamps. You get the result straight away, no card.

Get the free scan
Free scan