TechnicalSchemaLocal SEO

Local Business Schema: Subtypes, Hours, Locations

Local business schema is structured data using the schema.org LocalBusiness type, or a more specific subtype such as Plumber or Dentist, to describe a physical business or branch: its name, address, phone, opening hours and coordinates. Google requires only name and address; everything else is recommended. The work is in choosing the right subtype, marking hours correctly, and handling more than one location without mixing them up.

This guide is for owners and marketers of businesses with a real address, and the developers who build their sites. It covers subtype choice, the properties Google documents, hours, location properties, and multi-location markup. Service markup is covered in Service schema and brand-level identity in Organization schema, so this page stays on the location itself.

On this page

What local business schema does, and doesn’t, do

Local business schema tells search engines, in machine-readable form, the same facts a visitor reads on your contact or location page. Google’s LocalBusiness documentation says it lets you tell Google about “business hours, different departments within a business, reviews (if your site captures reviews about other businesses), and more”, and that results may show a knowledge panel with business details or a carousel for category searches.

What it doesn’t do is rank you in the map pack by itself. Google’s own guide to local ranking says local results “are mainly based on relevance, distance, and popularity”, and points to the Business Profile, reviews and links as the levers. Schema supports that by making your website’s version of the facts explicit and consistent with the profile. It’s one part of the local SEO checklist, not a substitute for it.

For AI assistants, the value is similar: clear, consistent facts about where you are and when you’re open reduce the chance of being described wrongly. That audience is growing fast. BrightLocal’s Local Consumer Review Survey 2026 found that use of ChatGPT and other generative AI tools for local recommendations rose from 6% to 45% of US consumers in a year, while Google’s share fell from 83% to 71%. How assistants choose which local businesses to name is covered in local AI visibility.

Which LocalBusiness subtype should you use?

Use the most specific subtype that is true. Google’s documentation says to “use the most specific LocalBusiness sub-type possible”, and schema.org defines LocalBusiness as “a particular physical business or branch of an organization”, with 30 direct subtypes. It is one of the most used types on the web: the HTTP Archive’s 2024 Web Almanac found LocalBusiness on 3.97% of mobile pages, naming it alongside WebSite (12.73%) and Organization (7.16%) as the JSON-LD types leading adoption. The diagram below shows where common subtypes sit.

Where common LocalBusiness subtypes sit in the schema.org hierarchy A tree. Thing branches to Organization and Place; both lead to LocalBusiness. Under LocalBusiness are example branches: HomeAndConstructionBusiness, with Plumber below it; FoodEstablishment, with Restaurant below it; LegalService; and Dentist. ProfessionalService is shown greyed out and marked deprecated, with a note that schema.org says it was deprecated due to confusion with Service. A tip reads: pick the deepest true type, and use an array of types if the business is genuinely two things; Google does not support additionalType. Pick the deepest type that's true A few of LocalBusiness's 30 direct subtypes, with example children Organization / Place LocalBusiness HomeAndConstruction FoodEstablishment LegalService Dentist ProfessionalService Plumber Restaurant deprecated confused with Service Genuinely two things? Use an array of types. Google doesn't support additionalType.

Scroll the diagram sideways to see all of it.

Source: Ambeltek diagram based on the schema.org type pages for LocalBusiness, ProfessionalService, Plumber and Restaurant, and Google's LocalBusiness documentation.

Three practical rules:

  • Avoid ProfessionalService. Schema.org’s definition says the type “was deprecated due to confusion with Service”, and lists the types it used to include, such as Dentist, AccountingService, Attorney, Electrician and Plumber. Use those directly.
  • Use an array for genuine dual businesses. Google’s documentation says that if you have multiple types, specify them as an array, and that additionalType isn’t supported.
  • Don’t pick a type for the keyword. A LegalService that is really a marketing agency is misleading markup, which Google’s general guidelines prohibit.

The properties Google actually uses

Google’s documentation lists two required and ten recommended properties. Because LocalBusiness is a subtype of Organization, it also recommends following the Organization fields.

PropertyStatusGoogle’s rule worth knowing
nameRequiredThe business name
addressRequiredA PostalAddress, “as many properties as possible”
telephoneRecommendedInclude country code and area code
urlRecommendedThe specific location’s URL, and it must work
geoRecommendedLatitude and longitude with at least 5 decimal places
openingHoursSpecificationRecommendedopens and closes in hh:mm:ss
priceRangeRecommendedUnder 100 characters, e.g. “$10-15” or ”$$$”
departmentRecommendedNamed “{store name} {department name}”
menu, servesCuisineRecommendedFood establishments only
aggregateRating, reviewRecommendedOnly for sites that review other businesses

