Schema Markup for Local Businesses: What to Add and How
Short answer: Schema markup is a block of structured data, usually written in JSON-LD, that tells search engines exactly what the facts on your page mean: this is the business name, this is the phone number, these are the services and the areas served. For a local business the types that matter are LocalBusiness (or a subtype like Plumber), Service, BreadcrumbList and FAQPage, and every value must match what visitors can see.
Done well, schema removes guesswork. Google, Bing and AI answer tools do not have to infer your opening hours from a footer or your service area from a paragraph. Done badly, with fake ratings or facts that do not match the page, it can earn you a manual penalty. Here is how to do it well.
What is schema markup?
Schema.org is a shared vocabulary that the major search engines agreed on. It defines types (LocalBusiness, Service, Organization, FAQPage) and the properties each type can have (name, telephone, address, areaServed).
Structured data is that vocabulary applied to your page. There are three formats, but only one is worth using:
- JSON-LD: a script block in the page head or body. Separate from your visible layout, easy to edit, recommended by Google.
- Microdata and RDFa: attributes woven into the HTML. Fragile and hard to maintain.
Schema does not change how your page looks. It is an extra, machine-readable layer on top of it, and part of the technical SEO foundation every site needs.
Why does structured data matter for a local business?
Three practical reasons:
- Entity clarity. Search engines build a picture of your business from your site, your Google Business Profile and directory listings. Schema states your name, address and phone (NAP) in a format that is easy to match across those sources.
- Rich results. Some types make pages eligible for enhanced displays, such as breadcrumb trails in place of a raw URL. Eligibility is never a guarantee.
- AI answers. Tools such as Google's AI Overviews, ChatGPT and Perplexity pull facts from pages. Clean, consistent structured data is one more signal that your facts are reliable. Our guide to Google AI Overviews covers the content side.
Which schema types should a local business use?
| Type | Put it on | What it describes |
|---|---|---|
| LocalBusiness subtype | Home page, contact page, location pages | Name, address, phone, hours, areas served, logo |
| Service | Each service page | One service, who provides it, where |
| BreadcrumbList | Every page below the home page | The page's position in your site structure |
| FAQPage | Pages with a visible Q&A section | Questions and answers shown on the page |
| Organization | Home page (if no LocalBusiness) | Brand name, logo, social profiles |
Pick the most specific LocalBusiness subtype
Schema.org has subtypes for many trades: Plumber, Electrician, HVACBusiness, RoofingContractor, GeneralContractor, MovingCompany, AutoRepair, Dentist, LegalService and more. Use the closest match. A specific type tells search engines more than a generic one.
Service-area businesses
If you work at customers' homes and do not want your address shown, you can leave the street address out of the markup, just as you would hide it on your Google Business Profile. Use areaServed to list the cities or regions you cover, and keep that list the same as the one on your page and your profile.
A LocalBusiness JSON-LD example
This is a working pattern for a plumbing company's home page. Swap in your own details and remove any line you cannot back up with visible content.
{
"@context": "https://schema.org",
"@type": "Plumber",
"name": "Example Plumbing Co.",
"url": "https://www.exampleplumbing.com/",
"telephone": "+1-555-010-0199",
"logo": "https://www.exampleplumbing.com/logo.png",
"address": {
"@type": "PostalAddress",
"streetAddress": "100 Main Street",
"addressLocality": "Austin",
"addressRegion": "TX",
"postalCode": "78701",
"addressCountry": "US"
},
"areaServed": [
{ "@type": "City", "name": "Austin" },
{ "@type": "City", "name": "Round Rock" }
],
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "07:00",
"closes": "18:00"
}],
"sameAs": ["https://www.facebook.com/exampleplumbing"]
}
Notes on the example:
- The phone number should be the same number shown on the page and on your Google Business Profile.
- sameAs links your site to your official profiles elsewhere. Only list profiles you control.
- If you are open 24 hours for emergencies, say so on the page first, then reflect it in the markup.
What are the rules for review and rating schema?
This is where most local businesses get into trouble.
- Self-serving reviews do not get stars. Google does not show review-star rich results for reviews a business publishes about itself on its own site, whether you mark them up on LocalBusiness or Organization. You can still show testimonials on the page; just do not expect stars.
- Never invent a rating. An aggregateRating must reflect real reviews that visitors can see. Copying a number from another site without showing those reviews breaks Google's guidelines.
- Do not mark up hidden content. If it is not visible on the page, it does not belong in the markup.
The same honesty rule applies everywhere. If your markup claims a service, an area or an opening time, the page must say it too.
FAQPage, Service and BreadcrumbList in practice
FAQPage
Google now shows FAQ rich results for very few sites, mostly well-known government and health sources. The markup is still a clear way to label questions and answers, which is useful for any system reading your page. Only use it when the questions and answers appear on the page in full.
Service
On a service page, a Service block names the service (for example "water heater repair"), the provider (your business) and areaServed. Keep one main service per page so the markup and the page say the same thing.
BreadcrumbList
Breadcrumbs describe the path to the page, for example Home, Services, Drain Cleaning. Show the same breadcrumb trail visibly on the page. It helps visitors and gives search engines a clean picture of your site structure.
How do you add and test schema?
- Decide per template, not per page. Service pages, city pages and the home page each get a standard set of types.
- Add it through your platform. WordPress SEO plugins, most site builders and custom builds can all output JSON-LD. On custom sites, generate it from the same data that fills the page so the two cannot drift apart.
- Test one page of each template with Google's Rich Results Test and the Schema.org validator. Fix errors first, then warnings worth fixing.
- Monitor in Search Console. Enhancement reports show errors across every page using a template.
- Re-test after changes to your phone number, hours, address or site theme.
Common schema mistakes we see
- A different phone number in the markup than on the page, often an old tracking number.
- One LocalBusiness block copied onto every city page, claiming an address in each city.
- Ratings pulled from a review platform with no reviews shown on the page.
- Plugins outputting two conflicting LocalBusiness blocks.
- Services in the markup that the business stopped offering.
- Opening hours in the markup that were never updated after a holiday schedule or a change in hours.
- A logo URL or sameAs profile that no longer exists, which quietly weakens the link between your site and your other listings.
A quick way to catch most of these: once a quarter, open your home page and one service page, run both through the Rich Results Test, and read the detected values line by line against what the page says.
Fix those and your structured data becomes what it should be: a clean, honest summary of facts that are already on the page. That is the same principle behind our wider SEO work.
Key facts
Schema markup is structured data that labels the facts on your page so search engines and AI tools can read them reliably. A local service business needs LocalBusiness (or a specific subtype), Service, BreadcrumbList and, where the page has real Q&A, FAQPage. Keep every value identical to what visitors see, never mark up reviews you collected yourself for star ratings, and test each template after changes.
Questions
Does schema markup improve rankings?
Schema is not a direct ranking boost. It helps search engines understand your business and pages, can make you eligible for richer results such as breadcrumbs, and gives AI tools clean facts to quote.
What is the best schema type for a local business?
Use the most specific LocalBusiness subtype that fits, such as Plumber, Electrician, HVACBusiness, RoofingContractor, Dentist or LegalService. If none fits, use LocalBusiness itself.
Can I add review stars to my own website with schema?
You can mark up reviews, but Google does not show star ratings for reviews a business collects and publishes about itself on its own site. Never invent ratings or mark up reviews that are not shown on the page.
Should I use JSON-LD or microdata?
Use JSON-LD. It is a single script block separate from your page layout, it is the format Google recommends, and it is far easier to maintain across templates.
How do I test schema markup?
Run the page through Google's Rich Results Test and the Schema.org validator. Then watch the enhancement reports in Google Search Console for errors across the whole site.
Terms in this guide: Structured data · Schema markup · Google Business Profile