DEV Community

Sal Talash
Sal Talash

Posted on

Sal Talash: LocalBusiness structured data, done right: the JSON-LD Google reads, and the rules that quietly disqualify it

LocalBusiness structured data, done right

Local business sites tend to have one of two problems with structured data. Either they have none at all, or they have a block of JSON-LD a plugin generated years ago that now contradicts the page: old hours, a moved address, and a five-star rating sourced from nowhere.

I build UOVA, an AI website builder, where structured data is generated from the same content as the visible page, so I spend a lot of time in Google's documentation on this. Disclosure: that gives me a stake in the website-builder market. What follows is that documentation boiled down to what a developer needs, as I read it on October 1, 2026.

What LocalBusiness is

Schema.org defines LocalBusiness as "a particular physical business or branch of an organization." It inherits from both Organization and Place, and has many subtypes, including FoodEstablishment, HomeAndConstructionBusiness, HealthAndBeautyBusiness, ProfessionalService, Store, Dentist and AutomotiveBusiness, with deeper subtypes beneath several of those.

Google's guidance: "Use the most specific LocalBusiness sub-type possible." If more than one applies, use an array of types. Google also notes that "additionalType isn't supported."

The required and recommended properties

Google's LocalBusiness documentation requires exactly two properties:

  • name: "The name of the business."
  • address: a PostalAddress.

It recommends: aggregateRating, department, geo, menu, openingHoursSpecification, priceRange, review, servesCuisine, telephone and url.

The details on a few of these are easy to miss:

  • geo: for latitude and longitude, "the precision must be at least 5 decimal places."
  • priceRange: "This field must be shorter than 100 characters."
  • telephone: include the country and area code.
  • url: "The URL must be a working link."

A complete example

Here is markup for a fictional bakery. The business, address and phone number are invented for illustration.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Bakery",
  "name": "Example Street Bakery",
  "url": "https://www.example-bakery.ca/",
  "telephone": "+1-416-555-0100",
  "priceRange": "$$",
  "image": "https://www.example-bakery.ca/images/storefront.jpg",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "123 Example Street",
    "addressLocality": "Toronto",
    "addressRegion": "ON",
    "postalCode": "M4M 0A0",
    "addressCountry": "CA"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 43.66123,
    "longitude": -79.33456
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "08:00",
      "closes": "18:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Saturday", "Sunday"],
      "opens": "09:00",
      "closes": "15:00"
    }
  ]
}
</script>
Enter fullscreen mode Exit fullscreen mode

Bakery is a subtype of FoodEstablishment, which is more specific than LocalBusiness. The coordinates carry five decimal places. Monday is omitted because the fictional shop is closed that day.

Google lists JSON-LD as its recommended format, and it keeps the markup separate from your HTML, which makes it easy to generate from the same data as the page.

The rules that disqualify markup

Correct syntax is not enough. Google's general structured data guidelines contain the rules that quietly make markup ineligible.

It must match the page. "Your structured data must be a true representation of the page content." And: "Don't mark up content that is not visible to readers of the page." If your JSON-LD says you open at 8:00 and your page says 9:00, fix one of them. The easiest way to keep them in sync is to render both from a single source of data.

Required means required. "Items that are missing required properties are not eligible for rich results."

Nothing is guaranteed. "Google does not guarantee that your structured data will show up in search results," even when it is valid.

The review rule that catches most small businesses

This is the rule most likely to catch a small-business site. A common pattern is adding aggregateRating to a business's own LocalBusiness markup, often from a reviews widget.

Google's review snippet documentation says that when "the entity that's being reviewed controls the reviews about itself," pages using LocalBusiness or other Organization markup "are ineligible for star review feature." That applies whether the reviews are typed into the structured data or added "through an embedded third-party widget (for example, Google Business reviews or Facebook reviews widget)." It also says: "Don't aggregate reviews or ratings from other websites."

The LocalBusiness page makes the same point from the other side: aggregateRating "is only recommended for sites that capture reviews about other local businesses." That means directories and review sites, not a business marking up its own stars.

So for your own business: leave aggregateRating and review out of your LocalBusiness markup. Show testimonials on the page for humans, if you like. Just do not mark them up for stars.

Test it

Two free tools:

  • Google's Rich Results Test, which tests "your publicly accessible page to see which rich results can be generated by the structured data it contains." Google's LocalBusiness page says: "Validate your code using the Rich Results Test and fix any critical errors."
  • The Schema Markup Validator at validator.schema.org, which checks your markup against the schema.org vocabulary in general, not just the parts Google uses.

Run both after every change to hours, address or phone number, not just at launch.

A short checklist

  • [ ] Most specific subtype used; no additionalType.
  • [ ] name and address present.
  • [ ] geo to at least five decimal places.
  • [ ] telephone with country and area code; url resolves.
  • [ ] Hours in markup match hours on the page.
  • [ ] No aggregateRating or review on your own business.
  • [ ] Rich Results Test passes with no critical errors.

Structured data is one of the few SEO tasks with a clear specification and a free test. The hard part is keeping it true over time. I'm Sal Talash, and I write about the engineering behind small-business websites at saltalash.vercel.app.

Sources

  • Google Search Central, "Local Business (LocalBusiness) structured data"
  • Google Search Central, "General structured data guidelines"
  • Google Search Central, "Review snippet structured data"
  • Google, Rich Results Test
  • Schema.org, "LocalBusiness" and "Bakery"
  • Schema Markup Validator

Drafted with AI assistance.


More from Sal Talash: saltalash.vercel.app · UOVA · YouTube

Top comments (0)