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.
Step 3: Add recommended properties
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: aGeoCoordinatesobject. 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.menuandservesCuisinefor 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/Mondayor as short names such asMonday. opensandclosesuse hh:mm (or hh:mm:ss) format.- For year-round hours, leave out
validFromandvalidThrough. - For a seasonal closure, add
validFromandvalidThroughin YYYY-MM-DD format. - If you close after midnight, use one specification and a
closestime after midnight on the opening day, such as03:00. - For open 24 hours, set
opensto00:00andclosesto23:59. - For closed all day, set both
opensandclosesto00: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.
nameand a completePostalAddressare 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.
geovalues have at least five decimal places, if included.priceRangeis 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
closestime 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
validFromandvalidThroughfor holiday closures and remove them afterwards. - A
priceRangethat is a paragraph. Keep it short, under 100 characters. - Blocking the page. A robots.txt rule or
noindexon 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.
Related guides
- Organization Schema Markup: Add Your Name, Logo and Profiles
- JSON-LD Validation: Test and Debug Structured Data Step by Step
- Rich Results Test Errors: Fix the Most Common Problems and Warnings
- Orphan Pages: How to Find Pages With No Internal Links and Fix Them
- Internal Linking Strategy: Link Your Pages for People and Crawlers
Official references
- https://developers.google.com/search/docs/appearance/structured-data/local-business
- https://developers.google.com/search/docs/appearance/structured-data/organization
- https://developers.google.com/search/docs/appearance/structured-data/review-snippet
- https://developers.google.com/search/docs/appearance/structured-data/sd-policies
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.