Read This First — What LocalBusiness Markup Does and Does Not Do
Plenty of pages imply that adding LocalBusiness schema gets you into Google's local pack and onto Maps. That is not how it works, and being clear about it will save you time.
Google's own documentation states that the way to update your business information in Google is through the Business Profile, not through markup on your website.
| What LocalBusiness markup DOES | What it does NOT do |
|
Confirms and corroborates your business details to search engines |
Get you into the local pack |
|
Helps disambiguate your business from similarly named ones |
Replace a Google Business Profile |
|
Feeds AI assistants answering near me and open now queries |
Guarantee rich results on its own |
|
Ties locations to your Organization entity, supporting E-E-A-T |
Fix inconsistent information elsewhere |
|
Supports Bing, other search engines, and AI systems |
Produce star ratings for your own business |
AI assistants answering local questions lean on structured data to resolve which business is which, so clean markup increasingly affects whether you get cited in an AI answer even where it does not change a traditional ranking.
Why You Are Here
The first situation is a business with a physical location that wants its address, hours, and contact details stated unambiguously in a machine-readable form, so search engines and AI systems have no doubt about the facts.
The second is a multi-location business needing a separate, correct markup block for each location page. This is where markup earns its keep, because each location needs its own distinct entity and doing that by hand across dozens of pages is where errors creep in.
The third is diagnosing why local visibility is poor. Often the answer lies in the Business Profile or in inconsistent details across the web rather than in the markup, and the section above explains why.
What This Tool Does
The Local Business Schema Generator builds valid LocalBusiness JSON-LD from a simple form.
Choose your business subtype, enter your name, address, phone, URL, opening hours, and geo coordinates, and the tool assembles correctly structured JSON-LD with PostalAddress, GeoCoordinates, and OpeningHoursSpecification nested properly, with the script tag included. Copy it and paste it into your page.
Use the Most Specific Subtype
Google's guidance is explicit: use the most specific LocalBusiness subtype available rather than the generic type. A specific subtype tells search engines what kind of business you are, not merely that you are one.
| Business | Subtype |
|
Restaurant |
Restaurant |
|
Cafe |
CafeOrCoffeeShop |
|
Dentist |
Dentist |
|
Law firm |
LegalService |
|
Plumber, electrician, builder |
HomeAndConstructionBusiness or a child of it |
|
Hair or beauty salon |
HealthAndBeautyBusiness |
|
Gym |
HealthClub |
|
Consultant or agency |
ProfessionalService |
|
Shop |
Store or a specific child such as BookStore |
|
Hotel |
Hotel |
|
Estate agent |
RealEstateAgent |
|
Vehicle repair |
AutoRepair |
For businesses offering several services, pass an array of types
"@type": ["Electrician", "Plumber", "Locksmith"] // additionalType is NOT supported for this. // An array is the correct approach.
Physical Location or Not
This distinction determines whether LocalBusiness is the right type at all.
| Your situation | Type to use |
|
Premises customers can visit |
LocalBusiness subtype |
|
Service-area business travelling to customers |
LocalBusiness subtype, with service area defined |
|
Purely online, no public premises |
Organization |
|
Online shop with no storefront |
Organization |
Property Reference
| Property | Status | Notes |
|
@type |
Required |
Most specific subtype, or an array |
|
name |
Required |
Exactly as it appears on your Business Profile |
|
address |
Required |
PostalAddress object |
|
address.streetAddress |
Required |
Street and number |
|
address.addressLocality |
Required |
Town or city |
|
address.addressRegion |
Recommended |
County, state, or region |
|
address.postalCode |
Required |
Postcode or ZIP |
|
address.addressCountry |
Required |
Two-letter ISO country code |
|
telephone |
Recommended |
Full international format |
|
url |
Recommended |
Your website or location page |
|
image |
Recommended |
Photograph of the premises |
|
geo |
Recommended |
GeoCoordinates, five decimal places minimum |
|
openingHoursSpecification |
Recommended |
Structured hours |
|
priceRange |
Recommended |
Symbol range or a currency range |
|
sameAs |
Recommended |
Social profiles and Business Profile URL |
|
servesCuisine |
Restaurants |
Cuisine type |
|
menu |
Restaurants |
Menu URL |
|
acceptsReservations |
Restaurants |
True or false |
|
department |
Optional |
For distinct departments at one address |
|
aggregateRating |
NOT ELIGIBLE |
See the review section below |
Geo coordinates need precision
Five decimal places is the practical minimum for accurate placement. Fewer decimals can put your pin a street or more away from your actual door.
sameAs is more useful than it looks
Linking your social profiles and Google Business Profile URL helps search engines connect the entity on your site to the entity they already know about elsewhere, which is exactly the corroboration role markup plays best.
Opening Hours
openingHoursSpecification handles complexity that a simple string cannot: lunch closures, different weekend hours, and seasonal variations.
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday",
"Thursday", "Friday"],
"opens": "09:00",
"closes": "17:30"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "10:00",
"closes": "16:00"
}
]
A lunchtime closure needs two blocks for the same day
One for the morning and one for the afternoon. A single block cannot express a gap.
Seasonal hours use validFrom and validThrough
These bound a block to a specific date range.
Closed all day
Expressed by omitting that day entirely, or by setting opens and closes both to 00:00.
Example Output
{
"@context": "https://schema.org",
"@type": "Dentist",
"name": "Northgate Dental Practice",
"image": "https://example.com/images/practice-front.jpg",
"url": "https://example.com/northgate",
"telephone": "+44 161 496 0000",
"priceRange": "££",
"address": {
"@type": "PostalAddress",
"streetAddress": "42 Northgate Street",
"addressLocality": "Manchester",
"addressRegion": "Greater Manchester",
"postalCode": "M1 4AB",
"addressCountry": "GB"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 53.48095,
"longitude": -2.23743
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday"],
"opens": "08:30",
"closes": "17:30"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Friday",
"opens": "08:30",
"closes": "13:00"
}
],
"sameAs": [
"https://www.facebook.com/example",
"https://www.instagram.com/example"
]
}
Multiple Locations
Each location gets its own LocalBusiness block on its own page. Do not attempt to describe several locations in one block.
| The pattern that works | |
|
A dedicated page per location |
Each with its own URL |
|
One LocalBusiness block per page |
Describing that location only |
|
name may repeat across locations |
But the address must differ |
|
Each block linked to the parent Organization |
Where relevant |
|
Details matching that location's Business Profile |
Exactly |
Reviews — LocalBusiness Cannot Show Its Own Stars
This is the rule that catches the most local businesses, and it is worth stating plainly.
This has applied since September 2019. Testimonials on your own site marked up with LocalBusiness and aggregateRating will not produce stars.
Pulling your Google Business Profile or Facebook reviews onto your page through a widget leaves you in exactly the same position, because Google's wording covers embedded third-party widgets explicitly.
Google has said self-serving review markup does not trigger a manual action. The stars simply will not appear.
A well-maintained Google Business Profile. Reviews collected there appear in local results and the Knowledge Panel through a mechanism that requires no markup on your site whatsoever. LocalBusiness review markup is only eligible when you are reviewing OTHER businesses, as a directory or review site would.
Common Mistakes to Avoid
LocalBusiness structured data corroborates your details; it does not create a listing. Local pack and Maps visibility come from the Business Profile, and Google's documentation says so directly. A business with perfect markup and an unclaimed profile will not appear where it wants to. Claim and complete the profile first, then add markup that matches it exactly.
Marking up as plain LocalBusiness when a specific subtype exists gives away useful information. Dentist, Restaurant, LegalService, and HealthClub all tell search engines what kind of business you are rather than merely that you are one. If several apply, pass them as an array rather than reaching for additionalType, which is not supported.
Your name, address, and phone number in the markup should match your Google Business Profile character for character. A different phone format, an abbreviated street name, or a slightly different trading name creates ambiguity exactly where the markup is meant to remove it. The whole value of corroboration depends on the two sources agreeing.
Quick Reference
| Item | Detail |
|
Type |
Most specific LocalBusiness subtype |
|
Multiple services |
Array of types |
|
additionalType |
Not supported |
|
No physical location |
Use Organization |
|
Local pack |
Comes from Google Business Profile |
|
Markup role |
Corroboration, not a listing |
|
NAP |
Must match your Business Profile exactly |
|
Geo |
Five decimal places minimum |
|
Hours |
OpeningHoursSpecification, one block per period |
|
Lunch closure |
Two blocks for that day |
|
Multi-location |
One page and one block per location |
|
Own reviews |
No stars, no penalty either |
|
sameAs |
Link profiles to connect the entity |
