Local SEO

LocalBusiness Schema Markup: The Complete JSON-LD Implementation Guide

By Reviewed by Hawrry Bhattarai
August 24, 2026 21 min read
Contents
TL;DR — the short answer

How to implement LocalBusiness schema correctly in 2026. Covers every property, geo coordinates, hours formatting, schema type hierarchy, and validation with code examples.

16 min read · Local SEO · Last updated July 2026

Quick answer: Implement LocalBusiness schema as a JSON-LD <script> block in your page <head>. Include at minimum: @type, name, address (PostalAddress), telephone, and url. Add geo, openingHoursSpecification, image, and aggregateRating to strengthen Knowledge Panel signals. Validate with Google’s Rich Results Test before deploying.

Introduction

A Kathmandu-based law firm launched a new website in early 2025. They had solid on-page content, reasonable domain authority, and a well-optimised GBP. But eight months after launch, their Knowledge Panel still wasn’t showing consistently in search results, and they weren’t appearing in local pack results for several of their core practice area terms in Kathmandu.

The technical audit found the issue in 20 minutes: their website had no LocalBusiness schema at all. No structured data told Google what type of business this was, where it was physically located, or what its hours were. Their GBP provided some of this information, but Google’s confidence in the connection between the website and the physical business was weak. Schema markup bridges that gap.

After implementing a correct LegalService schema block with full address, geo coordinates, phone, and opening hours, the firm’s Knowledge Panel became consistent within six weeks. Local pack presence for three target keywords appeared within two months. The implementation took 45 minutes.

Schema markup is not magic — it doesn’t guarantee rankings. But for local businesses, it’s one of the clearest structured signals you can give Google about your business identity, location, and category. Done correctly, it reinforces everything else you’re doing in local SEO.

What you’ll learn:
– What LocalBusiness schema communicates to Google (and what it doesn’t)
– Why JSON-LD is the only format worth using in 2026
– Required and important optional properties explained in plain language
– The LocalBusiness type hierarchy and how to pick the right subtype
– Complete, copy-ready code examples for a restaurant, law firm, medical clinic, and retail store
– How to handle multiple locations, split hours, and holiday hours
– How to find and format geo coordinates
– Testing your schema before and after implementation
– The most common schema errors that validators catch


Table of Contents

  1. What LocalBusiness Schema Tells Google
  2. JSON-LD vs. Microdata — Why JSON-LD Wins
  3. Required Properties
  4. Important Optional Properties
  5. The LocalBusiness Type Hierarchy
  6. Complete Code Examples (4 Business Types)
  7. LocalBusiness Schema Generator (Widget)
  8. Handling Multiple Locations
  9. OpeningHoursSpecification for Complex Schedules
  10. GeoCoordinates: Finding and Formatting Lat/Long
  11. Testing and Validating Your Schema
  12. Schema Completeness Checker (Widget)
  13. Common Schema Errors and How to Fix Them
  14. FAQ
  15. Schema in the Context of a Complete Local SEO Strategy

What LocalBusiness Schema Tells Google

Schema markup is structured data — machine-readable information embedded in a webpage that tells search engines (not just Google) what the content means, not just what it says.

Without schema, Google reads your contact page and sees text: “123 Main Street, Melbourne VIC 3000 | (03) 9123 4567 | Open Mon–Fri 9am–5pm.” It can parse this text, but it must infer what role each piece of information plays.

With LocalBusiness schema, you tell Google directly: this is the name, this is the streetAddress, this is the telephone, this is the openingHoursSpecification. The structured format eliminates ambiguity.

What it affects:

  • Knowledge Panel: Google uses schema data to populate or confirm Knowledge Panel information (business name, address, phone, hours, map, website)
  • Local Pack eligibility: schema reinforces GBP data, helping Google confirm the connection between your website and your physical business location
  • Rich snippets: certain schema subtypes (Restaurant, MedicalBusiness) can produce rich result features like star ratings, opening hours, and price range chips directly in search results
  • Voice search: voice assistants (Google Assistant, Siri) use structured data to answer “What are the hours for [business]?” queries

What it doesn’t do:
Schema markup is not a direct ranking signal — Google has said this explicitly. It doesn’t boost your domain authority or create backlinks. What it does is reduce ambiguity and increase confidence in the accuracy of your business data, which has indirect positive effects on how consistently your business appears in local results.


JSON-LD vs. Microdata — Why JSON-LD Wins

There are three formats for implementing structured data: JSON-LD, Microdata, and RDFa. In 2026, the answer is always JSON-LD.

