Local Business schema is the most misunderstood structured data in SEO. Every “ultimate guide” shows you the same five lines of JSON-LD for a single coffee shop — and then completely abandons you the moment you have two locations, a franchise, or a service-area business that serves Plano AND Frisco AND McKinney.

Get it right, and your locations show up in Google Maps, Apple Maps, voice search, and the local pack with rich information panels. Get it wrong, and Google quietly excludes your business from the very searches that drive walk-in revenue.

This guide is the exact JSON-LD framework we deploy for multi-location and franchise clients in Dallas–Fort Worth — with the markup patterns, required properties, and 6 fatal validation errors that silently kill local visibility.

TL;DR · Quick Summary

JSON-LD LocalBusiness schema tells Google the structured facts about your business: name, address, phone, hours, geo-coordinates, service area, accepted payments, parent organization. For single-location brands, one schema block suffices. For multi-location brands, each location needs its own page with its own schema, plus an Organization or LocalBusiness parent for brand consistency. This guide covers the required properties, two implementation patterns for multi-location, and the validation errors that exclude you from the local pack.

Visual summary of Local Business Json Ld Schema TECHNICAL SEO Local Business Json Ld Schema Key dimensions of this topic: 1 Audit baseline 2 Fix priority 3 Monitor results mantasauk.com ยท 2026

What Schema.org LocalBusiness Actually Does

Schema.org is a vocabulary of types that describe entities on the web. LocalBusiness is the type for physical businesses with a location customers can visit. When you mark up a page with LocalBusiness JSON-LD, you’re telling Google:

  • This page represents a real business at a specific physical address.
  • Here are the verifiable facts: name, phone, hours, geo-coordinates.
  • Here’s the relationship to a parent brand (if any).
  • Here are the services offered and the geographic area served.

Google uses this data to power Google Maps results, the local pack (those 3 businesses with a map at the top of local searches), Knowledge Graph entries, and voice search responses. Without LocalBusiness schema, you’re relying entirely on Google’s ability to infer this information from your website’s text — which is unreliable, especially for multi-location brands.

The 8 Required Properties (Plus 6 You Should Always Include)

Google’s technical documentation lists certain properties as “required” for LocalBusiness rich results eligibility. In practice, these 8 are non-negotiable:

PropertyWhy it matters
@typeThe specific business subtype (Restaurant, Dentist, etc.) — affects which rich features show.
nameExactly as it appears on your storefront and Google Business Profile.
addressFull PostalAddress object with street, city, state, postal code, country.
telephoneE.164 international format: +13462448617.
urlThe canonical URL of the page being marked up.
imageLogo or storefront image, 1200×630px minimum.
priceRange$, $$, $$$, $$$$ format. Required for restaurant-class businesses.
openingHoursSpecificationDetailed hours per day of week.

And these 6 are strongly recommended — they unlock additional rich features and improve confidence scores:

PropertyUnlocks
geo (lat/lng)Map pin accuracy, distance-based rankings.
sameAs (social URLs)Knowledge Graph entity linking.
areaServedFor service-area businesses (mobile, no storefront).
aggregateRatingStar ratings in search results (only if visible on-page).
reviewIndividual reviews shown in rich snippets.
parentOrganizationFor multi-location: ties this location to the brand.

A Complete Single-Location JSON-LD Example

Here’s the markup we use for single-location clients. Drop this in the <head> or near the end of <body> on your homepage and your “Contact” page.

JSON-LD — single location
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Dentist",
  "@id": "https://example.com/#business",
  "name": "Plano Family Dental",
  "image": "https://example.com/storefront.jpg",
  "url": "https://example.com",
  "telephone": "+19725550100",
  "priceRange": "$$",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "1234 Park Blvd",
    "addressLocality": "Plano",
    "addressRegion": "TX",
    "postalCode": "75093",
    "addressCountry": "US"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 33.0198,
    "longitude": -96.6989
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "08:00",
      "closes": "17:00"
    }
  ],
  "sameAs": [
    "https://www.facebook.com/planofamilydental",
    "https://www.instagram.com/planofamilydental"
  ]
}
</script>

The @type deserves special attention. Choose the most specific subtype that applies to your business:

  • Restaurant, Cafe, Bakery — food and beverage
  • Dentist, MedicalClinic, Physician — healthcare
  • AutoRepair, Plumber, Electrician — home services
  • AttorneyLaw, AccountingService, FinancialService — professional services
  • Store, ClothingStore, FurnitureStore — retail
  • HealthClub, SportsActivityLocation — fitness
  • Otherwise, default to LocalBusiness
Pro Tip — Use @id for Entity Reconciliation

