New ChatGPT vs Google Search Volume: What OpenAI’s 20% Claim Really Means

Technical SEO

Local Business Schema: LocalBusiness, Service and Review Markup

What Google really supports in LocalBusiness markup, how I add hours, coordinates, departments and services, and why your own review stars won't show.

Local Business Schema: LocalBusiness, Service and Review Markup

Quick Answer

Local business schema is JSON-LD structured data (a small block of code) that describes your business to Google. Use the most specific LocalBusiness subtype, include the required name and address, and add url, telephone, geo, openingHoursSpecification and priceRange. Add one block per location page, describe services with Service markup, and don't mark up your own reviews. Google treats them as self-serving and shows no stars.

Key Takeaways

  • Google requires only name and address. It recommends url, telephone, geo, hours and priceRange.
  • Use the most specific subtype, or an array of types. Google doesn't support additionalType.
  • Coordinates need at least five decimal places, and each location needs its own block on its own page.
  • Use 00:00 to 23:59 for 24-hour opening and 00:00 to 00:00 for closed days.
  • Reviews a business controls about itself, including embedded widgets, can't earn star snippets on LocalBusiness pages.
  • Schema supports your Business Profile but doesn't replace or edit it, so keep both the same.
In this article
  1. What Local Business Schema Does (and Doesn’t Do)
  2. Required and Recommended LocalBusiness Properties
  3. Opening Hours With openingHoursSpecification
  4. Geo, areaServed and sameAs
  5. Multi-Location Businesses and the Department Property
  6. Service Markup: Describing What You Do
  7. Review Markup Rules for Local Businesses
  8. A Full Local Business Schema Example in JSON-LD
  9. How Local Business Schema Relates to Your Business Profile
  10. Testing and Monitoring Your Markup
  11. Common Local Business Schema Mistakes
  12. Conclusion: Keep Local Business Schema Simple and Accurate
  13. Frequently asked questions

Local business schema is a block of structured data, usually JSON-LD, that tells Google what your business is, where it is, when it’s open and what it offers. It won’t rank you by itself. But it removes guesswork about your core details. In this guide I cover what Google supports, what it ignores, and the mistakes that get markup ignored or penalised.

Here is the short version. Use the most specific LocalBusiness subtype. Include name and address, which are the only required properties. Add hours, phone, URL and coordinates. And never mark up your own reviews hoping for stars.

What Local Business Schema Does (and Doesn’t Do)

Google uses LocalBusiness markup to understand business details such as hours, departments and contact information. Google’s local business structured data documentation says it can support the business knowledge panel in Search and Maps. It can also support business carousels for category searches such as “best restaurants near me”.

There are three things it doesn’t do:

  • It doesn’t guarantee any rich result. Google says structured data makes a page eligible. It doesn’t promise a feature will appear.
  • It doesn’t create or edit your Google Business Profile. You manage the profile separately. Maps and the local pack take most of their information from there.
  • It doesn’t give your own site review stars. I explain this below, because it’s the most common misunderstanding I see. My guide to when star ratings show in Google covers the wider rules.

I think of schema as a consistency signal. Your website, your Business Profile and your citations should all describe the same business. Schema is the machine-readable version of what your website says. If you’re new to structured data, start with our schema markup guide, then come back here for the local details.

Google’s list of requirements is short. Only two properties are required:

  • name: the business name, exactly as customers see it on signs and on your Business Profile.
  • address: a PostalAddress with as many fields filled in as you can (street, locality, region, postal code, country).

The recommended properties hold the useful detail:

  • url: a working link to the page for that one location. If you have several branches, don’t just use your homepage.
  • telephone: ideally with the country code.
  • geo: latitude and longitude, with at least five decimal places.
  • openingHoursSpecification: regular, special and seasonal hours.
  • priceRange: either a range such as “$10-15” or symbols such as “$$”. Google drops values of 100 characters or more.
  • department: separate parts of the business that have their own details.
  • menu and servesCuisine: for restaurants and other food businesses.
  • review and aggregateRating: only for sites that publish reviews of other local businesses.

Beyond Google’s list, schema.org offers properties that help describe your business, even though they don’t turn on any feature. For most local sites, I add image, logo, sameAs, areaServed and @id.

Choose the Most Specific Subtype

Google asks you to use the most specific LocalBusiness subtype that fits. schema.org has hundreds. They include Dentist, Plumber, Electrician, AutoRepair, Restaurant, HairSalon, LegalService and RealEstateAgent.

