Most local business websites either skip schema markup entirely or copy a minimal snippet that's missing half the fields Google wants. The LocalBusiness type isn't complex — there are maybe six fields you need to get right. But those fields have specific formats (especially address and openingHoursSpecification) that trip up most implementations.
This guide covers the complete LocalBusiness JSON-LD template, what each field does, how to choose a more specific @type, and how to validate before publishing.
Key Takeaways
LocalBusinessschema on your site reinforces your Google Business Profile data — consistency across sources strengthens local ranking signals@typecan be more specific thanLocalBusiness—Restaurant,MedicalBusiness,LegalService, etc. inherit LocalBusiness properties and add type-specific onesaddressmust usePostalAddresswithstreetAddress,addressLocality,postalCode,addressCountry— not a plain stringopeningHoursSpecificationis preferred over the legacyopeningHoursstring for structured hours data- Validate with the Schema Markup Tester before publishing — a missing required field won't crash the site but will silently block rich result eligibility
What LocalBusiness Schema Does
LocalBusiness is a schema.org type that describes a physical business with a location. When correctly implemented, it helps Google confirm your business name, address, and phone (NAP) match your Google Business Profile, understand your opening hours and price range, and associate your website with your location for local search intent queries.
It does not replace Google Business Profile — you need both. GBP carries more weight for local pack rankings. But schema markup is the one local signal you control without waiting for Google to update, and NAP consistency between your schema and your GBP is a genuine ranking signal.
The Complete LocalBusiness Schema Template
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Sunny's Bakery",
"description": "Artisan sourdough bakery specialising in slow-ferment loaves and pastries.",
"url": "https://www.sunnysbakery.example.com",
"telephone": "+44-131-555-0123",
"email": "[email protected]",
"image": "https://www.sunnysbakery.example.com/images/storefront.jpg",
"priceRange": "££",
"address": {
"@type": "PostalAddress",
"streetAddress": "42 Bread Street",
"addressLocality": "Edinburgh",
"addressRegion": "Scotland",
"postalCode": "EH3 9AF",
"addressCountry": "GB"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 55.9486,
"longitude": -3.2008
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "07:00",
"closes": "17:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Saturday"],
"opens": "08:00",
"closes": "14:00"
}
],
"sameAs": [
"https://www.google.com/maps/place/...",
"https://www.facebook.com/sunnysbakery"
]
}
Required vs Recommended Fields
| Field | Required? | Notes |
|---|---|---|
@type |
Required | LocalBusiness or a subtype |
name |
Required | Exact business name |
address |
Required | Must be a PostalAddress object, not a plain string |
telephone |
Recommended | Include country code |
url |
Recommended | Your website URL |
image |
Recommended | At least one image URL |
openingHoursSpecification |
Recommended | Preferred over legacy openingHours string |
geo |
Recommended | Lat/long strengthens location association |
priceRange |
Optional | £ / $$ / ££ — free-form but follow convention |
sameAs |
Recommended | Links to GBP, social profiles for entity disambiguation |
Choosing a More Specific @type
LocalBusiness is the base type. Google recognises hundreds of subtypes that inherit all LocalBusiness properties and may unlock type-specific rich results. Use the most specific type that accurately describes the business:
Restaurant— addsservesCuisine,menu,acceptsReservationsMedicalBusiness→Physician,Dentist,Optician— addsmedicalSpecialtyLegalService→Attorney,Notary— addslegalNameAutomotiveBusiness→AutoDealer,AutoRepairFoodEstablishment→Bakery,CafeOrCoffeeShop,FastFoodRestaurantHealthAndBeautyBusiness→BeautySalon,HairSalon
More specific types give Google more confidence in what your business does, which can improve local search accuracy and eligibility for type-specific rich results.
Address Format Details
The address field must be a PostalAddress object — not a plain string. This is the most common LocalBusiness schema mistake:
// WRONG — plain string
"address": "42 Bread Street, Edinburgh EH3 9AF"
// CORRECT — PostalAddress object
"address": {
"@type": "PostalAddress",
"streetAddress": "42 Bread Street",
"addressLocality": "Edinburgh",
"postalCode": "EH3 9AF",
"addressCountry": "GB"
}
addressCountry must be the ISO 3166-1 alpha-2 country code (GB, US, DE, AU) — not the full country name. Full country names are not recognised by the validator.
NAP consistency matters: the name, address, and phone in your schema must exactly match your Google Business Profile listing. Even minor differences (St vs Street, +1 vs 1-) dilute the signal.
Opening Hours Format
openingHoursSpecification takes an array of objects, one per time block. Group consecutive days with the same hours:
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "09:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Saturday", "Sunday"],
"opens": "10:00",
"closes": "16:00"
}
]
For 24-hour operation: "opens": "00:00", "closes": "23:59". For closed days: omit that day from all specifications. For special hours (holidays): add validFrom and validThrough date strings to the specification object.
The legacy openingHours string format ("Mo-Fr 09:00-18:00") still works but is less structured. Google's documentation recommends openingHoursSpecification for new implementations.
The sameAs Array — Entity Disambiguation
The sameAs property links your schema entity to verified external profiles. This is particularly valuable for entity disambiguation — it tells Google that your LocalBusiness entity on your website is the same entity as your Google Business Profile, Facebook page, and LinkedIn company page.
"sameAs": [
"https://www.google.com/maps/place/your-business-id",
"https://www.facebook.com/yourbusiness",
"https://www.yelp.com/biz/yourbusiness"
]
Each URL must resolve. A sameAs pointing to a 404 is worse than omitting it.
Validating Before Publishing
address not being a PostalAddress object, and warns on recommended fields like missing telephone or image.
Three validation tools:
- Google Rich Results Test — checks whether Google can parse the schema; shows which rich result types the page is eligible for.
- schema.org Validator — strict spec conformance; catches type mismatches and incorrect property values.
- ByteWaveNetwork Schema Markup Tester — validates LocalBusiness required and recommended fields, reports missing
PostalAddress, incorrectaddressCountryformat, and missingopeningHoursSpecification. Run it after adding schema to confirm before publishing.
After validation, cross-reference your schema against your Google Business Profile: the business name, address, phone, and website URL should be identical in both places. Discrepancies between your GBP and your on-page schema send mixed signals to Google's local algorithm.
Validate LocalBusiness Schema on Any Page
Free, no signup. The Schema Markup Tester extracts and validates JSON-LD from any URL — checks LocalBusiness required fields, address format, and recommended properties in one pass.
Try the Schema Markup Tester Free →Affiliate disclosure: Some links on this page may be affiliate links. We only mention tools we've personally used and have an honest opinion about. Affiliate revenue helps keep ByteWaveNetwork's tools free and maintained. We are not paid by any of the tools compared in this article for favorable coverage.