Local SEO Schema Markup: The Complete Guide for Local Businesses
Last Updated: February 25, 2026 · 14 min read
Schema markup is one of the most underutilised tools in local SEO. While Google My Business controls your Map Pack presence, LocalBusiness schema on your website reinforces every signal — NAP data, opening hours, service area, and reviews — and helps Google confidently match your site to local searches like "best dentist near me" or "plumber in Austin TX".
1. Complete LocalBusiness Schema Template
{
"@context": "https://schema.org",
"@type": "Dentist",
"@id": "https://example.com/#localbusiness",
"name": "Downtown Dental Clinic",
"image": "https://example.com/clinic.jpg",
"url": "https://example.com",
"telephone": "+1-512-555-0100",
"email": "[email protected]",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "456 Main Street, Suite 200",
"addressLocality": "Austin",
"addressRegion": "TX",
"postalCode": "78701",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 30.2672,
"longitude": -97.7431
},
"hasMap": "https://maps.google.com/?cid=YOUR_CID",
"sameAs": [
"https://www.facebook.com/downtowndental",
"https://www.yelp.com/biz/downtown-dental",
"https://g.page/downtown-dental"
],
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday"],
"opens": "08:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Friday",
"opens": "08:00",
"closes": "15:00"
}
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "214",
"bestRating": "5"
},
"areaServed": [
{ "@type": "City", "name": "Austin" },
{ "@type": "City", "name": "Round Rock" },
{ "@type": "City", "name": "Cedar Park" }
],
"knowsLanguage": ["en", "es"]
}2. Choosing the Right LocalBusiness Subtype
Always use the most specific subtype available — Google trusts specificity. Dentist beats HealthAndBeautyBusiness beats LocalBusiness.
| Business Type | Best Schema.org Type |
|---|---|
| Restaurant, café, bar | FoodEstablishment → Restaurant / Bakery / BarOrPub |
| Doctor, dentist, hospital | MedicalOrganization → Dentist / Physician / Hospital |
| Hotel, motel, B&B | LodgingBusiness → Hotel / Motel / BedAndBreakfast |
| Hair salon, spa, gym | HealthAndBeautyBusiness → HairSalon / BeautySalon / SportsActivityLocation |
| Retail shop | Store → ClothingStore / ElectronicsStore / BookStore |
| Lawyer, accountant | ProfessionalService → LegalService / Notary |
| Plumber, electrician | HomeAndConstructionBusiness → Electrician / Plumber |
| School, university | EducationalOrganization → School / CollegeOrUniversity |
| Car dealership | AutoDealer |
| Generic business | LocalBusiness (last resort) |
3. NAP Consistency: The Most Important Local SEO Rule
⚠️ NAP must match exactly across all sources
Your Name, Address, Phone (NAP) in LocalBusiness schema must be character-for-character identical to your Google Business Profile, Yelp listing, and other citations. Even minor differences (Street vs St., Suite vs Ste.) dilute Google's confidence in your business entity.
❌ Inconsistent
Schema: 456 Main Street Suite 200
GMB: 456 Main St., Ste 200
Yelp: 456 Main Street #200
✅ Consistent
Schema: 456 Main Street Suite 200
GMB: 456 Main Street Suite 200
Yelp: 456 Main Street Suite 200
4. Multi-Location Schema Strategy
If you have multiple locations, create a separate LocalBusiness schema block per location page — not one block for the whole chain. Each location page should have its own @id, address, and opening hours.
// /locations/austin/page.tsx
{
"@context": "https://schema.org",
"@type": "Restaurant",
"@id": "https://example.com/locations/austin/#location",
"name": "Corner Bistro – Austin",
"address": { /* Austin address */ },
"parentOrganization": {
"@id": "https://example.com/#organization"
}
}
// /locations/dallas/page.tsx
{
"@context": "https://schema.org",
"@type": "Restaurant",
"@id": "https://example.com/locations/dallas/#location",
"name": "Corner Bistro – Dallas",
"address": { /* Dallas address */ },
"parentOrganization": {
"@id": "https://example.com/#organization"
}
}5. Service Area Businesses (No Physical Storefront)
Plumbers, electricians, dog groomers, and other businesses that serve customers at their location (not at a fixed address) should use areaServed instead of — or in addition to — a physical address:
{
"@context": "https://schema.org",
"@type": "Plumber",
"name": "Austin Fast Plumbing",
"telephone": "+1-512-555-0200",
"url": "https://austinfastplumbing.example.com",
"areaServed": [
{ "@type": "City", "name": "Austin" },
{ "@type": "City", "name": "Round Rock" },
{
"@type": "GeoCircle",
"geoMidpoint": {
"@type": "GeoCoordinates",
"latitude": 30.2672,
"longitude": -97.7431
},
"geoRadius": "30000"
}
]
}6. Frequently Asked Questions
Does LocalBusiness schema replace Google Business Profile?▼
No — they serve different functions. LocalBusiness schema on your website tells Google what your business is and provides structured business data. Google Business Profile (GBP) controls your presence in Google Maps and the local Map Pack. Both are important; neither replaces the other. Use both and ensure NAP data is identical across both sources.
Should I use LocalBusiness or Organization if I have a national online business with no storefront?▼
Use Organization for businesses without a physical customer-facing location. LocalBusiness and its subtypes are specifically for businesses that serve customers at or near a physical location. An online-only business should use Organization schema.
How do I format opening hours for holidays or special closures?▼
For temporary closures (holidays, renovations), add a SpecialOpeningHoursSpecification with the date range and opens/closes set to "00:00". For permanent holiday closures, add additional OpeningHoursSpecification entries. Keeping these current is important — customers trust the hours shown in Google.
Can I put LocalBusiness schema on every page or just the homepage?▼
Add it to your homepage and your contact/location page. Adding it to every page is not necessary and can create confusion if each page has slightly different data. For multi-location sites, each location page should have its own LocalBusiness schema.
Does LocalBusiness schema affect Google Maps ranking?▼
Indirectly. LocalBusiness schema reinforces NAP signals and helps Google associate your website with the correct Google Maps entity. More consistent NAP data across your website, GBP, Yelp, and other directories correlates with better local Map Pack performance.
What does the "priceRange" property expect?▼
priceRange accepts a free-text value that typically uses $ symbols from $ (budget) to $$$$ (luxury). Examples: "$", "$$", "$10-$50". There is no strict schema format — it is a human-readable approximation that Google may display in Knowledge Panels.
For a restaurant, should I use Restaurant or FoodEstablishment?▼
Use Restaurant — it is the most specific and appropriate subtype for a standard sit-down restaurant. FoodEstablishment is a broader parent type. More specific types (Restaurant, Bakery, FastFoodRestaurant, CafeOrCoffeeShop) give Google better category signals for local search.
How do I handle seasonal businesses that close for months at a time?▼
Add a validFrom and validThrough to your OpeningHoursSpecification to indicate the season when the business operates. For off-season closures, update your Google Business Profile hours directly as well. Some businesses add a note in the description property about seasonal operations.
Validate Your LocalBusiness Schema
Check your NAP fields, opening hours format, and rich result eligibility instantly.
Validate Local Business Schema →