JSON-LD (JavaScript Object Notation for Linked Data):
– Lives in a <script type="application/ld+json"> block in your page <head> or <body>
– Completely separate from your HTML content — you can add, edit, or remove it without touching visible page elements
– Easier to implement, easier to maintain, easier to debug
– Google’s officially recommended format
– Works without page modifications (can be injected via Google Tag Manager)

Microdata:
– Embedded directly in your HTML using itemscope, itemtype, and itemprop attributes
– Requires editing the actual HTML of each element
– Makes HTML harder to read and maintain
– Any structural HTML change risks breaking the schema implementation
– Still valid and supported, but not worth the additional complexity

RDFa:
– Similar to Microdata, embedded in HTML
– More used for publishing and academic contexts
– Not commonly used for local business schema in 2026

For local business schema: use JSON-LD, always. You can paste a JSON-LD block into any CMS without modifying your template. If you need to update your hours, you edit one JSON-LD block — you don’t hunt through HTML for itemprops.


Required Properties

These are the minimum properties that constitute a valid LocalBusiness schema block. Without these, your structured data will be flagged as incomplete in validators.

@context
Always "https://schema.org". This tells parsers which vocabulary is being used.

@type
The business type. Use the most specific type available (see Type Hierarchy section). Examples: "Dentist", "LegalService", "Restaurant", "LocalBusiness".

name
Your exact business name. Must match your GBP name and your website’s displayed business name identically.

address (of type PostalAddress)
A nested object containing:
"@type": "PostalAddress" (required)
streetAddress — street number and name
addressLocality — city or suburb
addressRegion — state, province, or region
postalCode — postcode or PIN
addressCountry — 2-letter ISO country code (AU, NP, AE for UAE)

telephone
Your business phone number. Use the E.164 international format for maximum machine readability: +61391234567 (no spaces or dashes). Alternatively, use the nationally formatted number that matches your GBP and other citations.

url
Your website URL. Should be the canonical version (https, with or without www, consistent with your website’s canonical URL structure).


Important Optional Properties

These aren’t required by schema.org’s definition, but they’re strongly recommended for local businesses because they power the features that matter most.

geo (GeoCoordinates)
Latitude and longitude of your business location. Critically important for mapping and proximity signals. Format:

"geo": {
  "@type": "GeoCoordinates",
  "latitude": -37.8136,
  "longitude": 144.9631
}

openingHoursSpecification
Structured opening hours using ISO 8601 day names. More reliable than the plain-text openingHours property. See the Complex Schedules section for examples.

image
A URL to your business’s main image (your storefront, interior, or logo). Should be a permanent, direct URL to a hosted image (not a Google Photos URL, which can expire).

priceRange
For consumer-facing businesses (restaurants, salons, hotels). Use $, $$, $$$, or $$$$ — or a string like "NPR 500–1500 per person". Appears as a price chip in some SERP features.

aggregateRating
Your current review average and count, from a review source you control (if you have on-site reviews). Don’t use this to embed your Google review rating — that violates Google’s terms. Only use it if you collect and display reviews on your own website.

"aggregateRating": {
  "@type": "AggregateRating",
  "ratingValue": "4.8",
  "reviewCount": "127"
}

sameAs
URLs of your business’s social profiles and major directory listings. Helps Google confirm entity relationships:

"sameAs": [
  "https://www.facebook.com/yourbusiness",
  "https://www.linkedin.com/company/yourbusiness"
]

areaServed
For service-area businesses: the cities or regions you serve.

"areaServed": ["Melbourne", "Geelong", "Ballarat"]

The LocalBusiness Type Hierarchy

Schema.org’s LocalBusiness type has dozens of specific subtypes. Using the correct subtype gives Google a more precise understanding of what you do — and can unlock subtype-specific rich result features.

Top-level: LocalBusiness
Use when no more specific type applies. Catch-all for unusual business types.

Key subtypes (one level down):

Subtype Use For
FoodEstablishment Restaurants, cafés, bars (parent — use specific types below)
Restaurant Full-service restaurants
CafeOrCoffeeShop Cafés, coffee shops
FastFoodRestaurant Fast food
MedicalBusiness Healthcare (parent — use specific types below)
Dentist Dental clinics
Physician Medical doctors, GPs
Hospital Hospitals
LegalService Law firms (parent)
Attorney Individual lawyers, law firms
Notary Notarial services
FinancialService Financial services (parent)
AccountingService Accountants, CPAs
InsuranceAgency Insurance
HomeAndConstructionBusiness Trades (parent)
Plumber Plumbers
Electrician Electricians
GeneralContractor General contractors
SportsActivityLocation Gyms, studios
HealthClub Gyms, fitness centres
RealEstateAgent Real estate agencies and agents
LodgingBusiness Hotels, B&Bs (parent)
Hotel Hotels
Motel Motels
BedAndBreakfast B&Bs
Store Retail stores (parent)
ClothingStore Clothing retail
ElectronicsStore Electronics retail
AutoRepair Auto repair shops

