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
- Which LocalBusiness subtype should you use?
- The properties Google actually uses
- How do you mark up opening hours?
- geo, hasMap and areaServed
- Multi-location businesses: one location, one block
- A complete local business schema example
- Keeping local business schema in step with your Business Profile
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.
Scroll the diagram sideways to see all of it.
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
additionalTypeisn’t supported. - Don’t pick a type for the keyword. A
LegalServicethat 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.
| Property | Status | Google’s rule worth knowing |
|---|---|---|
name | Required | The business name |
address | Required | A PostalAddress, “as many properties as possible” |
telephone | Recommended | Include country code and area code |
url | Recommended | The specific location’s URL, and it must work |
geo | Recommended | Latitude and longitude with at least 5 decimal places |
openingHoursSpecification | Recommended | opens and closes in hh:mm:ss |
priceRange | Recommended | Under 100 characters, e.g. “$10-15” or ”$$$” |
department | Recommended | Named “{store name} {department name}” |
menu, servesCuisine | Recommended | Food establishments only |
aggregateRating, review | Recommended | Only 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.
Scroll the diagram sideways to see all of it.
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.
geois recommended by Google: aGeoCoordinatesobject withlatitudeandlongitude, each with “at least 5 decimal places”. Take coordinates from your Business Profile pin, not a guess.hasMapis 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.areaServedis a schema.org property that accepts anAdministrativeArea,GeoShape,Placeor 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 onServicenodes 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.
Scroll the diagram sideways to see all of it.
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
aggregateRatingon your ownLocalBusinesswon’t produce stars, because Google’s review snippet guidelines exclude businesses that control reviews about themselves. - One block for many branches. A homepage
LocalBusinesslisting three addresses describes a place that doesn’t exist. Split it by location. - A generic type. Plain
LocalBusinesswhereDentistorPlumberfits, or the deprecatedProfessionalService, 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:
- 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.
- Generate the markup from one data file per location, so the footer, contact page and JSON-LD can’t disagree.
- Check directories for old addresses; conflicting local citations undercut the consistency your markup is trying to show.
- 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.