Clariola
Blog/Local SEO7 min readLeer en español

LocalBusiness Schema: How to Mark Up Your Local Site in 2026

Subtypes, opening hours, multi-location and the aggregateRating trap

Historic storefronts lining a small-town main street

What LocalBusiness schema does (and why it matters in 2026)

LocalBusiness schema is structured data (JSON-LD) you add to a page so search engines and AI systems can read your business name, address, phone, hours and location as facts instead of guessing them from text. To set it up, you pick the most specific LocalBusiness subtype, mark up the required name and address, add recommended properties like telephone, geo, priceRange and openingHoursSpecification, then validate it in Google's Rich Results Test. That is the whole job — the rest is getting the details right.

The reason it matters more now: AI Overviews and AI assistants increasingly answer "near me" questions by reading entities, not ranking ten blue links. A clean LocalBusiness block is how you hand them your hours and address in a format they trust. This guide goes deep on one layer of our pillar on the best schema types for small businesses — the local entity itself.

Pick the most specific LocalBusiness subtype

Google explicitly recommends using "the most specific LocalBusiness sub-type possible" rather than the generic type. Schema.org lists 33 direct subtypes under LocalBusiness, and most of them branch further — so a dental clinic is a Dentist, a law firm is a LegalService, a shop is a Store (or a narrower type like ClothingStore).

LocalBusiness is unusual because it is a subtype of both Organization and Place. That is why it carries address and geo like a Place but also name and logo like an Organization. Common subtypes:

If a type that fits you does not exist, fall back to the nearest parent. Never use two unrelated types hoping for more features — use an array only when the business genuinely offers both.

The properties Google actually reads

Only name and address are required, but a LocalBusiness block with just those two is wasted. These are the properties Google documents for local business pages:

PropertyTypeNotes
name *TextRequired. The business name.
address *PostalAddressRequired. Use streetAddress, addressLocality, addressRegion, postalCode, addressCountry.
telephoneTextInclude country and area code.
urlURLThe page for that specific location, not just the homepage.
geoGeoCoordinateslatitude/longitude, at least 5 decimal places.
priceRangeTextRelative, e.g. "$$" or "$10-30". Max 100 characters.
openingHoursSpecificationOpeningHoursSpecificationSee the dedicated section below.
imageURLSupply 16:9, 4:3 and 1:1 versions when you can.

Restaurants add servesCuisine and a menu URL. Everything else inherits the Organization recommendations — logo, sameAs profiles and so on.

How to add LocalBusiness schema step by step

  1. Choose the subtype from the list above and open the location page you want to mark up.
  2. Write the JSON-LD in a <script type="application/ld+json"> block, or use your CMS's schema field. The Webflow and WordPress specifics differ — see how to add schema in Webflow if that is your platform.
  3. Fill name and address first, then layer in telephone, url, geo, priceRange and hours.
  4. Match the visible page. The hours and address in your markup must equal what a human sees. Mismatches are a policy violation.
  5. Validate in the Rich Results Test and the Schema Markup Validator, and fix every error before you ship.

A minimal but complete example for a single-location dental clinic:

{
  "@context": "https://schema.org",
  "@type": "Dentist",
  "name": "Riverside Family Dental",
  "image": "https://example.com/riverside.jpg",
  "url": "https://example.com/locations/riverside",
  "telephone": "+1-312-555-0147",
  "priceRange": "$$",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "412 River St",
    "addressLocality": "Chicago",
    "addressRegion": "IL",
    "postalCode": "60610",
    "addressCountry": "US"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 41.90320,
    "longitude": -87.63350
  },
  "openingHoursSpecification": [{
    "@type": "OpeningHoursSpecification",
    "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday"],
    "opens": "09:00:00",
    "closes": "17:00:00"
  }]
}

Not sure your markup is doing anything? A Clariola audit crawls your raw HTML the way a non-JavaScript crawler does, lists the schema types found on each page, and flags gaps and retired types — all in a prioritized PDF, for a one-time $9.99. See what your pages expose.

Opening hours: openingHoursSpecification done right

Use openingHoursSpecification, not the older free-text openingHours. Each entry takes dayOfWeek (full day names or schema.org URLs), opens and closes in hh:mm:ss format. Group days that share the same hours into one entry, and give split shifts (lunch close) two entries for the same day.

For seasonal or holiday hours, add validFrom and validThrough in YYYY-MM-DD format on a separate entry. That is how you say "closed for the holidays" without breaking your normal schedule. Keep this current — stale hours are worse than none, because they erode the trust that earns you a rich result.

Multiple locations and departments

If you run several branches, do not stuff them into one block. Google's guidance is one LocalBusiness block per location, on that location's own page, which Google indexes separately and matches to the nearest searcher. Pair this with a complete Google Business Profile for each location so your on-site and off-site signals agree.

For a store with distinct departments — a supermarket with a pharmacy, say — use the department property, one entry per department, and name each as {store name} {department name}. Only repeat the properties that differ (the pharmacy's own phone and hours); everything else inherits from the parent.

The aggregateRating trap

This is the single most common way local sites earn a manual action. Google's policy: a page using LocalBusiness or any Organization type is ineligible for review stars when the entity controls the reviews about itself. Putting an aggregateRating on your own site, hand-typed into the JSON-LD or pulled from a widget you control, is a structured-data policy violation — and the penalty can strip rich results from the whole domain, not just one page.

Ratings have to be collected directly from users, and the self-serving ones belong on third-party platforms. Instead of faking stars, invest in real reviews — here's how to go about asking customers for Google reviews without breaking Google's rules.

Run this quick check before you ship any LocalBusiness block.

When you need an audit

Mark up your site, then watch for these signals that something is off: the Rich Results Test shows your LocalBusiness block but the SERP never renders hours or a knowledge panel; you added schema months ago and nothing changed; you migrated platforms and are not sure what the new theme outputs; or Search Console flags a structured-data issue you can't locate. Those all point to markup that exists but isn't trusted or isn't being read.

A Clariola audit, a one-time $9.99, crawls your pages like a non-JavaScript crawler, inventories the schema types on each URL, flags schema types Google has retired (with the date they were deprecated), and reviews your SEO, content structure and AI-search visibility — then hands you a prioritized action plan by email. Start your audit and stop guessing whether your markup works.

FAQ

Do I need LocalBusiness schema if I already have a Google Business Profile? Yes. The profile feeds Google's local data, but LocalBusiness schema on your own pages reinforces the same facts for Google Search, Bing and AI assistants that read your HTML directly. They work together, not instead of each other.

JSON-LD, Microdata or RDFa? JSON-LD. Google recommends it, it keeps your markup in one block separate from the HTML, and every schema tool expects it.

Will LocalBusiness schema get me into AI Overviews? It won't guarantee it, but it gives AI systems a clean, machine-readable entity to cite. Missing or messy markup makes you easy to skip.

Prefer Spanish? Leé la versión en español.

Keep reading