How do you add LocalBusiness schema to a local business website?
LocalBusiness schema is a block of structured data that states your business name, address, phone, hours and location in a format search engines read reliably. It takes an hour to add, describes what your page already says and should match your Business Profile exactly.
What is LocalBusiness schema?
LocalBusiness schema is structured data, written in the schema.org vocabulary, that describes a business with a physical location: its name, address, phone, opening hours, coordinates and website. You add it to a page as a JSON-LD script, invisible to visitors and read by search engines.
It is one of many schema.org types. LocalBusiness itself has dozens of more specific subtypes, such as Plumber, Dentist, BicycleStore or AccountingService, and Google asks you to pick the most specific one that fits.
Google's introduction to structured data explains that markup gives explicit clues about the meaning of a page, that JSON-LD is the recommended format, and that correct markup makes a page eligible for enhanced results without guaranteeing them. For local businesses the main value is clarity: the address and hours on your site are stated in a way no parser can misread. It complements, not replaces, consistent business information.
Which pages should carry LocalBusiness markup?
Put LocalBusiness markup on the page that represents each physical location, and nowhere it does not belong.
| Site type | Where LocalBusiness goes | Elsewhere |
|---|---|---|
| Single location | Homepage or contact page (one place, not both with different data) | Organization details can sit in the same block |
| Multi-location | Each location page, with that branch's data | Organization markup on the homepage |
| Service-area business with hidden address | Only if you show an address on the site; ShoutEx view: otherwise rely on Organization markup | Service pages need no LocalBusiness block |
| Departments in one building | The main location, with department entries | Each department's page can link to it |
For multi-location sites, this ties directly into location pages: the page, the markup and the profile all describe the same branch.
Which properties does Google require and recommend?
Google's local business structured data documentation sets out what to include. The table summarizes it for a typical local business.
| Property | Status | What to enter |
|---|---|---|
| name | Required | The business name as on the storefront and profile |
| address (PostalAddress) | Required | Street, city, province, postal code, country CA |
| geo | Recommended | Latitude and longitude with at least 5 decimal places |
| telephone | Recommended | Including country and area code, e.g. +1-519-555-0147 |
| url | Recommended | The page for this specific location |
| openingHoursSpecification | Recommended | Each day's opening and closing times |
| priceRange | Recommended | A short range such as $$, under 100 characters |
| department | Recommended where relevant | Separate departments, each with its own details |
What does a complete JSON-LD example look like?
Here is markup for a fictional bicycle shop in Cambridge, Ontario. It uses the BicycleStore subtype, a Canadian address with province code, a phone number with country code and two sets of opening hours.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BicycleStore",
"@id": "https://grandrivercycle.example/#store",
"name": "Grand River Cycle",
"url": "https://grandrivercycle.example/",
"telephone": "+1-519-555-0147",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "455 Hespeler Rd, Unit 2",
"addressLocality": "Cambridge",
"addressRegion": "ON",
"postalCode": "N1R 0A1",
"addressCountry": "CA"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 43.39712,
"longitude": -80.31478
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "10:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "09:00",
"closes": "17:00"
}
]
}
</script>- @type is the specific subtype, not plain LocalBusiness.
- @id gives the business a stable identifier other markup can refer to.
- telephone includes +1 and the area code.
- geo uses five decimal places. Take coordinates from the pin you placed on your Business Profile.
- openingHoursSpecification groups days with the same hours. Add special hours for holidays when they apply.
- Every value matches what is printed on the page and on the profile.
Markup must match the page, and the page must match the profile.
Every value in your JSON-LD should be visible on the same page and identical to the Business Profile for that location. Three versions of your hours is worse than none.
Which LocalBusiness subtype should you choose?
Choose the most specific schema.org type that describes what the business is. If nothing specific fits, use the closest parent type rather than inventing one.
| Business | Specific type | Parent type |
|---|---|---|
| Plumber or electrician | Plumber, Electrician | HomeAndConstructionBusiness |
| Physiotherapy clinic | Physiotherapy | MedicalBusiness |
| Bicycle shop | BicycleStore | Store |
| Auto repair garage | AutoRepair | AutomotiveBusiness |
| Bookkeeping or accounting firm | AccountingService | FinancialService |
| Hair salon | HairSalon | HealthAndBeautyBusiness |
The schema type does not need to match your Google Business Profile category word for word; the two systems use different lists. Pick each one on its own terms. Categories are covered in Business Profile categories.
What mistakes break LocalBusiness markup?
- Self-serving review stars. aggregateRating on your own business is reserved for sites that review other businesses.
- Head office data on every branch page. Each location needs its own address, phone and hours.
- Markup that disagrees with the page. Hours in the JSON-LD that differ from the visible hours.
- Plugins adding duplicate blocks. A theme and an SEO plugin both outputting LocalBusiness with different values.
- A P.O. box or virtual office as the address. Use the real location customers visit.
- Forgetting updates. Holiday hours and moves must change the markup too.
How do you test and monitor schema?
Test before publishing and check monthly afterwards.
| Step | Tool | What to look for |
|---|---|---|
| Validate syntax | Schema Markup Validator | No errors; the type and properties are read correctly |
| Check Google eligibility | Rich Results Test | Detected items and any warnings |
| Compare with the page | View the page as a visitor | Every value visible and identical |
| Monitor at scale | A site crawler that extracts structured data | Missing or changed blocks after site or plugin updates |
On larger sites, add a schema check to every release. See site architecture for where each block belongs and the local SEO audit for the full checklist.
Frequently asked questions
Does LocalBusiness schema improve local rankings?
It makes your business details unambiguous to search engines. It does not replace relevance, distance and prominence, and correct markup does not guarantee any enhanced result.
Which format should I use for schema markup?
JSON-LD, which Google recommends. It sits in a script block and does not change how the page looks.
What properties are required for LocalBusiness?
Google lists name and address as required, and recommends geo, telephone, url, opening hours, price range and department where relevant.
Can I add review stars to my own business schema?
No. Google reserves review and aggregateRating markup in local business data for sites that review other businesses. Self-serving ratings will not show stars.
Do I need separate schema for each location?
Yes. Put a LocalBusiness block on each location page with that branch's own address, phone, hours and coordinates.
What if my exact business type is not in schema.org?
Use the closest more general type, such as Store, ProfessionalService or HomeAndConstructionBusiness, rather than plain LocalBusiness if a better parent fits.
How do I write a Canadian phone number in schema?
Include the country and area code, for example +1-519-555-0147.
How do I test my schema?
Use the Schema Markup Validator for syntax and Google's Rich Results Test for eligibility, then re-test key pages after site or plugin updates.
Sources & further reading
Regulator rules, platform policies and local data change. These sources let you check the facts on this page, last checked October 7, 2026.