LocalBusiness schema markup: example, required fields and WordPress setup
LocalBusiness schema tells machines the facts a nearby customer needs: the business name, street address, phone number, opening hours and map coordinates. Google requires only name and address, but the recommended fields are where the value is, especially openingHoursSpecification, telephone and geo.
It does not replace a Google Business Profile. It is how your own website states the same facts in a form search engines and AI assistants can read without guessing. When someone asks an assistant whether you are open on Sunday, a clean hours block on your site is the kind of source that answers it. Use the most specific subtype that fits, such as Dentist, Bakery or AutoRepair, rather than the generic type.
JSON-LD example
Copy this into a <script type="application/ld+json"> tag and replace the values with your own.
{
"@context": "https://schema.org",
"@type": "Bakery",
"@id": "https://example.com/#bakery",
"name": "Harbor Lane Bakery",
"image": [
"https://example.com/images/storefront.jpg"
],
"url": "https://example.com/",
"telephone": "+1-207-555-0142",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 Harbor Lane",
"addressLocality": "Portland",
"addressRegion": "ME",
"postalCode": "04101",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 43.65912,
"longitude": -70.25683
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Tuesday",
"Wednesday",
"Thursday",
"Friday"
],
"opens": "07:00",
"closes": "16:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "08:00",
"closes": "14:00"
}
],
"sameAs": [
"https://www.instagram.com/harborlanebakery"
]
}
Properties
| Property | Status | What it is |
|---|---|---|
name | Required | The business name exactly as customers see it on signage and your Business Profile. |
address | Required | A PostalAddress with streetAddress, addressLocality, addressRegion, postalCode and addressCountry. |
telephone | Recommended | The main phone number, ideally with country code. |
url | Recommended | The URL of this specific location's page. |
geo | Recommended | GeoCoordinates with latitude and longitude. Google asks for at least 5 decimal places. |
openingHoursSpecification | Recommended | One entry per set of days with opens and closes times in 24-hour format. |
priceRange | Recommended | A short price indicator such as "$$" or a range like "$10-20". |
image | Recommended | Photos of the business itself. |
department | Recommended | Nested LocalBusiness entries for departments with their own hours, such as a pharmacy inside a store. |
servesCuisine / menu | Recommended | For food businesses: the cuisine type and a menu URL. |
When to use it
Use LocalBusiness if customers visit you at a physical location, or you serve a defined area and have a real business address. Put it on the homepage of a single-location business, or on each location's own page for a multi-location one.
A few rules:
- One location per block. Each location gets its own markup with its own address, phone and hours, on its own page.
- Use a subtype. schema.org has hundreds, from
RestauranttoPlumber. The generic LocalBusiness type is the fallback. - No invented addresses. A service-area business without a public storefront should not publish a fake street address to look local.
- Online-only businesses should use Organization instead.
Add it in WordPress
By hand. Print JSON-LD from wp_head on the pages that need it. This is manageable for one location, but hours change and hand-written blocks get stale.
With Hydrogen SEO. Go to Hydrogen SEO > Schema, add Local Business, and fill in the name, address, phone, email, opening hours and geo coordinates. Set Display On to where it should print, such as the front page or the entire website. The plugin links it to your Organization with parentOrganization, and it only prints once it has real details beyond a name. For a location page, add Local Business in that page's SEO Settings sheet; it replaces the site-wide entry on that page, so a page never carries two. With a free account, AI-assisted schema can draft the fields from a plain-language description for you to review.
One-off markup. The free schema generator in the Hydrogen SEO app at /seo/schema-generator builds LocalBusiness JSON-LD with address, geo and hours.
Common mistakes
- Inconsistent NAP. Name, address and phone should match your Business Profile and directory listings character for character.
- Hours as free text. Write
"opens": "07:00", not "7am-ish". Use 24-hour times, and list closed days by leaving them out. - Too few decimal places in geo. Use at least 5 decimal places for latitude and longitude.
- Self-serving review stars. Ratings you collect about your own business and mark up on your own site are not eligible for star rich results. See review snippet schema.
- Stale hours after a change. Update the markup the same day you change hours or move.
- Duplicate LocalBusiness blocks from a theme and a plugin. Keep one. See invalid structured data.
Test it
While drafting, the JSON-LD validator flags the LocalBusiness properties Google requires. Once the page is live, Google's Rich Results Test has the final say. Check that the hours, phone and address in the parsed output match your Business Profile. After you roll it out, a free SEO audit will show any pages still missing structured data.
Common questions
Does LocalBusiness schema help me rank in the local pack?
Google's local pack is driven mainly by your Google Business Profile, relevance, distance and prominence. The markup helps Google and other systems confirm your details, but it is not a ranking shortcut.
Which subtype should I use?
The most specific schema.org type that is true, such as Dentist, Restaurant or HVACBusiness. Fall back to LocalBusiness only when nothing more specific fits.
How do I mark up multiple locations?
Give each location its own page with its own LocalBusiness block, address, phone and hours. Do not list every location in one block on the homepage.
How do I show holiday hours?
Add an OpeningHoursSpecification with validFrom and validThrough dates for the special period, alongside your regular hours.