If you really fit two types, use an array, for example "@type": ["Bakery", "CafeOrCoffeeShop"]. Google says it doesn’t support additionalType for this, so don’t rely on it. If nothing specific exists, plain LocalBusiness is fine. Don’t pick a wrong type just because it sounds closer.

Opening Hours With openingHoursSpecification

In my experience, hours are where most markup breaks. openingHoursSpecification takes one object or a list (array) of objects. Each object has dayOfWeek, opens and closes. Google’s documentation covers these patterns:

  • Same hours on several days: group the days in one object, e.g. Monday to Friday 08:30–18:00.
  • Past midnight: use a single entry, such as Saturday opening at 18:00 and closing at 03:00. Don’t split it into two days.
  • Open 24 hours: set opens to 00:00 and closes to 23:59.
  • Closed all day: set both opens and closes to 00:00.
  • Seasonal or holiday hours: add validFrom and validThrough in YYYY-MM-DD format. Without them, Google treats the hours as year-round.

Use full day names such as “Monday” or the schema.org URLs (https://schema.org/Monday). The short “Mo-Fr 09:00-17:00” style belongs to the older openingHours text property. Don’t mix the two formats in one block.

The hours in your markup must match the hours on the page and on your Business Profile. When you update holiday hours in your profile, update the site too. I put both on the same checklist so one never changes without the other.

Geo, areaServed and sameAs

Geo

Use GeoCoordinates with latitude and longitude as numbers. Google asks for at least five decimal places. Five decimals is about one-metre precision. So take the coordinates from the real entrance or pin on your map, not the centre of the town.

areaServed

areaServed is a schema.org property you can use on LocalBusiness (it comes from Organization) and on Service. It accepts plain text, a Place (such as a City), an AdministrativeArea or a GeoShape. Google doesn’t list it as a supported property for local business features. So I treat it as helpful context, not a ranking lever.

It’s most useful for service area businesses. Say a plumber works from home. They still need an address, because Google requires it. But you can include only the locality, region and postal code if you don’t publish a street address. Then list the towns they actually cover in areaServed. Our guide to service area business SEO covers the rest of that setup, including how to handle the address on your Business Profile.

sameAs

sameAs is a list of URLs for other pages that clearly represent the same business. That could be your Facebook page, Instagram, LinkedIn, YouTube channel or a Wikipedia article if you have one. It helps connect your website to the rest of your online presence. Only list profiles you own or that are clearly about you. Remove dead ones.

Multi-Location Businesses and the Department Property

If you have several branches, give each branch its own page with its own LocalBusiness block. That block needs its own address, phone, hours, geo and a url pointing to that location page. Don’t put ten addresses in one block on your homepage.

Give each location a stable @id (a fixed ID, for example the location URL plus #dentist). That lets other markup, such as Service blocks, point to the right branch. If you’re building these pages, our guide to location pages that aren’t thin explains what content each one needs to earn its place.

department is for something different. It covers separate parts of one business at one site, like a pharmacy inside a supermarket or a service centre at a car dealership. Google’s naming rules are specific:

  • Name the department as the store name plus the department name, for example “Westfield Market Pharmacy”.
  • If the department has its own brand, use that brand name alone.
  • Only include properties that differ from the main business, such as phone and hours.
"department": [
  {
    "@type": "Pharmacy",
    "name": "Westfield Market Pharmacy",
    "telephone": "+44 161 496 0100",
    "openingHoursSpecification": {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "09:00",
      "closes": "17:30"
    }
  }
]

Departments should mirror how you’re set up on Google Business Profile. If the pharmacy has its own profile, it should have its own department entry. For managing the profiles themselves, see our guide to multi-location SEO.

Service Markup: Describing What You Do

Google has no rich result for Service. I still add it on service pages, because it states clearly which business provides which service, and where. The key schema.org properties are:

  • name and serviceType: what the service is.
  • provider: the business offering it, ideally linked by @id.
  • areaServed: where you provide it.
  • offers: an Offer with a price, if you show one on the page.

On a single service page, a standalone block works well:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Service",
  "name": "Boiler repair",
  "serviceType": "Boiler repair",
  "provider": { "@id": "https://www.example.com/#business" },
  "areaServed": [
    { "@type": "City", "name": "Sheffield" },
    { "@type": "City", "name": "Rotherham" }
  ],
  "url": "https://www.example.com/services/boiler-repair/"
}
</script>

On the location page itself, you can list services inside the LocalBusiness block using hasOfferCatalog, as in the full example below. Pick one approach per page and keep it the same across the site.

Review Markup Rules for Local Businesses

This is where good intentions cause problems. Google’s review snippet guidelines cover this. If a business controls the reviews about itself, its pages with LocalBusiness or other Organization markup can’t get star review snippets. Google calls these self-serving reviews.

That rule covers reviews you collect on your own site. It also covers reviews embedded through third-party widgets, including Google and Facebook review widgets. So the common trick of pulling in your Google reviews and wrapping them in aggregateRating won’t produce stars.

Other rules from the same guidelines apply to anyone using review markup:

  • Reviews and ratings you mark up must be visible on the page.
  • Don’t combine ratings from other websites.
  • No fake reviews and no hidden paid-for (incentivised) reviews.
  • For local businesses, ratings must come directly from users. Editors can’t create, pick or compile them.

The review and aggregateRating properties on LocalBusiness are meant for review platforms and directories that rate other businesses. If you’re a single business, leave them out. I’d spend that effort on getting genuine Google reviews instead. Our guide to Google Business Profile optimization covers how reviews fit into your profile.

Breaking these rules isn’t harmless. Google can apply a manual action (a penalty set by a person at Google) for structured data that breaks its guidelines. That removes rich result eligibility until you fix it and ask for reconsideration.

A Full Local Business Schema Example in JSON-LD

Here’s a complete block for a made-up dental practice. It uses a specific subtype, a stable @id, five-decimal coordinates, grouped weekday hours, a one-day holiday closure, service areas, social profiles and a list of services. On purpose, it has no review markup.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Dentist",
  "@id": "https://www.example.com/locations/leeds/#dentist",
  "name": "Northgate Dental Leeds",
  "url": "https://www.example.com/locations/leeds/",
  "telephone": "+44 113 496 0000",
  "image": "https://www.example.com/images/leeds-surgery.jpg",
  "priceRange": "££",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "14 Northgate Street",
    "addressLocality": "Leeds",
    "postalCode": "LS1 4AB",
    "addressCountry": "GB"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 53.79648,
    "longitude": -1.54785
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "08:30",
      "closes": "18:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Saturday",
      "opens": "09:00",
      "closes": "13:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Saturday",
      "opens": "00:00",
      "closes": "00:00",
      "validFrom": "2026-12-26",
      "validThrough": "2026-12-26"
    }
  ],
  "areaServed": [
    { "@type": "City", "name": "Leeds" },
    { "@type": "City", "name": "Bradford" }
  ],
  "sameAs": [
    "https://www.facebook.com/northgatedentalleeds",
    "https://www.instagram.com/northgatedentalleeds"
  ],
  "hasOfferCatalog": {
    "@type": "OfferCatalog",
    "name": "Dental treatments",
    "itemListElement": [
      {
        "@type": "Offer",
        "itemOffered": {
          "@type": "Service",
          "name": "Teeth whitening",
          "serviceType": "Cosmetic dentistry",
          "url": "https://www.example.com/treatments/teeth-whitening/"
        }
      },
      {
        "@type": "Offer",
        "itemOffered": {
          "@type": "Service",
          "name": "Emergency dental appointment",
          "serviceType": "Emergency dentistry",
          "url": "https://www.example.com/treatments/emergency-dentist/"
        }
      }
    ]
  }
}
</script>

