Orkkid
Back to Blog

Schema Markup for Local Businesses: A Practical 2026 Guide

Schema Markup for Local Businesses: A Practical 2026 Guide

Local business schema markup tells search engines and AI exactly what you do, where, and who you serve. A practical 2026 guide with copy-paste JSON-LD.

Local business schema markup is structured data (written in JSON-LD) that tells search engines and AI exactly what your business is, where it operates, how to contact you, and what you offer. For a plumber, dentist, electrician, or any service business, it turns prose on a page into machine-readable facts, which is what helps you earn rich results in Google and accurate citations in AI answers.

Without it, search engines and AI engines have to guess from your copy. With it, they pull confirmed facts straight from your markup. This guide is the practical version: the properties that matter, a copy-paste example, the sub-types, and how to validate it.

For the broader picture, see our SEO services and the glossary.


What LocalBusiness schema is

LocalBusiness is a Schema.org type for any business that serves customers at a physical location or within a defined geographic area. It sits under the broader Organization type and adds local-specific properties: an address, opening hours, geo-coordinates, and an area served.

The rule of thumb: if you have a storefront, an office, or a service area, use LocalBusiness. If you are a fully remote brand with no geographic anchor, plain Organization is enough.

You deliver it as a JSON-LD block in the <head> or body of your page. Google recommends placing it on your homepage at minimum, and on your contact or location pages where it is most relevant.


The key properties that matter

You do not need every property Schema.org allows. These are the ones search engines and AI actually use to understand and rank a local business:

  • name - your business name, exactly as it appears on your site and Google Business Profile.
  • address - a structured PostalAddress with street, suburb, state, postcode, and country. Keep it consistent with your other listings (NAP consistency matters).
  • geo - latitude and longitude as a GeoCoordinates object. This anchors you on the map and helps with "near me" relevance.
  • openingHoursSpecification - your trading hours, structured by day. This is what powers the "Open now" and hours panel.
  • telephone - your contact number in international format (e.g. +61 3 9000 0000).
  • areaServed - the suburbs, cities, or regions you cover. Essential for service businesses that travel to clients rather than receiving them at a location.
  • aggregateRating - your average star rating and review count. Only include this if the reviews are real and verifiable (see the warning below).

Get these right and you have covered roughly 90% of what matters. Consistency with your Google Business Profile is more important than padding the markup with extra fields.


A copy-paste JSON-LD example

Here is a complete, valid LocalBusiness block for an Australian service business. Replace the placeholder values with your own, then validate before you ship.

{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "@id": "https://example.com.au/#business",
  "name": "Northside Plumbing",
  "url": "https://example.com.au",
  "image": "https://example.com.au/storefront.jpg",
  "logo": "https://example.com.au/logo.png",
  "description": "Licensed plumbers servicing Melbourne's northern suburbs for blocked drains, hot water, and emergency repairs.",
  "telephone": "+61390000000",
  "email": "hello@example.com.au",
  "priceRange": "$$",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "12 Sydney Road",
    "addressLocality": "Brunswick",
    "addressRegion": "VIC",
    "postalCode": "3056",
    "addressCountry": "AU"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": -37.7670,
    "longitude": 144.9600
  },
  "areaServed": [
    { "@type": "City", "name": "Brunswick" },
    { "@type": "City", "name": "Coburg" },
    { "@type": "City", "name": "Preston" }
  ],
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "07:00",
      "closes": "17:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Saturday",
      "opens": "08:00",
      "closes": "12:00"
    }
  ],
  "sameAs": [
    "https://www.facebook.com/northsideplumbing",
    "https://www.instagram.com/northsideplumbing"
  ]
}

A few notes on this block:

  • The @id gives the business a stable URI you can reference from other schemas (such as a Service or Review block) so they all point to the same entity.
  • addressCountry uses the two-letter ISO code (AU), which is the safest format.
  • areaServed is an array of City objects here, which suits a mobile service business. A fixed-location business can lean more on address and geo.
  • I have deliberately left out aggregateRating. Add it only when you have real reviews to back it (covered next).

Sub-types: be as specific as you can

Schema.org provides hundreds of more specific sub-types under LocalBusiness. Using the most specific one that fits your business gives search engines a clearer signal than the generic parent type.

Common examples for service businesses:

  • Plumber - for plumbing trades.
  • Electrician - for electrical contractors.
  • Dentist - for dental practices (sits under MedicalBusiness).
  • HVACBusiness - for heating and cooling.
  • Locksmith, RoofingContractor, HousePainter - and many more across the trades.

You simply swap the @type:

{
  "@context": "https://schema.org",
  "@type": "Plumber",
  "name": "Northside Plumbing"
}

