Schema guide
LocalBusiness schema markup (JSON-LD)
How to write LocalBusiness JSON-LD: name, address, phone, opening hours and geo, with a working example and notes on choosing the right subtype.
Overview
LocalBusiness markup gives search engines a business's name, address, phone number, hours and location straight from its own site. Use the most specific subtype available, put it on the page that lists the business details, and make every value match what visitors see. Name and address are the essential properties.
What it can do for you
- Google Rich results: yes
- Yes, for business details in Search and Maps. It works best next to a Google Business Profile with the same name, address and phone number.
- AI and answer engines
- Name, address, phone number and opening hours are unambiguous, which helps assistants answer "is it open" and "where is it".
Use it when
- The home or contact page of a business with a physical location or service area
Skip it when
- An online-only business (use
Organization) - A page that lists several locations in one block
Properties
| Property | Status | Notes |
|---|---|---|
name | Required | The trading name, written as it appears on signage and listings. |
address | Required | A PostalAddress with street, locality, region, postal code and country. |
telephone | Recommended | Include the country code. |
openingHoursSpecification | Recommended | One entry per group of days with opens and closes in 24-hour time. |
geo, url, image, priceRange, sameAs | Optional | Helpful context. sameAs links to official profiles. |
Example
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Plumber",
"name": "Marlow & Finch Plumbing",
"url": "https://example.com/",
"image": "https://example.com/img/van.jpg",
"telephone": "+1-555-0100",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 Main St",
"addressLocality": "Springfield",
"addressRegion": "IL",
"postalCode": "62704",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 39.7817,
"longitude": -89.6501
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday"
],
"opens": "08:00",
"closes": "17:00"
}
],
"sameAs": [
"https://www.facebook.com/example"
]
}
</script>A fictional plumber, using the Plumber subtype instead of the generic type.
It takes the phone number from a tel: link, the address from an address element, microdata or business meta tags, coordinates from geo meta tags, and social profiles from links.
United States addresses are split into city, state and ZIP automatically. Other formats are kept in one field and flagged. Opening hours are only used if the page marks them up.
Common mistakes
- A phone number or address that differs from the one on the page or on your business listings.
- Missing
addressCountry, or a region written in full where listings use the abbreviation. - Using
LocalBusinesswhenRestaurant,Dentistor another subtype exists. - Putting several locations in one block.
Questions
Which LocalBusiness properties matter most?
The business name and a full address are the essentials. A telephone, url, openingHoursSpecification, geo coordinates and image make the record more useful.
Should I use LocalBusiness or a more specific type?
Use the most specific subtype that fits, such as Restaurant, Dentist or Plumber. LocalBusiness is the fallback when nothing narrower applies.
What about a business with several locations?
Give each location its own page and its own LocalBusiness block, using that location's address and phone number. One block with several addresses is not valid.
Does this replace a Google Business Profile?
No. Markup on your site and a Business Profile work together. Keep the name, address and phone number identical in both.
Generate this markup for your page
Paste the address of a public page and get a ready-to-paste block, with every gap listed.