Local Business Schema: Mark Up Your Address, Hours and Location

Crawvix Editorial Team · Published October 29, 2026 · Last updated October 29, 2026 · 7 min read

Local business schema is structured data that describes a business with a physical location: its name, address, phone number, opening hours and, if you wish, map coordinates. Google can use it to understand the details of your business, and those details can appear in places such as knowledge panels and local results. The markup is plain text in your page source, written in JSON-LD, and it is only useful when it matches what customers can see on the page.

This guide is for owners of shops, restaurants, clinics, salons, offices and other places people visit, and for the developers who maintain their websites. You will pick the right type, write a valid block, handle opening hours (including late nights and holiday closures), mark up departments and multiple locations, and test the result. The guide is honest about limits: structured data does not decide whether you appear in local results, and Google does not promise any feature in return for markup.

Before you begin

Collect the facts exactly as they appear on your website and in your public listings. Inconsistent details cause confusion for customers first, and for machines second.

You need:

  • The business name as customers know it.
  • The full postal address, split into street, town, region, postal code and country.
  • A phone number with country code and area code.
  • Opening hours for each day, plus any dates you are closed.
  • The URL of the page for this location. It must work.
  • Optionally latitude and longitude, and a price range.

You also need access to the page template (or a plugin that adds structured data). Keep a copy of the template before you edit it. The work for one location takes under an hour. This guide covers markup on your own website. It does not explain how to manage a Google Business Profile, which is a separate product.

How local business markup fits with other markup

LocalBusiness is a subtype of Organization, so Google also recommends the organization fields (logo, profiles, contact details) for it. If you have not read Organization Schema Markup: Add Your Name, Logo and Profiles, skim it for the shared fields.

Google asks you to use the most specific subtype available. Its examples include Restaurant, DaySpa and HealthClub. If more than one type fits, you can list several as an array. The additionalType property is not supported.

Step-by-step instructions

Step 1: Choose the type and the page

Pick the most specific schema.org type that describes the business. A bakery is a better fit for a bakery subtype than for the generic LocalBusiness. Then choose the page that will carry the markup. You can add it to any page, but it makes the most sense on a page that describes the business, such as a location page. For a single-location business that is usually the home page or the contact page.

What success looks like: one type name and one page URL are written down.

Step 2: Write the required properties

Google lists two required properties: name and address. The address should be a PostalAddress with as many parts as you have: streetAddress, addressLocality, addressRegion, postalCode and addressCountry. Google says more complete addresses produce higher-quality results.

What success looks like: the name and address in the markup are word-for-word what a visitor sees in the page footer or contact section.

Add what applies from Google's recommended list:

  • url: the fully qualified URL of this specific location. It must work.
  • telephone: the main number, with country and area code.
  • geo: a GeoCoordinates object. Give latitude and longitude to at least five decimal places.
  • openingHoursSpecification: see the next step.
  • priceRange: under 100 characters, or Google will not show it. Examples are $$$ or $10-15.
  • menu and servesCuisine for food businesses.

Do not add review or aggregateRating for your own business. Google's guidance says that if a business controls its own reviews, including through an embedded widget, its LocalBusiness or Organization pages are not eligible for the review star feature. Those two properties are meant for sites that collect reviews about other local businesses.

Here is a complete example for a made-up restaurant:

{
  "@context": "https://schema.org",
  "@type": "Restaurant",
  "name": "Example Bistro",
  "url": "https://www.example.com/locations/springfield",
  "telephone": "+12175550100",
  "image": [
    "https://www.example.com/photos/1x1/bistro.jpg",
    "https://www.example.com/photos/4x3/bistro.jpg"
  ],
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "100 Main St",
    "addressLocality": "Springfield",
    "addressRegion": "IL",
    "postalCode": "62701",
    "addressCountry": "US"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 39.781721,
    "longitude": -89.650148
  },
  "servesCuisine": "Italian",
  "priceRange": "$$",
  "menu": "https://www.example.com/menu",
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "11:00",
      "closes": "22:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Saturday",
      "opens": "12:00",
      "closes": "23:00"
    }
  ]
}