If no specific sub-type matches your niche, stay on LocalBusiness. Do not invent a type that is not in the vocabulary, as validators will reject it.


Service and FAQ schema, briefly

Two companion types pair well with LocalBusiness.

Service declares each thing you do. It is worth adding on individual service pages so search engines and AI understand the specific offering, who provides it, and where:

{
  "@context": "https://schema.org",
  "@type": "Service",
  "name": "Emergency Drain Clearing",
  "provider": { "@id": "https://example.com.au/#business" },
  "areaServed": { "@type": "City", "name": "Brunswick" },
  "serviceType": "Blocked drain repair"
}

Note the provider references the same @id from your LocalBusiness block, so the two entities are linked.

FAQPage marks up genuine questions and answers on a page. A word of caution: Google restricted FAQ rich results to authoritative government and health sites in 2023, so most service businesses no longer earn the rich result. It still helps AI engines parse FAQ content, so use it on a couple of your strongest pages where the answers are real and substantive, not on every page out of habit.

For the full priority order across schema types, our AEO schema markup guide goes deeper.


How to add and validate it

There are three ways to add schema, ranked by how reliably crawlers and AI engines will see it:

  1. Server-rendered JSON-LD (best) - output the <script type="application/ld+json"> block in your page's HTML so it is present on first load. Every crawler and AI engine sees it.
  2. A reusable component - wrap the same pattern in a component (for example in a Next.js or WordPress template) so it renders consistently across pages.
  3. Tag manager (avoid for AI) - Google Tag Manager can inject schema, but AI crawlers that read static HTML rather than executing JavaScript will often miss it.

Once it is live, validate it with two free tools:

Run both on every page template at least once a quarter, and again whenever the underlying business details change.


Common mistakes to avoid

A handful of errors account for most broken local schema:

  • Inconsistent NAP. Your name, address, and phone in the schema must match your Google Business Profile and citations exactly. Mismatches dilute trust.
  • Fabricated aggregateRating. Never invent star ratings or review counts. Google issues manual penalties for fake review markup, and recovery can take months. If your real review count is in single digits, omit aggregateRating until you have a meaningful sample.
  • Wrong or missing @type. Using a sub-type that does not exist in Schema.org, or defaulting to the generic Thing, wastes the signal.
  • Schema that contradicts the page. Opening hours or an address in your markup that differs from the visible content on the page is a quality problem.
  • Duplicate blocks. Emitting two LocalBusiness blocks per page (one inline, one from a plugin) creates ambiguous markup that validators flag.
  • Markup with no on-page support. Schema should describe content that genuinely appears on the page, not facts that exist only in the JSON-LD.

Schema works best alongside the rest of your local foundation. For everything that drives map and organic visibility, see our guide to local SEO ranking factors for service businesses.


Frequently Asked Questions

Does local business schema markup improve my rankings directly?

Not directly. Schema is a clarification signal, not a ranking factor. It helps search engines understand your business and earn rich results, and it helps AI engines cite you accurately, all of which produce indirect visibility gains.

Do I need schema on every page?

No. Put your core LocalBusiness block on your homepage and contact or location pages, and add Service schema on individual service pages. Marking up every page with the full business block is unnecessary and can create duplicate-entity issues.

Can I add an aggregateRating if I only have a few reviews?

You can, but you should not until the sample is meaningful and the reviews are real and verifiable. Fabricated or thin ratings risk a Google penalty. If you have fewer than about ten genuine reviews, leave aggregateRating out for now.

What is the difference between LocalBusiness and Organization schema?

Organization describes any business or brand. LocalBusiness is a sub-type for businesses tied to a physical location or service area, and it adds local properties such as address, geo, openingHoursSpecification, and areaServed. Use LocalBusiness if you serve customers in a specific place.


The bottom line

Local business schema markup is one of the highest-leverage, lowest-cost technical SEO jobs you can do. Pick the most specific type that fits your business, fill in the properties that matter (name, address, geo, hours, phone, area served), keep it consistent with your Google Business Profile, and validate before you ship. Add Service and a focused FAQPage block where they genuinely apply, and never fake a rating.

If you would like us to check your current structured data and tell you exactly what to fix, grab a free website audit. We will review your schema, your local signals, and the on-page work that turns markup into rankings and citations.

Ned Mehic
Written by

Ned Mehic

Founder, Orkkid · SEO & AEO Specialist

Ned has spent 10+ years building and ranking websites for service businesses, with an MSc in Information Systems Management and Google Analytics and Search Console certifications. He founded Orkkid to help Australian trades and clinics get found on Google and recommended by AI.

More about Ned →
    Schema Markup for Local Businesses: A Practical 2026 Guide | Orkkid Blog