Local business schema markup tells search engines and AI exactly what you do, where, and who you serve. A practical 2026 guide with copy-paste JSON-LD.
Local business schema markup is structured data (written in JSON-LD) that tells search engines and AI exactly what your business is, where it operates, how to contact you, and what you offer. For a plumber, dentist, electrician, or any service business, it turns prose on a page into machine-readable facts, which is what helps you earn rich results in Google and accurate citations in AI answers.
Without it, search engines and AI engines have to guess from your copy. With it, they pull confirmed facts straight from your markup. This guide is the practical version: the properties that matter, a copy-paste example, the sub-types, and how to validate it.
For the broader picture, see our SEO services and the glossary.
What LocalBusiness schema is
LocalBusiness is a Schema.org type for any business that serves customers at a physical location or within a defined geographic area. It sits under the broader Organization type and adds local-specific properties: an address, opening hours, geo-coordinates, and an area served.
The rule of thumb: if you have a storefront, an office, or a service area, use LocalBusiness. If you are a fully remote brand with no geographic anchor, plain Organization is enough.
You deliver it as a JSON-LD block in the <head> or body of your page. Google recommends placing it on your homepage at minimum, and on your contact or location pages where it is most relevant.
The key properties that matter
You do not need every property Schema.org allows. These are the ones search engines and AI actually use to understand and rank a local business:
name- your business name, exactly as it appears on your site and Google Business Profile.address- a structuredPostalAddresswith street, suburb, state, postcode, and country. Keep it consistent with your other listings (NAP consistency matters).geo- latitude and longitude as aGeoCoordinatesobject. This anchors you on the map and helps with "near me" relevance.openingHoursSpecification- your trading hours, structured by day. This is what powers the "Open now" and hours panel.telephone- your contact number in international format (e.g.+61 3 9000 0000).areaServed- the suburbs, cities, or regions you cover. Essential for service businesses that travel to clients rather than receiving them at a location.aggregateRating- your average star rating and review count. Only include this if the reviews are real and verifiable (see the warning below).
Get these right and you have covered roughly 90% of what matters. Consistency with your Google Business Profile is more important than padding the markup with extra fields.
A copy-paste JSON-LD example
Here is a complete, valid LocalBusiness block for an Australian service business. Replace the placeholder values with your own, then validate before you ship.
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"@id": "https://example.com.au/#business",
"name": "Northside Plumbing",
"url": "https://example.com.au",
"image": "https://example.com.au/storefront.jpg",
"logo": "https://example.com.au/logo.png",
"description": "Licensed plumbers servicing Melbourne's northern suburbs for blocked drains, hot water, and emergency repairs.",
"telephone": "+61390000000",
"email": "hello@example.com.au",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 Sydney Road",
"addressLocality": "Brunswick",
"addressRegion": "VIC",
"postalCode": "3056",
"addressCountry": "AU"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": -37.7670,
"longitude": 144.9600
},
"areaServed": [
{ "@type": "City", "name": "Brunswick" },
{ "@type": "City", "name": "Coburg" },
{ "@type": "City", "name": "Preston" }
],
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "07:00",
"closes": "17:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "08:00",
"closes": "12:00"
}
],
"sameAs": [
"https://www.facebook.com/northsideplumbing",
"https://www.instagram.com/northsideplumbing"
]
}
A few notes on this block:
- The
@idgives the business a stable URI you can reference from other schemas (such as aServiceorReviewblock) so they all point to the same entity. addressCountryuses the two-letter ISO code (AU), which is the safest format.areaServedis an array ofCityobjects here, which suits a mobile service business. A fixed-location business can lean more onaddressandgeo.- I have deliberately left out
aggregateRating. Add it only when you have real reviews to back it (covered next).
Sub-types: be as specific as you can
Schema.org provides hundreds of more specific sub-types under LocalBusiness. Using the most specific one that fits your business gives search engines a clearer signal than the generic parent type.
Common examples for service businesses:
Plumber- for plumbing trades.Electrician- for electrical contractors.Dentist- for dental practices (sits underMedicalBusiness).HVACBusiness- for heating and cooling.Locksmith,RoofingContractor,HousePainter- and many more across the trades.
You simply swap the @type:
{
"@context": "https://schema.org",
"@type": "Plumber",
"name": "Northside Plumbing"
}
If no specific sub-type matches your niche, stay on LocalBusiness. Do not invent a type that is not in the vocabulary, as validators will reject it.
Service and FAQ schema, briefly
Two companion types pair well with LocalBusiness.
Service declares each thing you do. It is worth adding on individual service pages so search engines and AI understand the specific offering, who provides it, and where:
{
"@context": "https://schema.org",
"@type": "Service",
"name": "Emergency Drain Clearing",
"provider": { "@id": "https://example.com.au/#business" },
"areaServed": { "@type": "City", "name": "Brunswick" },
"serviceType": "Blocked drain repair"
}
Note the provider references the same @id from your LocalBusiness block, so the two entities are linked.
FAQPage marks up genuine questions and answers on a page. A word of caution: Google restricted FAQ rich results to authoritative government and health sites in 2023, so most service businesses no longer earn the rich result. It still helps AI engines parse FAQ content, so use it on a couple of your strongest pages where the answers are real and substantive, not on every page out of habit.
For the full priority order across schema types, our AEO schema markup guide goes deeper.
How to add and validate it
There are three ways to add schema, ranked by how reliably crawlers and AI engines will see it:
- Server-rendered JSON-LD (best) - output the
<script type="application/ld+json">block in your page's HTML so it is present on first load. Every crawler and AI engine sees it. - A reusable component - wrap the same pattern in a component (for example in a Next.js or WordPress template) so it renders consistently across pages.
- Tag manager (avoid for AI) - Google Tag Manager can inject schema, but AI crawlers that read static HTML rather than executing JavaScript will often miss it.
Once it is live, validate it with two free tools:
- Google Rich Results Test - checks Google-specific eligibility and previews how your markup may appear.
- Schema Markup Validator - strict syntactic validation against the Schema.org vocabulary.
Run both on every page template at least once a quarter, and again whenever the underlying business details change.
Common mistakes to avoid
A handful of errors account for most broken local schema:
- Inconsistent NAP. Your name, address, and phone in the schema must match your Google Business Profile and citations exactly. Mismatches dilute trust.
- Fabricated
aggregateRating. Never invent star ratings or review counts. Google issues manual penalties for fake review markup, and recovery can take months. If your real review count is in single digits, omitaggregateRatinguntil you have a meaningful sample. - Wrong or missing
@type. Using a sub-type that does not exist in Schema.org, or defaulting to the genericThing, wastes the signal. - Schema that contradicts the page. Opening hours or an address in your markup that differs from the visible content on the page is a quality problem.
- Duplicate blocks. Emitting two
LocalBusinessblocks per page (one inline, one from a plugin) creates ambiguous markup that validators flag. - Markup with no on-page support. Schema should describe content that genuinely appears on the page, not facts that exist only in the JSON-LD.
Schema works best alongside the rest of your local foundation. For everything that drives map and organic visibility, see our guide to local SEO ranking factors for service businesses.
Frequently Asked Questions
Does local business schema markup improve my rankings directly?
Not directly. Schema is a clarification signal, not a ranking factor. It helps search engines understand your business and earn rich results, and it helps AI engines cite you accurately, all of which produce indirect visibility gains.
Do I need schema on every page?
No. Put your core LocalBusiness block on your homepage and contact or location pages, and add Service schema on individual service pages. Marking up every page with the full business block is unnecessary and can create duplicate-entity issues.
Can I add an aggregateRating if I only have a few reviews?
You can, but you should not until the sample is meaningful and the reviews are real and verifiable. Fabricated or thin ratings risk a Google penalty. If you have fewer than about ten genuine reviews, leave aggregateRating out for now.
What is the difference between LocalBusiness and Organization schema?
Organization describes any business or brand. LocalBusiness is a sub-type for businesses tied to a physical location or service area, and it adds local properties such as address, geo, openingHoursSpecification, and areaServed. Use LocalBusiness if you serve customers in a specific place.
The bottom line
Local business schema markup is one of the highest-leverage, lowest-cost technical SEO jobs you can do. Pick the most specific type that fits your business, fill in the properties that matter (name, address, geo, hours, phone, area served), keep it consistent with your Google Business Profile, and validate before you ship. Add Service and a focused FAQPage block where they genuinely apply, and never fake a rating.
If you would like us to check your current structured data and tell you exactly what to fix, grab a free website audit. We will review your schema, your local signals, and the on-page work that turns markup into rankings and citations.