A few notes on adapting it:

  • Swap in your own subtype and remove anything you can’t confirm on the page.
  • Keep name, address and telephone identical, character for character, to your Business Profile.
  • Put the block in the page’s HTML, either in the head or the body. Google reads JSON-LD in both places, even when JavaScript adds it. But I prefer server-rendered markup because it’s the safer choice.

How Local Business Schema Relates to Your Business Profile

Your Google Business Profile is the main source for what Google shows in Maps and the local pack. Schema on your site is a supporting signal about the same business. It doesn’t replace the profile.

My practical advice is to treat both as one set of data:

  • Name: the real business name, without extra keywords added on the profile or the site.
  • Address and phone: the same format in both places.
  • Hours: including special and holiday hours.
  • Website URL: the profile should link to the location page that has the matching markup.
  • Category: your primary profile category and your schema subtype should describe the same kind of business.

When the two disagree, you send mixed signals. When they agree, the markup backs up what Google already knows.

Testing and Monitoring Your Markup

Google’s own process is simple:

  1. Run the page or code through the Rich Results Test and fix any critical errors.
  2. Run the Schema Markup Validator to catch schema.org issues on properties Google doesn’t check, such as areaServed or Service.
  3. Put the markup live on a few pages and use the URL Inspection tool in Search Console to see how Google renders them.
  4. Request indexing for those pages, then roll out to the rest.
  5. Submit or update your sitemap so Google keeps finding changes.