What success looks like: the block is valid JSON and every value is visible, in some form, on the page.

Step 4: Get opening hours right

Opening hours cause most local business mistakes, so use the rules Google gives:

  • Days can be written as full schema.org URLs such as https://schema.org/Monday or as short names such as Monday.
  • opens and closes use hh:mm (or hh:mm:ss) format.
  • For year-round hours, leave out validFrom and validThrough.
  • For a seasonal closure, add validFrom and validThrough in YYYY-MM-DD format.
  • If you close after midnight, use one specification and a closes time after midnight on the opening day, such as 03:00.
  • For open 24 hours, set opens to 00:00 and closes to 23:59.
  • For closed all day, set both opens and closes to 00:00.

Update the markup whenever the hours on the page change. Time-sensitive information that is out of date is a quality problem, and Google's general guidelines say to keep information current.

What success looks like: a person reading the page hours and a person reading the markup get the same answer for every day.

Step 5: Add departments if they differ

If a department has different hours or a different phone number from the main business, nest a LocalBusiness under department and set only the properties that differ. Google's naming advice is to use the store name followed by the department name, such as "Example Store Pharmacy", unless the department has its own brand, in which case use only the brand name.

What success looks like: each department block contains only what is different from the parent.

Step 6: Handle several locations

Google's page says each local business location is defined as its own LocalBusiness. The practical approach is one page per location, each with its own URL, address, phone number, coordinates and hours, and each page carrying its own block. Do not put a single block with the wrong address on every location page. Link the location pages from a main locations page so people and crawlers can find them. Our guides on Orphan Pages and Internal Linking Strategy cover that part.

What success looks like: each location URL has exactly one block, and its address belongs to that location.

Step 7: Test, deploy and watch

Paste the block into the Rich Results Test using the code option, fix errors, then deploy. Test the live URL, check it in the URL Inspection tool, and make sure the page is not blocked by robots.txt, a noindex tag or a login. Submit or refresh your sitemap. Google says the test checks syntax, and that inaccurate or spammy markup can still be ignored or cause problems even if it passes. See Test and Debug JSON-LD Structured Data for the full routine.

What success looks like: the live URL shows a valid local business item and the page is indexable.

Final verification checklist

  • The type is the most specific one that fits.
  • name and a complete PostalAddress are present.
  • The address and phone number match the visible page.
  • Phone numbers include country and area code.
  • Hours follow the format rules and match the page.
  • geo values have at least five decimal places, if included.
  • priceRange is under 100 characters, if included.
  • Each location has its own page, URL and block.
  • No self-published review stars are attached.
  • The Rich Results Test shows no errors, and the page is crawlable.

Common mistakes to avoid

  • Different details in markup and on the page. Make both come from one data source.
  • One block for all locations. Give each location its own page and block.
  • Self-serving ratings. Do not mark up reviews of your own business that you control.
  • Wrong midnight handling. Use a closes time after midnight on the opening day, not a second invented day.
  • Using additionalType. Google does not support it. List several types as an array instead.
  • Forgetting seasonal changes. Add validFrom and validThrough for holiday closures and remove them afterwards.
  • A priceRange that is a paragraph. Keep it short, under 100 characters.
  • Blocking the page. A robots.txt rule or noindex on the location page defeats the markup.

Frequently asked questions

Which properties are required?

Google lists name and address. Everything else is recommended, but accurate recommended properties make the markup more useful.

Does local business markup replace a Google Business Profile?

No. This guide covers markup on your own site. A Business Profile is managed separately, and nothing here says one replaces the other.

Where should the markup go?

On any page, but the best place is a page that describes the business, such as a location page. Google's examples put JSON-LD in the head.

How long until Google sees the change?

Google says crawling and indexing can take several days. Check the live page with the URL Inspection tool rather than waiting.

Do I need geo coordinates?

No, they are recommended. If you add them, use at least five decimal places.

Official references


Next step: See how Crawvix checks a website and capture a baseline once scanning opens. This guide provides technical information, not a guarantee of rankings, traffic or index inclusion.

In this category

All 8 Structured Data guides