Multiple @type values:
For a business that fits two types, you can use an array:

"@type": ["Restaurant", "LocalBusiness"]

This is valid but use sparingly — it’s most useful when the secondary type is LocalBusiness as a fallback.


Complete Code Examples

Restaurant

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Restaurant",
  "name": "Himalayan Kitchen",
  "image": "https://himalayankitchen.com/images/restaurant-front.jpg",
  "url": "https://himalayankitchen.com",
  "telephone": "+97714567890",
  "priceRange": "NPR 400-1200",
  "servesCuisine": "Nepali",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "Thamel Marg 45",
    "addressLocality": "Kathmandu",
    "addressRegion": "Bagmati",
    "postalCode": "44600",
    "addressCountry": "NP"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 27.7172,
    "longitude": 85.3240
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
      "opens": "11:00",
      "closes": "22:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Saturday","Sunday"],
      "opens": "10:00",
      "closes": "23:00"
    }
  ],
  "sameAs": [
    "https://www.facebook.com/himalayankitchenktm",
    "https://www.tripadvisor.com/Restaurant_Review-himalayan-kitchen"
  ]
}
</script>

Law Firm

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "LegalService",
  "name": "Sharma & Associates Legal",
  "image": "https://sharmaalegal.com.au/images/office.jpg",
  "url": "https://sharmaalegal.com.au",
  "telephone": "+61391234567",
  "description": "Corporate and commercial law firm serving Melbourne CBD and surrounds since 2008.",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "Level 8, 123 Collins Street",
    "addressLocality": "Melbourne",
    "addressRegion": "VIC",
    "postalCode": "3000",
    "addressCountry": "AU"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": -37.8136,
    "longitude": 144.9634
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
      "opens": "09:00",
      "closes": "17:30"
    }
  ],
  "areaServed": ["Melbourne", "Geelong", "Ballarat"],
  "sameAs": [
    "https://www.linkedin.com/company/sharma-associates-legal"
  ]
}
</script>

Medical Practice (GP Clinic)

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "MedicalClinic",
  "name": "Al Barsha Medical Centre",
  "image": "https://albarshamedical.ae/images/clinic.jpg",
  "url": "https://albarshamedical.ae",
  "telephone": "+97143456789",
  "description": "General practice and specialist consultations in Al Barsha, Dubai. Walk-ins welcome.",
  "medicalSpecialty": "General Practice",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "Al Barsha 1, Sheikh Zayed Road Service Road",
    "addressLocality": "Dubai",
    "addressRegion": "Dubai",
    "postalCode": "000000",
    "addressCountry": "AE"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 25.1123,
    "longitude": 55.1975
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday"],
      "opens": "08:00",
      "closes": "21:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Friday",
      "opens": "14:00",
      "closes": "21:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Saturday","Sunday"],
      "opens": "09:00",
      "closes": "18:00"
    }
  ]
}
</script>

Retail Store

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "ClothingStore",
  "name": "Nepali Threads",
  "image": "https://nepalithreads.com/images/storefront.jpg",
  "url": "https://nepalithreads.com",
  "telephone": "+61291234567",
  "priceRange": "AU$30-AU$300",
  "description": "Handcrafted Nepali clothing, pashminas, and accessories in Sydney's Surry Hills.",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "42 Crown Street",
    "addressLocality": "Surry Hills",
    "addressRegion": "NSW",
    "postalCode": "2010",
    "addressCountry": "AU"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": -33.8866,
    "longitude": 151.2113
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday","Tuesday","Wednesday","Friday"],
      "opens": "10:00",
      "closes": "18:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Thursday",
      "opens": "10:00",
      "closes": "20:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Saturday",
      "opens": "09:00",
      "closes": "17:00"
    }
  ],
  "sameAs": [
    "https://www.instagram.com/nepalithreads",
    "https://www.facebook.com/nepalithreads"
  ]
}
</script>

LocalBusiness Schema Generator

LocalBusiness Schema Generator

Fill in your business details to generate ready-to-paste JSON-LD schema markup.















Handling Multiple Locations