Warnings about missing recommended properties are not errors. Fix them if the information exists and is shown on the page. If it isn’t, ignore the warning. I never make up data just to clear a warning.

Common Local Business Schema Mistakes

These are the problems I check for first when I review a local site:

  • Marking up data that isn’t on the page. Hours, phone numbers and prices in the markup should be visible to visitors.
  • Self-serving review stars. Adding aggregateRating to your own LocalBusiness markup, including from a review widget.
  • Every location on the homepage. Use one block per location, on that location’s page.
  • Duplicate blocks from plugins. An SEO plugin and a theme can both output LocalBusiness with conflicting details. Check the rendered page and keep one source.
  • Rough coordinates. Fewer than five decimal places, or a pin in the wrong place.
  • Old hours. Holiday hours updated on the profile but not on the site.
  • Keyword-stuffed names. “Best Emergency Plumber Leeds Ltd” in name when the business is called something else.
  • Wrong subtype. Picking a type that sounds close instead of one that’s correct.
  • Using areaServed instead of an address. address is required. A partial address is fine, but a missing one is not.

Conclusion: Keep Local Business Schema Simple and Accurate

Good local business schema isn’t clever. It’s a specific subtype, a correct name and address, precise coordinates, correct hours and one block per location. Add service markup that matches your service pages, and skip self-serving review stars.

My suggested next step is to audit one location page. Compare its markup with your Business Profile line by line. Run it through the Rich Results Test. Fix any mismatch before you roll the same template out to your other locations.

Frequently Asked Questions

Does local business schema help with rankings?

Not directly. It helps Google understand and confirm your business details. It can also make pages eligible for features such as the knowledge panel. The local pack depends mainly on your Business Profile, proximity, relevance and prominence.

Can I add review stars to my own business website with schema?

You can add the markup, but Google won't show stars for it. Reviews that a business controls about itself are treated as self-serving on LocalBusiness and Organization pages. This includes reviews pulled in through Google or Facebook widgets. The review properties are meant for sites that review other businesses.

What is the difference between LocalBusiness and Organization schema?

LocalBusiness is a subtype of Organization. It is for businesses with a physical location or service area that customers deal with locally. It adds properties such as opening hours, geo coordinates and price range. A purely online company would normally use Organization instead.

How do I add schema for a service area business without a public address?

Google still requires the address property. But you can use a partial PostalAddress with just the town, region, postal code and country. Then list the areas you cover with areaServed. Keep it in line with how your Business Profile handles the address.

Should every location have its own LocalBusiness markup?

Yes. Each branch should have its own page with its own block. That block holds that location's address, phone, hours, coordinates and URL. Don't put every address in a single block on the homepage.

How do I mark up a business that is open 24 hours?

In openingHoursSpecification, list the days and set opens to 00:00 and closes to 23:59. To show a day when you're closed, set both opens and closes to 00:00.

How long does it take for Google to pick up new schema?

Google reads it the next time it crawls the page, and that timing differs from site to site. You can speed things up by requesting indexing in the URL Inspection tool and keeping your sitemap up to date. Even then, rich features aren't guaranteed.

Is JSON-LD better than microdata for local business schema?

Google supports both, but it recommends JSON-LD. JSON-LD sits in one block, separate from your visible HTML. That makes it easier to add, update and check without touching the page layout.

Get the Next Guide in Your Inbox

Google updates, AI search changes and practical SEO guides. We email you when a new article is published, nothing else.

One email when we publish something new. No spam, unsubscribe in one click. Privacy

Written by Lovepreet Singh Digital Marketing Manager @ Softtrix
  • 12+ years in SEO
  • 331 articles
  • Punjab, India

Lovepreet Singh has been working in SEO for the last 12 years. He started as an SEO analyst, checking rankings and fixing on-page issues, and today he is Digital Marketing Manager at Softtrix Tech Solutions, looking after search and growth for client websites, from online stores to local service businesses.

  • AI Search & AEO
  • Technical SEO
  • Local SEO
  • Google Business Profile

Keep Reading