Free website & SEO check: see your score in under a minute  ·  Check my website →
Want a website whose code says the same as your page and your profile? Get a fixed written quote within 1 business day Get a free quote
Local Business Websites Structured data Technical SEO

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.

In brief

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".

Type chains copied from schema.org (V30.1, 16 September 2026, checked 25 October 2026). Every type inherits the properties of LocalBusiness, Organization, Place and Thing.
BusinessType chain on schema.orgschema.org's definitionSibling or more specific types
PlumberLocalBusiness > HomeAndConstructionBusiness > Plumber"A plumbing service."Siblings: Electrician, GeneralContractor, HVACBusiness, HousePainter, Locksmith, MovingCompany, RoofingContractor
Hair salonLocalBusiness > HealthAndBeautyBusiness > HairSalon"A hair salon."Siblings: BeautySalon, DaySpa, HealthClub, NailSalon, TattooParlor
ShopLocalBusiness > 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 status from Google Search Central: LocalBusiness structured data and Organization structured data (both updated 8 September 2026, checked 25 October 2026).
PropertyGoogle's statusNotes
nameRequired"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
urlRecommended"The fully-qualified URL of the specific business location", and it must be a working link
telephoneRecommendedThe primary customer number, with country and area code
geoRecommendedLatitude and longitude with at least 5 decimal places
openingHoursSpecificationRecommendedOne item or an array; 24 hours is "00:00" to "23:59", closed all day is "00:00" to "00:00"
priceRangeRecommendedMust be shorter than 100 characters, or Google won't show it
departmentRecommendedA nested LocalBusiness for a unit with its own hours or phone
menu, servesCuisineRecommended for food establishmentsNot used by plumbers, salons or shops
aggregateRating, reviewRecommended only "for sites that capture reviews about other local businesses"Not for your own business's pages
sameAsOptional for LocalBusiness; recommended in Google's Organization docA page that "unambiguously indicates the item's identity", such as your official profile on another site
imageOptional (required only for the limited-access Restaurant carousel)Real photos of the premises or work
areaServedOptionalNot 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".
Common mistakes checked against Google's LocalBusiness documentation and general structured data guidelines (checked 25 October 2026).
MistakeWhat 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 reviewsPages 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 descriptionMust 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.

  1. 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".
  2. Schema Markup Validator: checks against the whole schema.org vocabulary, including optional properties such as areaServed that Google's test doesn't report on.
  3. 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.
  4. 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

We found no statement in Google's LocalBusiness documentation that it does. It describes your business to Google; ranking factors are covered in Google's Business Profile help.

Both are on schema.org. openingHours is a short text format such as "Mo-Fr 09:00-17:00"; openingHoursSpecification is structured. Google's LocalBusiness tables list openingHoursSpecification.

Google lists geo as recommended, not required. If you add it, Google says latitude and longitude need at least 5 decimal places.

One item per branch, on that branch's page, with its own url. Google says to "define each local business location as a LocalBusiness type".

Google says a plugin integrated into your CMS may be easier. Check its output in the Rich Results Test and make sure it picks the right subtype rather than plain LocalBusiness.

schema.org defines LocalBusiness as a physical business or branch. Without a physical location customers visit or a service area, Google's Organization documentation is the closer fit.

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.