Each location page on your website should have its own separate LocalBusiness schema block referencing that specific location’s details. Never use a single schema block to represent multiple locations.

For a 3-location business:

  • /locations/sydney/ → JSON-LD with Sydney address, phone, hours, and geo coordinates
  • /locations/melbourne/ → JSON-LD with Melbourne address, phone, hours, and geo coordinates
  • /locations/brisbane/ → JSON-LD with Brisbane address, phone, hours, and geo coordinates

Each block should also link to that location’s GBP via a sameAs reference if possible, and have unique image URLs.

The homepage problem:
If your homepage serves all locations, do not include any specific address schema there. Use organisation schema on the homepage instead:

{
  "@type": "Organization",
  "name": "Your Business",
  "url": "https://yourdomain.com",
  "sameAs": ["...", "..."]
}

Then implement location-specific schema only on the location-specific pages. Mixing multi-location data into a single schema block confuses parsers.


OpeningHoursSpecification for Complex Schedules

The openingHoursSpecification property handles all common schedule patterns:

Standard 9–5 Monday–Friday:

"openingHoursSpecification": [{
  "@type": "OpeningHoursSpecification",
  "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
  "opens": "09:00",
  "closes": "17:00"
}]

Split hours (lunch break):

"openingHoursSpecification": [
  {
    "@type": "OpeningHoursSpecification",
    "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
    "opens": "09:00",
    "closes": "12:30"
  },
  {
    "@type": "OpeningHoursSpecification",
    "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
    "opens": "13:30",
    "closes": "17:30"
  }
]

Holiday/special hours (specific date range):

{
  "@type": "OpeningHoursSpecification",
  "opens": "10:00",
  "closes": "14:00",
  "validFrom": "2026-12-25",
  "validThrough": "2026-12-26"
}

24-hour operation:
Use "opens": "00:00" and "closes": "23:59".

Closed on a specific day:
Omit that day from the dayOfWeek array — do not set opens/closes to “00:00” / “00:00” (that reads as midnight to midnight, which validators interpret as closed, but it’s cleaner to simply omit closed days).


GeoCoordinates: Finding and Formatting Lat/Long

Accurate geo coordinates are important — they’re used by Google Maps, Apple Maps, and voice assistants to locate your business precisely on the ground. An incorrect or approximate coordinate can result in map pin placement errors.

Method 1: Google Maps
1. Open Google Maps
2. Search your business address
3. Right-click on the exact location pin
4. The first option in the context menu shows the coordinates (e.g., -33.8688, 151.2093)
5. Click to copy

Method 2: GBP Dashboard
Your GBP listing stores precise coordinates. If you have GBP dashboard access, the coordinates used by Google for your listing are the most authoritative source.

Method 3: latlong.net
Type your address at latlong.net for a clean coordinate lookup.

Format in schema:

"geo": {
  "@type": "GeoCoordinates",
  "latitude": -33.8688,
  "longitude": 151.2093
}

Latitude: negative numbers are southern hemisphere (Australia, southern Nepal), positive are northern hemisphere. Longitude: positive numbers are east of meridian (Australia, Nepal, UAE). Use at least 4 decimal places of precision.


Testing and Validating Your Schema

Tool 1: Google Rich Results Test
search.google.com/test/rich-results

Paste your page URL or your raw JSON-LD code. Google’s validator shows:
- Whether the schema is valid
- What rich result types it qualifies for
- Any errors or warnings

Fix all errors (red) before launching. Warnings (yellow) are generally safe to leave but worth reviewing.

Tool 2: Schema Markup Validator
validator.schema.org

More comprehensive than Google’s tool — checks against the full schema.org specification, not just the subset Google uses for rich results. Good for catching property name typos and type mismatches.

Tool 3: Google Search Console
After deployment, check Search Console → Enhancements for your schema type. Google reports on schema it has detected on your site, with counts of valid items and errors. Takes 1–2 weeks to populate after initial deployment.

Pre-deployment checklist:
1. Paste schema code into Rich Results Test — zero errors
2. Confirm business name in schema matches GBP name exactly
3. Confirm address format in schema matches website contact page exactly
4. Confirm phone number in schema matches GBP phone exactly
5. Test geo coordinates by pasting into Google Maps — verify pin lands on your building


Schema Completeness Checker

Schema Completeness Checker

Check off which properties are implemented in your LocalBusiness schema. See your completeness score and identify gaps.

Schema Completeness
0%

Check off the properties implemented in your schema.


Common Schema Errors and How to Fix Them

Error: Missing required field
Validator says a required property is missing. Fix: add the property with a valid value. For @type, choose a type from schema.org’s hierarchy. For address, ensure all PostalAddress sub-properties are populated.

