Local Business Schema: Plumber, HairSalon and Store
By MarketingToolsProHub Editorial Team | Last updated: | 12 min read
What is local business schema?
Local business schema is structured data, written in schema.org's LocalBusiness vocabulary and added to your website (Google recommends JSON-LD), that describes a business's name, address, phone, hours and location. Use the most specific subtype, such as Plumber, HairSalon or Store; Google requires only name and address and recommends several more.
- schema.org defines LocalBusiness as "a particular physical business or branch of an organization"; it's a subtype of both Organization and Place.
- Plumber sits under HomeAndConstructionBusiness, HairSalon under HealthAndBeautyBusiness, and Store directly under LocalBusiness.
- Google's LocalBusiness documentation requires name and address and recommends url, telephone, geo, openingHoursSpecification, priceRange and department, among others (checked 25 October 2026).
- Service-area businesses can describe where they work with areaServed, which replaced serviceArea on schema.org.
- Google won't show review stars on a business's own pages when it controls the reviews about itself.
How do LocalBusiness subtypes like Plumber, HairSalon and Store fit together?
They're branches of one tree. LocalBusiness has 30 more specific types on schema.org (V30.1, 16 September 2026), and each of those can have its own subtypes. Google says it uses structured data that it finds on the web to understand the content of the page, and its LocalBusiness documentation says to "use the most specific LocalBusiness sub-type possible".
| Business | Type chain on schema.org | schema.org's definition | Sibling or more specific types |
|---|---|---|---|
| Plumber | LocalBusiness > HomeAndConstructionBusiness > Plumber | "A plumbing service." | Siblings: Electrician, GeneralContractor, HVACBusiness, HousePainter, Locksmith, MovingCompany, RoofingContractor |
| Hair salon | LocalBusiness > HealthAndBeautyBusiness > HairSalon | "A hair salon." | Siblings: BeautySalon, DaySpa, HealthClub, NailSalon, TattooParlor |
| Shop | LocalBusiness > Store | "A retail good store." | 30 more specific types, including ClothingStore, Florist, GardenStore, GroceryStore, HardwareStore and PetStore |
Pick the deepest type that's true. A hardware shop is a HardwareStore, not just a Store. If no subtype fits, use the nearest parent, such as HomeAndConstructionBusiness or LocalBusiness itself.
More than one type: Google says "if you have multiple types, specify them as an array (additionalType isn't supported)". Its own example is "@type": ["Electrician", "Plumber", "Locksmith"]. Some guides still use additionalType; for Google, use the array.
Gyms follow the same rules with ExerciseGym or HealthClub; see our gym schema markup guide. When we build websites for local businesses, the name, address, hours and areas on each page are what this markup describes.
Which properties does Google require, recommend or ignore?
Google requires two: name and address. Google's LocalBusiness documentation (last updated 8 September 2026, checked 25 October 2026) uses the headings "Required properties" and "Recommended properties", and says "you must include the required properties for your content to be eligible for display as a rich result". Properties outside those tables are optional: valid on schema.org, but not listed by Google for this feature.
| Property | Google's status | Notes |
|---|---|---|
| name | Required | "The name of the business": the real name, as on your signage |
| address (PostalAddress) | Required | "The physical location of the business"; Google says to include as many properties as possible |
| url | Recommended | "The fully-qualified URL of the specific business location", and it must be a working link |
| telephone | Recommended | The primary customer number, with country and area code |
| geo | Recommended | Latitude and longitude with at least 5 decimal places |
| openingHoursSpecification | Recommended | One item or an array; 24 hours is "00:00" to "23:59", closed all day is "00:00" to "00:00" |
| priceRange | Recommended | Must be shorter than 100 characters, or Google won't show it |
| department | Recommended | A nested LocalBusiness for a unit with its own hours or phone |
| menu, servesCuisine | Recommended for food establishments | Not used by plumbers, salons or shops |
| aggregateRating, review | Recommended only "for sites that capture reviews about other local businesses" | Not for your own business's pages |
| sameAs | Optional for LocalBusiness; recommended in Google's Organization doc | A page that "unambiguously indicates the item's identity", such as your official profile on another site |
| image | Optional (required only for the limited-access Restaurant carousel) | Real photos of the premises or work |
| areaServed | Optional | Not in Google's LocalBusiness tables; see the service-area section below |
Because LocalBusiness is a subtype of Organization, Google also recommends "following the fields for Organization"; its Organization page has no required properties and recommends logo, sameAs, email and description where they apply. The result Google describes is a knowledge panel "with details about a business". Our checklist of what a local business website should include covers the visible content this markup should mirror.
How should a plumber or other service-area business mark up where it works?
With areaServed, and with an address only if your site shows one. schema.org defines areaServed as "the geographic area where a service or offered item is provided", accepting an AdministrativeArea, GeoShape, Place or Text, and marks the older serviceArea property as superseded by areaServed.
- Google's status: areaServed isn't in Google's LocalBusiness tables, so it's optional. Address is required there, and we found no guidance in that documentation for businesses that don't serve customers at their address.
- Don't invent an address: Google's guidelines say "Don't mark up content that is not visible to readers of the page". If your site shows only a town and postal code, mark up only those PostalAddress fields; we found nothing in Google's documentation on which address fields are the minimum. Your markup may then not meet the required property, which is better than publishing a hidden or false one.
- Match your Business Profile: Google Business Profile Help says service areas are set by "city, postal code, or another type of area", not a radius; you can have up to 20; the overall area "shouldn't be more than about 2 hours of driving time" from your base; and "if you don't serve customers at your business address, remove your address from your Business Profile". Use the same towns in areaServed and on your website.
Each town in areaServed should be one your site actually talks about. Our guide to service area pages shows how to write a useful page per town, and our plumbing website guide covers the rest of a trade site.
What do Plumber, HairSalon and Store JSON-LD examples look like?
Here are three complete examples. Google recommends JSON-LD over Microdata and RDFa. All names, addresses, numbers and URLs are placeholders; replace them with what's on your own page.
1. A plumber with an office and a service area
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Plumber",
"@id": "https://www.example.com/#plumber",
"name": "Example Plumbing Co.",
"url": "https://www.example.com/",
"telephone": "+1-555-555-0170",
"address": {
"@type": "PostalAddress",
"streetAddress": "200 Example Avenue",
"addressLocality": "Anytown",
"addressRegion": "PA",
"postalCode": "19000",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 40.12345,
"longitude": -75.12345
},
"areaServed": [
{
"@type": "City",
"name": "Anytown"
},
{
"@type": "City",
"name": "Exampleville"
},
{
"@type": "City",
"name": "Sampleton"
}
],
"priceRange": "$$",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday"
],
"opens": "07:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "08:00",
"closes": "12:00"
}
]
}
</script>
The office address is shown on the site, so it's in the markup; areaServed lists the towns the site has pages for, using schema.org's City type.
2. A hair salon closed on Sundays and Mondays
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HairSalon",
"@id": "https://www.example.com/#salon",
"name": "Example Hair Studio",
"url": "https://www.example.com/",
"telephone": "+1-555-555-0181",
"image": [
"https://www.example.com/images/salon-interior.jpg"
],
"address": {
"@type": "PostalAddress",
"streetAddress": "300 Example Street",
"addressLocality": "Anytown",
"addressRegion": "PA",
"postalCode": "19000",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 40.12346,
"longitude": -75.12346
},
"priceRange": "$$",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Tuesday",
"Wednesday",
"Thursday",
"Friday"
],
"opens": "09:00",
"closes": "19:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "08:00",
"closes": "16:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Sunday",
"Monday"
],
"opens": "00:00",
"closes": "00:00"
}
],
"sameAs": [
"https://www.example.org/profiles/example-hair-studio"
]
}
</script>
Closed days use "00:00" for both opens and closes, as Google's documentation describes. If closes were earlier than opens, schema.org treats the range as running into the next day. Booking-app links and reviews stay on the page, not in sameAs or review markup. For salon booking tools, see our Booksy vs Fresha comparison.
3. A store with a garden center department
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HardwareStore",
"@id": "https://www.example.com/stores/anytown/#store",
"name": "Example Hardware Anytown",
"url": "https://www.example.com/stores/anytown/",
"telephone": "+1-555-555-0190",
"address": {
"@type": "PostalAddress",
"streetAddress": "400 Example Road",
"addressLocality": "Anytown",
"addressRegion": "PA",
"postalCode": "19000",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 40.12347,
"longitude": -75.12347
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
],
"opens": "08:00",
"closes": "20:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Sunday",
"opens": "10:00",
"closes": "16:00"
}
],
"department": [
{
"@type": "GardenStore",
"name": "Example Hardware Anytown Garden Center",
"telephone": "+1-555-555-0191",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
],
"opens": "09:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"opens": "00:00",
"closes": "00:00",
"validFrom": "2027-01-01",
"validThrough": "2027-02-28"
}
]
}
]
}
</script>
HardwareStore is one of Store's more specific types. The garden center is a department, which schema.org describes with the example "a store with a pharmacy, or a bakery with a cafe". Google asks for department names in the format "{store name} {department name}", and for seasonal hours "use both the validFrom and validThrough properties", as in the winter closure above.
Test it in Google's Rich Results Test and the Schema Markup Validator before it goes live.
What do Google's rules say about reviews, hidden content and misleading markup?
Mark up only what visitors can see, and leave your own reviews out. These are the rules that matter for local businesses:
- Self-serving reviews: Google's review snippet documentation (updated 8 September 2026) says: "If the entity that's being reviewed controls the reviews about itself, their pages that use LocalBusiness or any other type of Organization structured data are ineligible for star review feature." That covers reviews placed on your own site "either directly in their structured data or through an embedded third-party widget (for example, Google Business reviews or Facebook reviews widget)". You can still show reviews on the page; our guide to getting more Google reviews covers asking for them within Google's policies.
- Visible content: Google's general structured data guidelines (updated 10 July 2026) say "Don't mark up content that is not visible to readers of the page" and "Don't mark up irrelevant or misleading content, such as fake reviews or content unrelated to the focus of a page."
- Manual actions: Google warns that if a site violates its guidelines, "Google may issue a manual action against it". Google adds that such an action means a page "loses eligibility for appearance as a rich result; it doesn't affect how the page ranks in Google web search".
| Mistake | What Google's documentation says instead |
|---|---|
| Generic LocalBusiness for a plumber or salon | "Use the most specific LocalBusiness sub-type possible" |
| additionalType to add a second type | "Specify them as an array (additionalType isn't supported)" |
| AggregateRating built from your own reviews | Pages of a business that controls its reviews are ineligible for star review feature |
| Hours in the code that differ from the page | "Don't mark up content that is not visible to readers of the page" |
| One block listing every branch on the home page | "Define each local business location as a LocalBusiness type", with the url of that location |
| A long priceRange description | Must be shorter than 100 characters |
How do you test LocalBusiness markup after publishing?
Test the code, publish a few pages, then check what Google sees. Google's own steps: "validate your code using the Rich Results Test and fix any critical errors", deploy a few pages, and use the URL Inspection tool to test how Google sees the page, making sure it isn't blocked by robots.txt, noindex or a login.
- Rich Results Test: Google's tool for the rich results a page may be eligible for. Fix errors; Google says fixing non-critical issues can improve quality but "isn't necessary to be eligible for rich results".
- Schema Markup Validator: checks against the whole schema.org vocabulary, including optional properties such as areaServed that Google's test doesn't report on.
- URL Inspection in Search Console: shows the structured data Google detected on the indexed page; Google notes that not all rich result types are supported by the tool yet.
- Re-check after changes: update the page, the markup and your Business Profile together.
What to expect. Google says it "does not guarantee that your structured data will show up in search results, even if your page is marked up correctly". We found no statement in Google's LocalBusiness documentation that the markup improves local rankings; our map pack ranking guide covers what Google says decides local results.
What does it cost to add local business schema to your website?
Publishing the markup is free, and so are Google's testing tools. The cost is the time to write and test it for each location and keep it current, plus the pages it describes.
If you only need a basic site with your address, hours and areas served on it, a do-it-yourself builder costs less up front. According to Website Builder Expert's 2026 reviews of US plans, Squarespace costs about $19 to $49 a month (Basic to Plus) and Wix about $17 to $39 a month billed annually (Light to Business). Our breakdown of small business website costs sets builders against freelancers and agencies over three years.
With us, a custom website for a local business starts at $5,000 (Custom Business Website), or $7,500 with a booking system built in (Website + Booking System). JSON-LD for your location and service pages can be part of the scope in your fixed written quote, which you get after a free discovery call. You pay an advance deposit and then milestone payments, and own the website, code, domain and content once paid. A build typically takes around 2 months, with 2 rounds of revisions and 2 months of free support; maintenance, including keeping hours and details current, is from $500/month.
These are approximate figures based on published pricing at the time of writing. Your actual cost depends on your scope and will be confirmed after a free discovery call with us.
See it in action: our local business website demo (a demo, not a client project) shows an areas-served section, opening hours, a map and directions, and one-tap call and WhatsApp on a phone: the visible details that local business markup should repeat exactly.
Frequently asked questions
Summary
Local business schema describes your business in schema.org's vocabulary: choose the deepest true type (Plumber, HairSalon, a specific Store type or another), include the two properties Google requires (name and address) and the recommended ones that apply, use areaServed for the towns you cover, and keep every value identical to the visible page and your Business Profile. Leave out review markup for your own reviews, test with the Rich Results Test and the Schema Markup Validator, and expect no guaranteed rich result.
Check how your site's pages are doing with our free local business website grader, and for fitness businesses, read our ExerciseGym and HealthClub markup guide.
Sources checked
Information checked on . Prices, fees and policies change, so confirm details with the source before relying on them. This article is general information, not legal or tax advice.
- schema.org: LocalBusiness type and its more specific types (schema.org V30.1, 16 September 2026; checked 25 October 2026)
- schema.org: Plumber type (V30.1, 16 September 2026; checked 25 October 2026)
- schema.org: HomeAndConstructionBusiness type (V30.1, 16 September 2026; checked 25 October 2026)
- schema.org: HairSalon type (V30.1, 16 September 2026; checked 25 October 2026)
- schema.org: HealthAndBeautyBusiness type (V30.1, 16 September 2026; checked 25 October 2026)
- schema.org: Store type and its more specific types (V30.1, 16 September 2026; checked 25 October 2026)
- schema.org: areaServed property (V30.1, 16 September 2026; checked 25 October 2026)
- schema.org: serviceArea property, superseded by areaServed (V30.1, 16 September 2026; checked 25 October 2026)
- schema.org: OpeningHoursSpecification type (V30.1, 16 September 2026; checked 25 October 2026)
- schema.org: department property (V30.1, 16 September 2026; checked 25 October 2026)
- schema.org: sameAs property (V30.1, 16 September 2026; checked 25 October 2026)
- Google Search Central: Local business (LocalBusiness) structured data (last updated 8 September 2026, checked 25 October 2026)
- Google Search Central: Organization structured data (last updated 8 September 2026, checked 25 October 2026)
- Google Search Central: Review snippet structured data, self-serving reviews guideline (last updated 8 September 2026, checked 25 October 2026)
- Google Search Central: General structured data guidelines (last updated 10 July 2026, checked 25 October 2026)
- Google Search Central: Introduction to structured data markup (last updated 10 December 2025, checked 25 October 2026)
- Google Business Profile Help: manage your service areas for service-area and hybrid businesses (checked 25 October 2026)
- Google: Rich Results Test (tool, checked 25 October 2026)
- schema.org: Schema Markup Validator (tool, checked 25 October 2026)
- Search Console Help: URL Inspection tool (checked 25 October 2026)
- Website Builder Expert: Wix pricing (US prices, third-party, updated 15 September 2026, checked 23 October 2026)
- Website Builder Expert: Squarespace pricing (US prices, third-party, updated 28 August 2026, checked 23 October 2026)