What Is Local Business Schema Markup?
Local business schema markup is structured data, usually JSON-LD, that describes a physical business location (its name, address, opening hours, coordinates and contact details) using the schema.org LocalBusiness type or one of its subtypes.
Schema.org defines LocalBusiness as “A particular physical business or branch of an organization”, with examples including “a restaurant, a particular branch of a restaurant chain, a branch of a bank, a medical practice” (schema.org). Google says that when people search for businesses on Search or Maps, results “may display a prominent Google knowledge panel with details about a business”, and that with this markup “you can tell Google about business hours, different departments within a business, reviews (if your site captures reviews about other businesses), and more” (Google). It is the location-level companion to Organization markup; Google's Organization guide recommends that a local business use “the most specific subtype(s) of LocalBusiness” and follow the Local business fields as well (Google).
How to Add Local Business Schema Markup at a Glance
| Step | Action | Expected result |
|---|---|---|
| 1 | Fix one set of business details | Name, address, phone and hours agreed and matching your Business Profile |
| 2 | Pick the most specific type | A subtype such as Dentist, Store or Restaurant |
| 3 | Add the required name and address | A valid minimum block |
| 4 | Add recommended properties in Google's formats | Geo, phone, URL, hours, price range |
| 5 | Handle departments and multiple locations | One block per location page; departments nested |
| 6 | Validate and inspect the live page | No critical errors in the Rich Results Test |
| 7 | Keep hours and details current | Markup that changes when the business does |
Time: about an hour per location template (our estimate); Google says it “may take several days after publishing a page for Google to find and crawl it.” Tools: a CMS or text editor, a map tool for coordinates, the Rich Results Test, Search Console. Cost: none. Skill level: beginner to intermediate.
What You Need Before Starting
- The business name exactly as it appears on signage and in your Google Business Profile.
- The full postal address, the main phone number with country code, and regular and seasonal hours.
- Latitude and longitude for each location, to at least five decimal places.
- A dedicated, indexable page for each location; see how to check if a page is indexed.
- Edit access to the page template or a structured data plugin.
Step 1: Fix One Set of Business Details
Agree the exact name, address, phone and hours before writing any code. Google's Business Profile guidelines ask you to “Represent your business as it's consistently represented and recognized in the real world across signage, stationery, and other branding” and to make sure the address or service area “is accurate and precise” (Google Business Profile Help).
Process: put the agreed details in one document and use it for the markup, the visible page, your Business Profile, Bing Places and Apple Business Connect. Expected result: one source of truth. Verify: the name on the page, the profile and the markup are character-for-character the same. Common mistake: adding keywords or the city to the business name in markup when the real-world name does not include them; Google's profile guidelines say the name should reflect the business's real-world name.
Step 2: Pick the Most Specific Type
Use a subtype when one fits. Google says: “Use the most specific LocalBusiness sub-type possible”, and if more than one applies, “specify them as an array” (Google).
Schema.org lists direct subtypes including AutomotiveBusiness, Dentist, FinancialService, FoodEstablishment, HealthAndBeautyBusiness, LegalService, MedicalBusiness, ProfessionalService, RealEstateAgent, Store and TravelAgency, each with further subtypes (schema.org). Expected result: an @type value such as "Dentist" or ["Store", "AutoRepair"]. Common mistake: using plain LocalBusiness when a precise type exists, or using Organization for a walk-in location.
Classification from schema.org usage bands (domains), not a measurement: bar length shows band rank only
Source: schema.org type pages for LocalBusiness, Restaurant, Store, ProfessionalService and Dentist, “Based on monthly aggregations from Google's web index. (Google - August 2026)”, read October 10, 2026.
Schema.org publishes bands, not counts. Each band covers a tenfold range, so bar length shows rank on a three-step scale (1M to 10M = full width, 100K to 1M = two thirds, 10K to 100K = one third), not proportional domain counts: a shorter bar means roughly 10 or more times fewer domains, not a fraction as many. Adoption bands say how many domains use a type, not whether Google displays anything for it.
Step 3: Add the Required Name and Address
Write the minimum block with name and a nested PostalAddress. Google lists only these two as required, and says of the address: “Include as many properties as possible.”
Process: fill streetAddress, addressLocality, addressRegion, postalCode and addressCountry, following the pattern in Google's example. Use JSON-LD, which Google's general guidelines list as the recommended format (Google). Expected result: a block that passes as a valid local business. Common mistake: putting the whole address in one text string instead of the separate fields.
Step 4: Add Recommended Properties in Google's Formats
Add the recommended fields that apply. The formats below are quoted from Google's property table (Google).
- geo: latitude and longitude, where “The precision must be at least 5 decimal places.”
- telephone: “Be sure to include the country code and area code in the phone number.”
- url: “The URL must be a working link.” Use the location page, not the home page, if each location has its own page.
- openingHoursSpecification:
opensandclosesare described as times “in hh:mm:ss format”, though Google's own examples use hh:mm, such as"11:30", and its 24-hour and closed-day rules are written in hh:mm too. The example below follows Google's examples and uses hh:mm throughout. For 24-hour opening, Google says to set opens to “00:00” and closes to “23:59”; for a day closed, set both to “00:00”. Hours past midnight, such as 18:00 to 03:00, can sit in one specification. - priceRange: “This field must be shorter than 100 characters.” Google adds that at 100 characters or more it “won't show a price range for the business.”
- image: Google's image guidance asks for a minimum of 50K pixels when multiplying width and height.
A complete example for one location:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Dentist",
"@id": "https://example.com/locations/springfield#business",
"name": "Example Dental Springfield",
"url": "https://example.com/locations/springfield",
"telephone": "+1-555-010-0199",
"image": ["https://example.com/photos/springfield-front.jpg"],
"address": {
"@type": "PostalAddress",
"streetAddress": "100 Main St",
"addressLocality": "Springfield",
"addressRegion": "IL",
"postalCode": "62701",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 39.78172,
"longitude": -89.65015
},
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "08:00",
"closes": "17:00"
},{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "00:00",
"closes": "00:00"
}],
"priceRange": "$$"
}
</script>
Add sameAs links to official profiles if you also use them in Organization markup; see what the sameAs property is. Common mistake: adding aggregateRating for reviews of your own business. Google says that property is “only recommended for sites that capture reviews about other local businesses.”
Classification from Google Search Central, not a measurement
Source: Google Search Central, Local business (LocalBusiness) structured data, last updated September 8, 2026.
Full bar = required; two-thirds = recommended; one-third = recommended only in a narrow case. Values are categories, not quantities.
Step 5: Handle Departments and Multiple Locations
Nest departments; give each location its own page and block. For a business with departments “each with its own distinct properties such as opening hours or telephone numbers”, Google says “you can mark up the department property with an element for each department” (Google).
Process: for a pharmacy inside a store, add a nested department with its own type, name, phone and hours. For a chain, put one LocalBusiness block on each location page, with that location's address and coordinates, rather than listing every branch on the home page (our recommendation, consistent with Google's rule that markup describe the page's main content). Google's profile guidelines add that all locations of a chain must have the same name unless the business's real-world name consistently varies by location. Expected result: one block per location URL. Common mistake: copying the head-office address onto every branch page.
Step 6: Validate and Inspect the Live Page
Test each location template in the Rich Results Test, then inspect the live URL. Google says to “Validate your code using the Rich Results Test and fix any critical errors”, and to “use the URL Inspection tool to test how Google sees the page”, checking that it is not blocked by robots.txt, noindex or a login (Google).
Search Console's help pages say rich result reports show a sample of detected items, not a full list (Search Console Help), so use URL Inspection in a verified Search Console property to confirm individual location pages. Expected result: the local business detected with no critical errors. Common mistake: treating a warning about a missing recommended field as a failure; Google says fixing non-critical issues is not necessary for eligibility.
Step 7: Keep Hours and Details Current
Update the markup whenever hours, phone or address change, and mark seasonal closures. Google's general guidelines say: “Provide up-to-date information” (Google).
Process: for a holiday closure, add an openingHoursSpecification with opens and closes at “00:00” and validFrom and validThrough dates in YYYY-MM-DD format, as in Google's example. Change the Business Profile on the same day. Expected result: markup, page and profile agree. Common mistake: updating the profile but leaving old hours in a template nobody owns.
How to Verify It Worked
- Markup: the Rich Results Test detects the local business on each live location URL without critical errors.
- Consistency: name, address, phone and hours match the visible page and your Business Profile.
- Crawl: URL Inspection shows the page indexed and the structured data detected.
- Display: whatever appears in a knowledge panel or Maps is Google's choice and draws on more than your page; see does a Business Profile affect brand search?
How to Choose What to Mark Up
| Situation | Recommended markup | Why |
|---|---|---|
| Single shop, clinic or office customers visit | Most specific LocalBusiness subtype on the contact or home page | Google asks for the most specific subtype |
| Chain with location pages | One LocalBusiness block per location page | Each page describes one place |
| Online-only company | Organization or OnlineBusiness, not LocalBusiness | Schema.org defines LocalBusiness as a physical business |
| Business with an in-store pharmacy or service desk | Nested department | Google documents departments with their own hours and phones |
| Restaurant wanting the carousel | Restaurant type with images | Google says the carousel is limited to a small set of providers |
For the trade-offs between listing services, see Google Business Profile vs Apple Business. To show location pages in a site path, add breadcrumb structured data.
Common Problems and Fixes
| Problem | Likely cause | Fix |
|---|---|---|
| Missing address error | Address given as plain text or omitted | Use a nested PostalAddress with separate fields |
| Price range not shown | Text is 100 characters or longer | Shorten to under 100 characters |
| Wrong pin or location | Coordinates rounded below five decimals | Copy coordinates with at least five decimals |
| Hours look wrong at weekends | Closed days left out or overnight hours split | Use 00:00 to 00:00 for closed days; one entry for overnight hours |
| Markup and profile disagree | Details changed in one place | Update both from your single source document |
What Not to Do
- Do not mark up self-serving reviews. Consequence: Google says aggregateRating is only recommended for sites that review other businesses, and its guidelines warn against misleading markup. Correction: leave reviews of your own business off the markup.
- Do not invent locations. Consequence: Google says sites that violate its guidelines may receive a manual action. Correction: mark up only places customers can visit or that you serve as listed in your profile.
- Do not hide the details. Consequence: Google's guidelines say not to mark up content that is not visible to readers. Correction: show the address, phone and hours on the page.
- Do not expect markup to replace a Business Profile. Consequence: missing Maps presence. Correction: set up and verify the profile separately.
Frequently Asked Questions
What properties are required for LocalBusiness markup?
Google requires two: name and address. It recommends geo, openingHoursSpecification, telephone, url, priceRange and others where they apply.
Should I use LocalBusiness or a subtype?
Use the most specific subtype that fits, such as Dentist, Store or Restaurant. Google asks for the most specific LocalBusiness subtype possible.
Does LocalBusiness markup create a Google Business Profile?
No. A Business Profile is set up and verified separately. The markup describes your location page, and the two should use the same details.
Can I add star ratings for my own business?
Google says aggregateRating in LocalBusiness markup is only recommended for sites that capture reviews about other local businesses, so reviews of your own business should not be marked up there.
How should I mark up opening hours?
Use openingHoursSpecification with dayOfWeek, opens and closes. For 24-hour opening, Google says opens 00:00 and closes 23:59; for a closed day, both 00:00. Seasonal closures use validFrom and validThrough.
How do I mark up several locations?
Give each location its own page with its own LocalBusiness block, address and coordinates. Departments inside one location can be nested with the department property.
Sources and Methodology
This guide is built from Google's Local business and Organization structured data documentation (both read October 10, 2026; the Local business page was last updated September 8, 2026), Google's general structured data guidelines, Google Business Profile guidelines, Search Console Help and the schema.org LocalBusiness page. Quotations are from those pages. The JSON-LD example uses invented details for a fictional business; we checked that it parses as JSON but did not test it on a live site or observe how Google displays any business. Adoption figures are schema.org's published bands, not exact counts.
- official Google Search Central, Local business (LocalBusiness) structured data, last updated September 8, 2026. Read October 10, 2026.
- official Google Search Central, Organization (Organization) structured data, section on LocalBusiness subtypes. Read October 10, 2026.
- official Google Search Central, General structured data guidelines, last updated July 10, 2026. Read October 10, 2026.
- official Google Business Profile Help, Guidelines for representing your business on Google. Read October 10, 2026.
- official Search Console Help, Rich result report overview. Read October 10, 2026.
- standards Schema.org, LocalBusiness, including subtypes and the usage band based on Google's August 2026 aggregations; subtype bands read from the Restaurant, Store, ProfessionalService and Dentist pages. Read October 10, 2026.