Error: Invalid property value
A property has an incorrect data type. Most common: latitude or longitude entered as a string (“−37.8136”) instead of a number (−37.8136). Remove the quotation marks.

Error: Unknown property
A property name is misspelled or doesn’t exist in schema.org’s vocabulary. Common misspellings: openingHours_specification, streetaddress, postalcode. Properties are camelCase and case-sensitive.

Error: Incorrect @type for property
Using a property on the wrong schema type. For example, servesCuisine is a property of FoodEstablishment, not LocalBusiness. If you use it, your @type must be Restaurant or another FoodEstablishment subtype.

Warning: Missing recommended field
Not an error — won’t break your schema — but Google recommends adding the field. Common: image, description, priceRange. Add these for richer Knowledge Panel output.

Error: Value too long or contains HTML
The description property should be plain text, no HTML tags. Maximum around 5,000 characters (but keep it under 500 for practical purposes — verbose descriptions aren’t well-displayed in rich results).


FAQ

Q: Do I need schema if my GBP is fully optimised?
A: Yes. GBP and schema serve different purposes. GBP tells Google about your business in Google’s own ecosystem. Schema tells Google about your website’s connection to that business. Together, they create a stronger, more consistent entity signal. Either alone is weaker than both together.

Q: Can schema markup hurt my rankings if implemented incorrectly?
A: Incorrect schema doesn’t typically cause penalties. It’s either ignored (unrecognised properties), flagged as an error in Search Console (invalid structure), or overridden by Google’s own data (if your schema conflicts with well-established facts). The main risk is implementing schema that makes false claims — claiming you have reviews you don’t have, or using an incorrect business type — which Google can penalise as deceptive structured data.

Q: Should I put the schema block in <head> or <body>?
A: Either works — Google parses JSON-LD in both. Convention is <head> for organisation-level schema and <body> (end, before </body>) for page-specific schema. For CMS implementations, use whatever location your plugin or theme supports.

Q: How do I implement schema in WordPress?
A: The Yoast SEO, RankMath, or Schema Pro plugins all support LocalBusiness schema with GUI interfaces — no manual JSON-LD required. For manual control, add a Custom HTML block to your page template or use a function in functions.php to inject the JSON-LD block into <head>.

Q: How do I implement schema in Shopify?
A: Add the JSON-LD block to your theme.liquid file inside the <head> section. For product pages, use Liquid variables to make it dynamic. For the store’s LocalBusiness schema, a static JSON-LD block in theme.liquid works fine.

Q: My business operates in multiple countries. Should I use one schema block or separate ones?
A: One schema block per location page, each with the correct addressCountry for that location. The schema on your Australian location page should have "addressCountry": "AU". Your UAE location page should have "addressCountry": "AE". Never mix addresses from multiple countries into one schema block.

Q: How long does it take for schema to affect search results?
A: Knowledge Panel updates from schema typically appear within 4–8 weeks. Rich result features (star ratings, hours in SERP) can appear as quickly as 1–2 weeks after Googlebot crawls the updated page.


Schema in the Context of a Complete Local SEO Strategy

Schema markup is one layer of a multi-layer local SEO system:

  1. Google Business Profile — the primary local presence signal
  2. NAP consistency — consistent business data across citations
  3. On-page local content — location pages targeting explicit geo keywords
  4. LocalBusiness schema — structured data reinforcing your website’s connection to your physical business
  5. Reviews — social proof and ranking signal via GBP
  6. Local backlinks — authority signals from local and industry sources

Schema works best when all other layers are in place. A perfectly implemented JSON-LD block on a website with a poorly optimised GBP or inconsistent NAP will produce modest results. The same schema on a clean local SEO foundation produces measurable, compounding results.

Implement it correctly once. Keep it updated when your hours, address, or phone change. Validate it annually. Move on to the layers that have more ongoing maintenance requirements — reviews, content, and local link building.


Get Your Schema Implemented and Validated

We run local SEO programmes for businesses across Kathmandu and beyond — GBP, schema, review strategy, local links. → Request a Local SEO Audit


Written by the Ignited Nepal SEO team. ignitednepal.com

NR

Article by

Niraj Raut

Head of Search at Ignited Nepal. Drove 340% organic traffic growth for EzyDog (Australia), 4× revenue for The Turf Man (Australia), and 120% month-on-month traffic growth for ThemeGrill (Nepal). Keynote speaker at WordCamp Nepal 2023 and verified WordPress.org open-source contributor.