- LocalBusiness is the structured-data anchor for any business tied to a place. It powers Google's local pack, Maps, and "near me" rich results, and feeds AI engines for location-qualified queries.
- Use the most specific subtype available.
Dentist,Restaurant,HairSalon, andPlumberbeat the genericLocalBusinessevery time. - Required floor:
name,address,telephone,url. Realistic floor for ranking: addgeo,image,openingHoursSpecification,priceRange, andsameAs. - One LocalBusiness record per physical location. Multi-location chains use one record per branch with shared
parentOrganization. - Match Google Business Profile data exactly. Name, address, phone, hours, and category - mismatches are the single biggest cause of local rich-result loss.
Chapter 1. Before you start
LocalBusiness schema is the technical contract between your website and Google's local search index. It tells the crawler: this brand is the same legal entity as the Google Business Profile at this address, with these hours, in this category. When the schema matches the GBP, Google trusts both sources; when they mismatch, Google trusts neither, and the business drops out of the local pack.
- Confirm the Google Business Profile is verified and accurate. The GBP is the source of truth Google compares your schema against. If GBP is wrong, fix it first.
- Pull the exact name, address, and phone from the GBP. Copy character-for-character: "St" vs "Street", "Inc" vs "Incorporated", and "1234" vs "1,234" all count as mismatches.
- Decide on the canonical location URL. Single-location businesses: the homepage. Multi-location: a dedicated location page per branch (
/locations/{slug}). - Look up the most specific Schema.org subtype that describes the business. Schema.org maintains ~50 LocalBusiness subtypes; use the deepest one in the hierarchy.
- Geocode the address for the
geoproperty. Latitude and longitude precision down to 5-6 decimal places (≈ 1 meter). Google Maps URL or the GBP info reveals these.
LocalBusiness type when a specific subtype (Dentist, Plumber, Restaurant) was available. 27 had name-address-phone mismatches between the schema and the verified Google Business Profile. 19 shipped without geo. 14 had no openingHoursSpecification. All four are 20-minute fixes once you know to look.
Chapter 2. What does LocalBusiness schema actually do for SEO + AI search?
Three things, in descending order of importance.
- Local pack and Maps eligibility. Google cross-references LocalBusiness schema with the verified Google Business Profile to confirm the brand and the location are the same entity. Mismatched or missing schema can drop a business out of the 3-pack.
- "Near me" rich results. For location-qualified queries ("dentist near me", "pizza Lincoln Park"), Google ranks businesses with complete LocalBusiness schema higher in the local results card. Hours, ratings, and photos surface in the SERP directly from the schema.
- AI engine location-aware citations. ChatGPT, Perplexity, and Gemini use LocalBusiness schema to answer "best X in Y" queries. Without it, the engine has to scrape the page and often picks competitors that did ship schema correctly.
What LocalBusiness schema does not do: rank a service-only or e-commerce business higher for non-local queries. If you don't have a physical address or defined service area, you're using the wrong schema - use Organization or OnlineStore instead. We cover that distinction in
how to create Organization schema.
Chapter 3. Picking the right subtype
Schema.org's LocalBusiness hierarchy has ~50 subtypes. Use the deepest applicable type, not LocalBusiness itself. Google has explicitly stated that a specific subtype is a stronger relevance signal than the generic.
| Business type | Use | Don't use |
|---|---|---|
| Dental office | Dentist | MedicalBusiness, LocalBusiness |
| Pizza place | Restaurant (or FastFoodRestaurant) | FoodEstablishment, LocalBusiness |
| Hair salon | HairSalon | HealthAndBeautyBusiness, LocalBusiness |
| Law firm | LegalService (or Attorney) | ProfessionalService, LocalBusiness |
| HVAC contractor | HVACBusiness | HomeAndConstructionBusiness, LocalBusiness |
| Online-only store | OnlineStore (not LocalBusiness) | LocalBusiness - no physical address |
| SaaS / agency / consulting (no walk-in) | Organization or ProfessionalService | LocalBusiness if customers never visit |
The full subtype list lives on Schema.org's LocalBusiness page. When in doubt between two subtypes, pick the one closer to the GBP category - Google's category and schema type should reinforce each other.
Chapter 4. Address, geo, and openingHoursSpecification
The three load-bearing properties for local results. Skip any of them and Google deprioritizes the listing.
{
"@context": "https://schema.org",
"@type": "Dentist",
"@id": "https://www.example.com/#localbusiness",
"name": "Example Family Dental",
"image": "https://www.example.com/photos/storefront-1200x800.jpg",
"telephone": "+1-312-555-0100",
"url": "https://www.example.com/",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "1234 W Madison St, Suite 200",
"addressLocality": "Chicago",
"addressRegion": "IL",
"postalCode": "60607",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 41.881832,
"longitude": -87.658524
},
"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" }
],
"sameAs": [
"https://www.facebook.com/examplefamilydental",
"https://www.instagram.com/examplefamilydental",
"https://maps.google.com/?cid=12345678901234567890"
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": 142
}
}
Address rules: use PostalAddress not a plain string. Spell out the full street address (no "St" abbreviations if the GBP uses "Street"). Match the GBP character-for-character.
Geo rules: latitude and longitude as decimal numbers, 5-6 decimal places. Pull from Google Maps by right-clicking the verified pin on your GBP. Don't approximate.
Hours rules: one OpeningHoursSpecification per distinct schedule. 24-hour opens/closes format. For closures or holiday hours, add a specialOpeningHoursSpecification block with validFrom/validThrough.
Chapter 5. Multi-location and service-area businesses
Two patterns, depending on how the business operates.
Multi-location chain (each branch has an address)
Ship one LocalBusiness record per branch on each branch's own location page (/locations/chicago-loop, /locations/lincoln-park). Reference the parent organization by @id.
{
"@type": "Dentist",
"@id": "https://www.example.com/locations/chicago-loop#localbusiness",
"name": "Example Family Dental - Chicago Loop",
"parentOrganization": { "@id": "https://www.example.com/#organization" },
"address": { ... },
"geo": { ... }
}
Service-area business (no walk-in address)
Plumbers, mobile pet groomers, and similar service-area businesses don't have a public storefront. Use areaServed with a GeoCircle or City/State reference. Optionally hide the address from public display with the GBP service-area setting and the schema's hasMap on the office location.
{
"@type": "Plumber",
"@id": "https://www.example.com/#localbusiness",
"name": "Example Plumbing Services",
"areaServed": [
{ "@type": "City", "name": "Chicago" },
{ "@type": "City", "name": "Evanston" },
{ "@type": "City", "name": "Oak Park" }
],
"address": { "@type": "PostalAddress", "addressLocality": "Chicago", "addressRegion": "IL" }
}
Chapter 6. Where do you place LocalBusiness schema on the site?
One canonical placement per location. Don't duplicate the LocalBusiness graph across every page.
| Site structure | Schema placement |
|---|---|
| Single-location site | Homepage <head>, with @id matching the homepage URL |
| Multi-location chain | One LocalBusiness on each branch's /locations/{slug} page; parent Organization on the homepage |
| Service-area business | Homepage or main service page, with areaServed covering the service polygons |
| Mixed (HQ + retail stores) | Organization on the main site, LocalBusiness on each store-locator detail page |
Tie the LocalBusiness to your Organization record with parentOrganization (chain) or publishingPrinciples (publisher). This builds the entity graph Google and AI engines walk to confirm authority.
Chapter 7. The breakages we see most often
Ranked by frequency across 63 local-business audits over the past 24 months:
- Generic
LocalBusinesstype when a specific subtype exists (Dentist,Plumber,Restaurant). 38 of 63. - Name, address, or phone doesn't match the verified Google Business Profile character-for-character. 27 of 63.
- No
geocoordinates, so Google can't validate the schema location against the GBP pin. 19 of 63. - No
openingHoursSpecification, so hours don't surface in the local card. 14 of 63. - Wrong subtype (
HomeAndConstructionBusinesson a plumber whenPlumberis more specific). 11 of 63. - aggregateRating in schema but no
Reviewrecords or aggregator link. Google warns when a rating is in the JSON-LD with no source. 9 of 63. - Address as a plain string instead of a
PostalAddressobject. 7 of 63.
We track every breakage above on running sites through our Sentry structured-data rule set.
FAQ
What's the difference between LocalBusiness and Organization schema?
LocalBusiness is for any business with a physical address or defined service area. Organization is the umbrella type for any entity - chains, publishers, brands, non-profits. If customers visit you in person or you serve a defined geographic area, ship LocalBusiness. Otherwise ship Organization. Many sites need both: one Organization on the homepage and one LocalBusiness per branch.
Do I need LocalBusiness schema if I have a Google Business Profile?
Yes. The GBP and LocalBusiness schema reinforce each other. Google cross-references both to confirm the brand and the location are the same entity. Without the schema, Google has to rely on GBP alone, which is a weaker signal than GBP + matching site schema.
Should I ship LocalBusiness schema for an online-only store?
No. If customers never visit a physical address and you don't have a defined service area, use OnlineStore or Organization instead. LocalBusiness implies a place, and Google's local index expects that place to exist and match a GBP.
How do I handle aggregateRating without faking reviews?
Only include aggregateRating if you have actual Review records on the page or you're aggregating from a verified source like Yelp or Trustpilot. Per Google's guidelines, fake or unsourced ratings are policy violations and can trigger a manual action against the entire site.
Does LocalBusiness schema need to be on every page?
No. Ship it once on the canonical location URL - the homepage for single-location businesses, or each branch's /locations/{slug} page for chains. Reference by @id from other pages instead of duplicating.
How often should I update opening hours in the schema?
Whenever the real hours change. Holiday hours go in specialOpeningHoursSpecification with validFrom/validThrough so Google can show "Closed for the holiday" automatically. Letting hours drift out of date is one of the biggest local-pack penalties because the GBP-schema mismatch flags a stale listing.
References
- Schema.org. "LocalBusiness." schema.org/LocalBusiness
- Google Search Central. "Local business (LocalBusiness) structured data." developers.google.com/search/docs/appearance/structured-data/local-business
- Schema.org. "PostalAddress." schema.org/PostalAddress
- Schema.org. "OpeningHoursSpecification." schema.org/OpeningHoursSpecification
- Google. "Google Business Profile help: Manage your business information." support.google.com/business/answer/3038177
- Schema.org. "Schema Markup Validator." validator.schema.org