LocalBusiness Schema Markup: A Practical Guide
Short answer: LocalBusiness schema is a block of JSON-LD on your site that tells search engines your business name, address, phone, hours and location in a machine-readable way. Google only requires name and address, but recommends telephone, url, geo, openingHoursSpecification and a few others, and asks you to use the most specific subtype, such as Dentist or Plumber. Don't mark up reviews of your own business, and don't expect FAQ markup to produce rich results: since August 2023 Google shows those mainly for authoritative government and health sites.
What structured data does (and doesn't do)
Structured data gives search engines explicit facts instead of making them infer them from your page text. Google's introduction to structured data says it supports JSON-LD, Microdata and RDFa, and recommends JSON-LD where your setup allows, because it's the easiest to implement and maintain at scale.
What it won't do: guarantee a rich result or a higher ranking. Your Google Business Profile still drives the map pack; schema on your site reinforces the same facts and helps search engines and AI answer tools connect your website to that business.
Which types matter for a small business
| Type | Use it for |
|---|---|
A LocalBusiness subtype (Dentist, Electrician, Restaurant, LegalService…) |
Each physical location or service-area business |
Organization |
Brand-level facts: logo, social profiles. Google notes LocalBusiness is a subtype of Organization and recommends following the Organization fields too |
Service |
Describing individual services, with areaServed, serviceType and provider |
FAQPage |
Only if you want it for other search engines or tools; Google rarely shows it now |
Google's LocalBusiness documentation asks you to use the most specific subtype possible, and if you do several things, to list multiple types as an array, for example ["Electrician", "Plumber"], because additionalType isn't supported. Browse the full list of subtypes at schema.org/LocalBusiness.
Annotated JSON-LD walkthrough
Below is a complete example for a hypothetical plumbing business. Comments explain each part; remove them before publishing, since JSON doesn't allow comments.
{
"@context": "https://schema.org",
"@type": "Plumber", // most specific subtype
"@id": "https://example.com/#business", // stable ID other markup can reference
"name": "Example Plumbing Co.", // required: matches your signage and profile
"url": "https://example.com/", // fully qualified, working URL
"telephone": "+1-555-010-0199", // include country and area code
"image": "https://example.com/images/van.jpg",
"logo": "https://example.com/images/logo.png",
"address": { // required: as complete as possible
"@type": "PostalAddress",
"streetAddress": "100 Example Street",
"addressLocality": "Springfield",
"addressRegion": "IL",
"postalCode": "62701",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 39.78172, // at least 5 decimal places
"longitude": -89.65015
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "08:00:00",
"closes": "17:30:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "09:00:00",
"closes": "13:00:00"
}
],
"priceRange": "$$", // under 100 characters
"areaServed": ["Springfield", "Chatham", "Rochester"],
"sameAs": [ // your official profiles elsewhere
"https://www.facebook.com/exampleplumbing",
"https://www.linkedin.com/company/exampleplumbing"
]
}
Notes on the trickier properties
openingHoursSpecification. Google's documentation gives times in hh:mm:ss format and day names such as Monday. For a seasonal closure, it supports validFrom and validThrough dates. Keep these in sync with your Google Business Profile; conflicting hours confuse customers more than search engines.
geo. Google asks for at least five decimal places of precision. Copy the coordinates from a map pin on your actual entrance, not the center of town.
sameAs. Google's Organization documentation uses sameAs for links to your profiles on other sites. List only profiles you control and keep active.
priceRange. Google notes it must be shorter than 100 characters or it won't be shown.
department. For a business with distinct departments, such as a car dealership with a service center, nest each as a department. Google's guidance is to combine the store name with the department name unless the department has its own brand.
Adding services
Each service page can carry a Service block that points back to the business:
{
"@context": "https://schema.org",
"@type": "Service",
"serviceType": "Water heater installation",
"provider": { "@id": "https://example.com/#business" },
"areaServed": "Springfield, IL"
}
Schema.org defines areaServed as the geographic area where a service is provided and provider as the party performing it.
What to leave out
- Your own reviews. Google recommends
aggregateRatingandreviewon LocalBusiness only for sites that capture reviews about other local businesses. A plumber marking up testimonials about itself won't get stars and risks being ignored. - FAQ rich results. In August 2023 Google announced that FAQ rich results would only be shown for well-known, authoritative government and health websites. You can keep FAQPage markup (Google said there's no need to remove it), but don't build a project around it.
- Anything not on the page. Mark up what visitors can actually see. Hours in schema that differ from hours on the page are a red flag.
- Multiple locations in one block. Give each location its own page and its own LocalBusiness markup.
Testing and monitoring
- Rich Results Test (search.google.com/test/rich-results) shows which Google features your markup is eligible for and flags errors.
- Schema Markup Validator (validator.schema.org) checks against the full schema.org vocabulary, including properties Google doesn't use.
- Search Console reports structured data errors across the site after Google crawls it.
- Recheck after any theme update or plugin change; these often duplicate or remove markup.
FAQ
Do I need a plugin to add LocalBusiness schema?
No. A single JSON-LD script in your page template works. Plugins help when non-technical staff edit hours or locations, but check they output the most specific subtype.
Should a service-area business with no storefront include an address?
Google lists address as required for LocalBusiness rich results. If you don't show your address publicly, mark up only what's visible and rely on areaServed and your Business Profile service areas.
Will schema help with AI answers?
It gives machines clear, consistent facts about you, which can only help. No provider publishes a guarantee that it's used.
How often should I update it?
Whenever hours, phone numbers, addresses or services change, and on the same day you update your Business Profile.
When you'd like a second pair of eyes on your markup, we're happy to review it.
Sources
- https://developers.google.com/search/docs/appearance/structured-data/local-business
- https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data
- https://developers.google.com/search/docs/appearance/structured-data/organization
- https://developers.google.com/search/blog/2023/08/howto-faq-changes
- https://schema.org/LocalBusiness
- https://schema.org/Service