The short answer
Local business schema is code on your website that states your business's name, address, phone, hours and type in a format search engines read. Google requires only name and address. Use JSON-LD, pick the most specific type, mark up only what's visible on the page, and test it with the Rich Results Test.
What local business schema is
Schema markup is a shared vocabulary from schema.org for describing things on a web page. Local business schema uses that vocabulary to describe a business.
A person reading your contact page can tell that 937-555-0142 is your phone number. A search engine has to work it out. Markup says it outright, in a small block of code that visitors never see.
Google calls this local business structured data. It's a way to tell Google about things like your hours and departments. Google accepts a few formats, and recommends JSON-LD where your setup allows it, so that's what this guide uses.
What it does and doesn't do
It helps search engines read your facts correctly. That's a real benefit, and a modest one.
- It doesn't promise anything. Google's guidelines say it doesn't guarantee your structured data will show up in results.
- It doesn't replace your listing. Map results lean on your Google Business Profile. Do that first.
- It can't make up for a thin site. Markup describes what's on the page. It adds nothing a visitor can use.
Google's advice on AI features also applies here. You don't need special markup to appear in them, and your structured data should match the visible text on the page.
So where does it sit? Near the end of a local SEO checklist, because it's a one-time job that takes minutes.
A real example
This is a complete block for a made-up plumber. Change every value to your own, and delete any line you can't back up.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Plumber",
"name": "Northside Plumbing",
"url": "https://www.example.com/",
"image": "https://www.example.com/van.jpg",
"telephone": "+1-937-555-0142",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "410 Mill Street",
"addressLocality": "Dayton",
"addressRegion": "OH",
"postalCode": "45402",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 39.75895,
"longitude": -84.19161
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "08:00",
"closes": "17:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "09:00",
"closes": "13:00"
}
],
"areaServed": ["Dayton", "Kettering"],
"sameAs": ["https://www.facebook.com/example"]
}
</script>
Required and recommended properties
These come from Google's documentation. Only the first two are required, and Google says the more address details you give, the better the result is for users.
| Property | Required or recommended | What to put |
|---|---|---|
name | Required | Your business's name |
address | Required | A PostalAddress, with as many fields as you can give |
telephone | Recommended | Your main number, with country and area codes |
url | Recommended | The working address of this location's page |
openingHoursSpecification | Recommended | Your opening hours, one or more entries |
geo | Recommended | Latitude and longitude, to at least 5 decimal places |
priceRange | Recommended | A rough range like $$, under 100 characters |
menu | Recommended | The address of your menu, for food businesses |
servesCuisine | Recommended | The food you serve, for restaurants |
department | Recommended | A nested business for a department with its own hours |
aggregateRating | Recommended | Only for sites that collect reviews of other businesses |
review | Recommended | Only for sites that review other businesses |
Two properties in the example aren't on Google's list. areaServed and sameAs both exist on schema.org, so they're valid, and other readers of your page may use them. Just don't expect Google's documentation to say they do anything.
Pick the most specific type
Google says to use the most specific sub-type you can. A plumber should say Plumber, not LocalBusiness. Schema.org lists these under each family.
| Family | Types you can use |
|---|---|
| Home and construction | Plumber, Electrician, HVACBusiness, RoofingContractor, GeneralContractor, HousePainter, Locksmith, MovingCompany |
| Health and beauty | HairSalon, NailSalon, BeautySalon, DaySpa, HealthClub, TattooParlor |
| Automotive | AutoRepair, AutoBodyShop, AutoWash, AutoDealer |
| Directly under local business | Dentist, RealEstateAgent, ChildCare, FinancialService, LegalService, FoodEstablishment |
If nothing fits, LocalBusiness is fine. Some families go further, such as Restaurant under FoodEstablishment, so look there before settling. For what else a site in your trade should say, see our pages for roofers, dentists and other trades.
Service-area businesses
If you go to your customers and hide your address on your profile, markup raises a question, because Google still lists address as required.
Give what you show publicly. If your town and state are on your site and your street isn't, give only those:
"address": {
"@type": "PostalAddress",
"addressLocality": "Dayton",
"addressRegion": "OH",
"addressCountry": "US"
}
Don't publish your home address in code to fill a field, since it's readable by anyone who looks. Don't use a mailbox or a fake office either. Use areaServed for the towns you cover, and list the same towns on the page.
Getting the hours right
Hours are the fact people act on, so they're the one to check twice. Google's documentation gives the patterns:
- Open 24 hours. Set
opensto00:00andclosesto23:59. - Closed all day. Set both
opensandclosesto00:00. - Seasonal hours or closures. Add
validFromandvalidThroughwith dates.
If your hours vary and you can't state them exactly, leave them out. Wrong hours in code are worse than none.
Why not to add your own star rating
It's tempting to add aggregateRating with your Google score, so stars might show beside your site. Don't. Google's review snippet rules say a page using LocalBusiness is ineligible for star ratings when the business controls the reviews about itself. That includes reviews placed on your own site, directly or through a widget. The same rules say not to gather ratings from other websites into your markup.
You can still show reviews to people. See how to get more Google reviews for how to do that with permission.
Where to put it
Put the script in your page's code. Google says JSON-LD can go in the head or the body, and that you can add local business data to any page on your site. In practice:
- One location. Put it on your home page, or on your contact page if that's where your address appears. One page is enough.
- Several locations. Give each location its own page, with its own block and its own
url. - In a website builder. Look for a setting like "custom code" or "header code". Many builders add markup for you, so check before you add a second copy.
How to test it
Testing takes two minutes, and catches most mistakes.
- Rich Results Test. Paste your page's address or the code. It reports what Google can read, and any errors to fix.
- Schema Markup Validator. This checks against schema.org more broadly, so it also looks at properties Google doesn't list.
- URL Inspection in Search Console. After publishing, this shows how Google sees the live page. Make sure it isn't blocked by
robots.txt,noindexor a login.
Google says it may take several days after publishing for a page to be found and crawled, so don't expect an immediate change.
Mistakes to avoid
- Marking up what isn't on the page. Google's guidelines say not to mark up content readers can't see, and your markup must be a true picture of the page.
- Facts that disagree. Your name, phone and hours should match your site and your profile, word for word.
- Sample values left in. Search your code for "example" before you publish.
- A phone number with no country code. Use
+1and the area code. - Two blocks for one business. If your builder already adds markup, a second copy can contradict it.
- Stale hours. When your hours change, change the markup too.
Breaking these rules has a cost. Google says a structured data issue can lead to a manual action, which makes a page ineligible for rich results.
Generate yours
Any schema markup generator only knows what you tell it, so check its output against your page. Our free local business schema generator writes this block as you type and leaves out what you leave empty. Nothing you enter leaves your browser.
If your site is on Shingle, you don't need it. Each published site already carries this data from the facts you've confirmed, and leaves out what it can't support.