The @id property gives your business a stable, machine-readable identifier. Use the URL of the page plus a fragment like #business or #organization. This lets you reference the same entity across multiple schema blocks (e.g., your Organization schema and your LocalBusiness schema) so Google understands they describe the same thing.

Multi-Location Pattern 1: One Page Per Location (Recommended)

For brands with 2–50 locations, the cleanest pattern is one dedicated URL per location, each with its own LocalBusiness schema. URL structure looks like:

URL pattern
example.com/locations/plano/
example.com/locations/frisco/
example.com/locations/mckinney/

Each location page contains a full LocalBusiness schema as shown above, PLUS a reference to a parent Organization. The parent Organization is declared once (on the homepage or an “about” page) and referenced from each location.

Parent Organization (on homepage)
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "@id": "https://example.com/#organization",
  "name": "Smile Dental Group",
  "url": "https://example.com",
  "logo": "https://example.com/logo.png",
  "sameAs": ["https://facebook.com/smiledentalgroup"]
}
</script>

And on each location page, link back:

Location page (e.g., /locations/plano/)
"@type": "Dentist",
"@id": "https://example.com/locations/plano/#business",
"name": "Smile Dental Group — Plano",
"parentOrganization": {
  "@id": "https://example.com/#organization"
},
"address": { /* Plano-specific address */ },
"geo": { /* Plano-specific coordinates */ },
"telephone": "+19725550100"

Multi-Location Pattern 2: Single Page with Array of Branches

For 50+ locations where individual location pages would be impractical, you can embed all locations on a single “Locations” page using an array of branch references:

Organization with branches array
{
  "@type": "Organization",
  "name": "Quick Wash Car Care",
  "url": "https://example.com",
  "subOrganization": [
    {
      "@type": "LocalBusiness",
      "@id": "https://example.com/locations/plano-park/#business",
      "name": "Quick Wash — Plano Park",
      "address": { /* ... */ },
      "geo": { /* ... */ },
      "telephone": "+19725550101"
    },
    {
      "@type": "LocalBusiness",
      "@id": "https://example.com/locations/frisco-main/#business",
      "name": "Quick Wash — Frisco Main",
      "address": { /* ... */ },
      "geo": { /* ... */ },
      "telephone": "+19725550102"
    }
  ]
}

This pattern is more compact but generally produces weaker per-location rankings because Google can’t treat each branch as having a dedicated page. For franchise SEO and multi-location brands aiming to rank in each city’s local pack, Pattern 1 (one page per location) outperforms Pattern 2 by 30–60% in our testing across DFW clients.

Service-Area Businesses (Mobile Plumbers, Roofers, etc.)

If you serve customers at their location rather than yours (think: mobile car detailing, roof repair, locksmith), you’re a “service-area business” in Google’s terminology. Use areaServed instead of relying solely on address:

Service-area business schema
{
  "@type": "Plumber",
  "name": "DFW Emergency Plumbing",
  "telephone": "+19725550199",
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Dallas",
    "addressRegion": "TX",
    "addressCountry": "US"
  },
  "areaServed": [
    {
      "@type": "City",
      "name": "Plano"
    },
    {
      "@type": "City",
      "name": "Frisco"
    },
    {
      "@type": "City",
      "name": "McKinney"
    }
  ]
}

Service-area businesses can omit streetAddress if they don’t want to publish their dispatch location publicly. Google still accepts the schema.

The 6 Fatal Validation Errors That Hide You from Local Pack

  • 1. Phone numbers in the wrong format. Google rejects dashes, parens, and dot-separators. Use E.164: +13462448617 not (346) 244-8617 or 346.244.8617.
  • 2. NAP mismatch between schema and Google Business Profile. Even tiny differences (Ave vs Avenue, Suite 100 vs Ste 100) trigger trust penalties. Match GBP exactly, character-for-character.
  • 3. Missing or wrong @type. Using generic LocalBusiness when a more specific type exists (Dentist, Plumber, Restaurant). Google can’t show rich features without the specific type.
  • 4. aggregateRating without visible reviews on the page. Google’s rich results guidelines require the rating to be visible to users. Marking up invisible ratings is a manual action risk.
  • 5. Coordinates that don’t match the address. Geocode your address (Google’s Geocoding API or a tool like LatLong.net) and use precise lat/lng. Mismatched coordinates trigger silent suppression from local pack.
  • 6. Multi-location with identical @id. Every location must have a unique @id URL. Copy-pasting schema between location pages and forgetting to update @id tells Google all locations are the same entity.
Always Validate Before Deploying

Use Google’s Rich Results Test (search.google.com/test/rich-results) on every URL with LocalBusiness schema. It catches syntax errors AND eligibility issues. Schema that “validates” in a generic JSON-LD validator may still fail Google’s specific requirements for rich features. We cover this validation workflow in more depth in how broken schema markup hides your business details from search engines.

