Schema Forge

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

Short answer

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

PropertyStatusNotes
nameRequiredThe trading name, written as it appears on signage and listings.
addressRequiredA PostalAddress with street, locality, region, postal code and country.
telephoneRecommendedInclude the country code.
openingHoursSpecificationRecommendedOne entry per group of days with opens and closes in 24-hour time.
geo, url, image, priceRange, sameAsOptionalHelpful context. sameAs links to official profiles.

Example

localbusiness.jsonld (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 LocalBusiness when Restaurant, Dentist or 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.

Open the generator

Keep going