That last row is the one most templates get wrong. Google’s review snippet guidelines make pages that use LocalBusiness or Organization markup ineligible for star reviews when the business controls the reviews about itself, including through an embedded Google or Facebook reviews widget. Marking up your own testimonials won’t produce stars. The details are in our review schema guide.

How do you mark up opening hours?

Use openingHoursSpecification, one object per pattern of days and times, with dayOfWeek, opens and closes. Google accepts full schema.org day URLs or short names like Monday. Its documentation covers five cases, shown below.

Five opening-hours patterns and how Google's documentation says to mark each one Five rows. Standard hours: one openingHoursSpecification per group of days with the same times, for example Monday to Friday opens 09:00 closes 21:00. Past midnight: a single specification, for example Saturday opens 18:00 closes 03:00. Open 24 hours: opens 00:00 and closes 23:59. Closed all day: opens 00:00 and closes 00:00. Seasonal closure: add validFrom and validThrough dates to a specification; leaving them out means the hours apply year-round. Five hours patterns, five ways to write them From Google's LocalBusiness business-hours examples Standard hours One spec per group of days with the same times (Mo-Fr 09:00 to 21:00) Past midnight A single spec that crosses midnight (Sa opens 18:00, closes 03:00) Open 24 hours opens "00:00", closes "23:59" Closed all day opens "00:00", closes "00:00" Seasonal closure Add validFrom and validThrough; without them, hours apply all year

Scroll the diagram sideways to see all of it.

Source: Ambeltek diagram based on the business hours examples in Google's LocalBusiness structured data documentation.

Two cautions. Hours in markup must match the hours on the page and in your Business Profile; conflicting hours are worse than none. And holiday changes need updating in all three places. Google’s general guidelines say it won’t show a rich result for time-sensitive content that is no longer relevant.

geo, hasMap and areaServed

These three location properties are often confused. Only one of them is in Google’s list.

  • geo is recommended by Google: a GeoCoordinates object with latitude and longitude, each with “at least 5 decimal places”. Take coordinates from your Business Profile pin, not a guess.
  • hasMap is a schema.org property meaning “a URL to a map of the place”. It isn’t in Google’s LocalBusiness property list. Adding a maps link is harmless, but don’t expect it to change anything in Google.
  • areaServed is a schema.org property that accepts an AdministrativeArea, GeoShape, Place or text. It is not in Google’s LocalBusiness list either. For Google, a service-area business sets its areas in the Business Profile. The property is still worth using on Service nodes to describe where you work, for any engine that reads it.

The honest summary: geo and a complete address do the work for Google; areaServed describes your reach for everyone else.

Multi-location businesses: one location, one block

Give each location its own page, and put one LocalBusiness block on each page describing only that location. Google’s documentation says to “define each local business location as a LocalBusiness type” and that the url should be “the fully-qualified URL of the specific business location”.

The diagram below shows the structure we use.

Multi-location markup: one brand Organization, one LocalBusiness per location page At the top, the brand's Organization, declared on the homepage with @id https://example.com/#organization, holding logo, sameAs and the corporate contact. Below, three location pages: Springfield, Riverside and Lakeview. Each carries its own Plumber block with a unique @id such as /locations/springfield/#location, its own address, telephone, geo and hours, and a parentOrganization reference pointing up to the brand's @id. A warning at the bottom: never put several locations' addresses in one block on the homepage. One brand, many locations, no mixing Each location page describes one place and points up to the brand Organization (homepage) @id /#organization | logo, sameAs, corporate contact parentOrganization /locations/springfield/ Plumber, @id .../springfield/#location own address, phone, geo, hours /locations/riverside/ Plumber, @id .../riverside/#location own address, phone, geo, hours /locations/lakeview/ Plumber, @id .../lakeview/#location own address, phone, geo, hours Don't put every branch's address in one block on the homepage; each location needs its own page and @id.

Scroll the diagram sideways to see all of it.

Source: Ambeltek diagram based on Google's LocalBusiness documentation and the schema.org parentOrganization property.

parentOrganization is the schema.org property for “the larger organization that this organization is a subOrganization of”. It ties each branch to the brand without repeating the brand’s details. For a store with sections that have their own hours or phone numbers, such as a pharmacy inside a supermarket, Google supports department instead, named in the “{store name} {department name}” format. Location pages need genuinely local content to be worth indexing; stamping out near-identical pages with only the city name changed creates duplicate content, with or without schema.

A complete local business schema example

Here’s a complete block for one location page. Replace every value with your own, and only include what the page shows.