Real Case: 14-Location Dental Group Captures 89% Local Pack Visibility

In January 2026 we onboarded a 14-location dental group with offices across DFW. Their existing schema: a single LocalBusiness block on the homepage covering only the original Dallas location. The other 13 locations had no structured data and weren’t appearing in local pack searches for their respective cities.

What we built:

  • One Organization schema on the homepage (parent entity).
  • 14 dedicated location pages (/locations/plano/, /locations/frisco/, etc.) following Pattern 1.
  • Each location page: full LocalBusiness schema with Dentist subtype, complete NAP, geo coordinates, hours, parent reference, sameAs (links to per-location GBP profiles).
  • Synchronized NAP across schema, GBP profiles, and on-page content for every location.
  • Internal links from the main “Locations” index page to each location page using descriptive anchor text.
Result, 4 months later “Local pack visibility rose from 11% (1 of 14 locations) to 89% (12.5 of 14 locations). Direction requests on Google Maps up 340%. Patient inquiry calls to non-Dallas locations rose from 22/month to 187/month.”

Special Case: Franchises with Independent Owners

Franchise businesses have a unique schema challenge: each location is independently owned and operated, but customers perceive them as a single brand. Use this pattern:

  • Each franchisee’s site: Full LocalBusiness schema with that location’s NAP. parentOrganization references the franchisor’s schema URL.
  • Franchisor’s corporate site: Organization schema, plus a franchisee array listing all franchisees with their basic info.
  • Avoid: Duplicating franchisee schema on the corporate site — this causes entity disambiguation issues.

For deep franchise SEO strategy (which extends well beyond schema), see our service breakdown of franchise and multi-location SEO services.

The 3-Step Validation Workflow Before Every Deploy

  • Step 1: Paste your URL into search.google.com/test/rich-results. Verify the LocalBusiness block is detected and shows no errors or warnings.
  • Step 2: Run through validator.schema.org for syntax validation. Catches JSON errors that Google’s test sometimes misses.
  • Step 3: 7–14 days post-deploy, check Search Console → Enhancements → Local business for any flagged issues across your indexed location pages.

When to Update Your LocalBusiness Schema

Schema is not “set and forget.” Update it whenever:

  • Hours change (holidays, seasonal, permanent)
  • You open or close a location
  • NAP changes (phone, address)
  • You add a new service worth marking up
  • You start accepting new payment types
  • Your reviews/ratings change visibly on the page

For multi-location brands changing addresses or consolidating locations, also implement proper 301 redirects from old location URLs to new ones. The 301 redirect playbook applies to location migrations too.

Frequently Asked Questions

Do I need LocalBusiness schema if I already have a Google Business Profile?

Yes — they serve different purposes. Google Business Profile data is what Google uses for Maps and local pack on its own properties. LocalBusiness schema is what Google uses to verify and reinforce that data, AND what other services (Bing, Apple Maps, voice assistants, Knowledge Graph) read to build their own results. Brands with both consistently outperform brands with only one in local search visibility.

Can I put LocalBusiness schema on every page of my site?

You can, but you shouldn’t. Put the full LocalBusiness schema on your homepage and your dedicated location page(s) only. For other pages, use a simpler Organization schema reference ("organization": {"@id": "https://example.com/#organization"}) to maintain entity continuity without spam. Excessive duplication of LocalBusiness markup can dilute the strongest pages’ signals.

How long until LocalBusiness schema affects local rankings?

Initial validation and indexing happen within 7–14 days. Visible local pack improvements typically appear in weeks 4–12 as Google’s local algorithms re-evaluate your entity. Brands also need to maintain NAP consistency across schema, GBP, citations, and on-page content — mismatches anywhere slow the lift significantly.

What&rsquo;s the difference between LocalBusiness and Organization schema?

Organization is the broad parent type for any organized entity (companies, schools, governments, etc.). LocalBusiness is a subtype specifically for entities with a physical customer-serving location. A brand uses Organization for its corporate entity and LocalBusiness for each customer-facing location. They’re complementary, not alternatives — multi-location brands need both.

Can I mark up aggregated reviews from Google reviews on my site?

Only if those reviews are actually visible to users on the page being marked up. Google’s policy explicitly forbids aggregating reviews from off-site sources without displaying them. The safe pattern: embed actual review content (text + reviewer name) on your page using a reviews widget, then mark up exactly the reviews shown.

Need multi-location schema deployed correctly?

We’ll audit your existing structured data, build per-location schema for every storefront, sync your Google Business Profiles, and validate everything against Rich Results Test — typically within 10 business days.

Get a Local SEO Audit Explore Multi-Location SEO Services