{
  "@context": "https://schema.org",
  "@type": "Plumber",
  "@id": "https://example.com/locations/springfield/#location",
  "name": "Example Plumbing Springfield",
  "url": "https://example.com/locations/springfield/",
  "telephone": "+1-217-555-0142",
  "image": "https://example.com/img/springfield-van.jpg",
  "priceRange": "$$",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "100 Main St",
    "addressLocality": "Springfield",
    "addressRegion": "IL",
    "postalCode": "62701",
    "addressCountry": "US"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 39.80172,
    "longitude": -89.64371
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "08:00:00",
      "closes": "18:00:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Saturday",
      "opens": "09:00:00",
      "closes": "13:00:00"
    }
  ],
  "parentOrganization": { "@id": "https://example.com/#organization" }
}

Test the live page in the Rich Results Test, which supports Local business, and in the Schema Markup Validator to catch vocabulary errors. If the validator shows two LocalBusiness items, a plugin is probably adding its own.

Common local business schema mistakes

Most broken local markup fails in one of six ways, and none of them shows up as an error in a validator. They’re all judgment problems, which is why they survive testing.

  • Self-serving review stars. Marking up your own testimonials or a reviews widget as aggregateRating on your own LocalBusiness won’t produce stars, because Google’s review snippet guidelines exclude businesses that control reviews about themselves.
  • One block for many branches. A homepage LocalBusiness listing three addresses describes a place that doesn’t exist. Split it by location.
  • A generic type. Plain LocalBusiness where Dentist or Plumber fits, or the deprecated ProfessionalService, throws away the one fact that says what you are.
  • Keywords in the name. “Example Plumbing | Best Plumber Springfield” isn’t your business name. Use the name on your signage and your Business Profile.
  • Stale hours. Holiday and seasonal changes made in the Business Profile but not on the site leave the two sources contradicting each other.
  • Invisible facts. Google’s general structured data guidelines say not to mark up content that isn’t visible to readers. If the phone number or hours appear only in the JSON-LD, add them to the page.

A schema markup generator tends to produce the second and third mistakes, because it only knows the form you filled in.

Keeping local business schema in step with your Business Profile

Local business schema is only as good as its agreement with everything else. The name, address, phone and hours in your markup should match your visible page and your Google Business Profile character for character, and they should change together.

A maintenance routine that works:

  1. Treat the Business Profile as the source of truth for hours and address, and update the site and markup the same day it changes. Our Google Business Profile optimization guide covers the profile side.
  2. Generate the markup from one data file per location, so the footer, contact page and JSON-LD can’t disagree.
  3. Check directories for old addresses; conflicting local citations undercut the consistency your markup is trying to show.
  4. Re-test after every site change and after seasonal hour updates.

If you run several locations, or your theme and SEO plugin are both emitting business markup, our schema markup service builds one clean graph: a brand organization, one location entity per page, and services that point to the right branch.

Frequently asked questions

What is local business schema?

Local business schema is LocalBusiness structured data, or one of its subtypes such as Plumber or Dentist, that describes a physical business or branch on your website: its name, address, phone, hours and location. Google can use it for business details in knowledge panels and related features.

Can you give me an example of a local business schema?

A minimal example is a JSON-LD block with @type set to the most specific subtype, such as Plumber, plus name, a PostalAddress, telephone with country code, url, geo coordinates and openingHoursSpecification. Google requires only name and address; the rest is recommended.

Does local business schema help you rank in the map pack?

Not directly. Google says local results are mainly based on relevance, distance and popularity, which it judges mostly from your Business Profile, reviews and links. Schema makes your website's version of the facts explicit and consistent, which supports the profile rather than replacing it.

Should I use ProfessionalService in my schema?

No. Schema.org's definition says the general ProfessionalService type was deprecated because it was confused with Service. Use the most specific LocalBusiness subtype that fits, such as LegalService, AccountingService or Plumber, and describe each offering with Service.

How do I add schema for a business with multiple locations?

Give each location its own page with its own LocalBusiness block, address, phone, hours and a unique @id. Link each location to the brand's Organization with parentOrganization, and put the Organization's own details on the homepage or about page.

Does Google use areaServed in local business schema?

Google's LocalBusiness documentation does not list areaServed among the properties it supports. It is a valid schema.org property and useful for describing service areas to any engine, but for Google, service areas are set in your Business Profile.

OK

Olga Kunger

Founder & Lead Strategist, Ambeltek

Olga leads Ambeltek's web development, AI SEO, and GEO work — helping brands rank on Google and get cited by AI engines. More about Olga →

Want structured data that engines trust?

We audit, design and ship connected JSON-LD for your whole site, validated and monitored.