General

Schema Markup Types for Local Businesses: Full Guide

July 31, 2026
Schema Markup Types for Local Businesses: Full Guide

Every local business should publish at minimum a LocalBusiness structured data block using the most specific available subtype, paired with PostalAddress, telephone, openingHoursSpecification, and a stable @id. The highest-ROI optional types are AggregateRating, FAQPage, Service, Product/Offer, and Event. Two operational rules override everything else:

Schema is the machine-readable backbone of your local identity. It does not directly move your ranking, but it reduces entity ambiguity, raises your eligibility for rich results, and increases the probability that AI engines like ChatGPT and Perplexity cite your business accurately. For a deeper look at how structured data feeds AI recommendations, the Trystellor guide on AI search and local discovery is worth reading alongside this one.


Table of Contents

Which schema markup types should local businesses prioritize?

Think of this as a build-in-order list. Get the foundation right before adding the optional layers.

Priority 1 — LocalBusiness core block (do this first) Every location page needs a LocalBusiness block with the most specific subtype available. A dental office uses Dentist, not LocalBusiness. A plumbing company uses Plumber. A restaurant uses Restaurant. Add PostalAddress (with streetAddress, addressLocality, postalCode, addressCountry: "US"), telephone with the +1 country code, url, and a stable @id. This is your foundation.

Plumber checking service schedule on tablet near van

Priority 2 — Organization block sitewide Place one Organization block in your site-wide header or footer. Link it to your LocalBusiness blocks via parentOrganization. This tells Google your locations belong to one brand entity.

Priority 3 — openingHoursSpecification and geo Add machine-readable hours in hh:mm:ss format and latitude/longitude coordinates to at least five decimal places. Both properties feed the local pack and knowledge panel directly.

Priority 4 — AggregateRating and Review Add these only when real customer reviews are visible on the marked-up page. Never fabricate review data.

Priority 5 — FAQPage and Service FAQPage markup can earn featured snippets. Service schema clarifies your offering to Google and AI engines. Both are low-effort additions once your core block is clean.

Priority 6 — Product/Offer and Event For storefronts selling physical goods, Product and Offer markup surfaces pricing in search. Event schema applies to time-limited promotions, classes, or appointments.

US-specific formatting note: Use addressRegion for the two-letter state abbreviation (e.g., "TX"), postalCode for the five-digit ZIP, and addressCountry: "US". Telephone must follow E.164 format: "+12125551234". Full JSON-LD examples appear in the implementation section below.


How do you choose the right LocalBusiness subtype?

The schema.org LocalBusiness type has more than 100 subtypes. Picking the most specific one is not a cosmetic choice. It unlocks subtype-specific properties that generic LocalBusiness simply cannot use.

Empty dental treatment room with dental chair and tools

What you gain by going specific

A Restaurant block can include servesCuisine, menu, hasMap, and acceptsReservations — properties that feed Google’s restaurant knowledge panel and reservation integrations. A Dentist block can carry medicalSpecialty. A LegalService block signals attorney-specific context to AI engines parsing your page. None of these properties are available on a plain LocalBusiness block.

Going generic means you are handing Google a vague signal and hoping it fills in the gaps. It usually does not, at least not accurately.

Generic vs. specific: what you actually lose

The rule is simple: search schema.org for your business category. If a subtype exists, use it.

Multi-location and service-area rules

For businesses with multiple locations, publish one Organization block sitewide and one LocalBusiness block per location page. Link them with parentOrganization pointing to the Organization @id. Each location gets its own unique @id — typically the canonical URL of that location’s page.

Service-area businesses (plumbers, HVAC companies, cleaners) should omit streetAddress entirely and use areaServed instead, listing the cities, counties, or states they serve. Including a private or residential address when customers cannot visit the location confuses Google’s entity model and can hurt local pack behavior.

Pro Tip: Use your canonical homepage URL as the @id for your Organization block, then use each location page’s canonical URL as the @id for its LocalBusiness block. A stable, consistent @id across LocalBusiness, BreadcrumbList, and Article schema stitches your entire site into one entity graph that both Googlebot and AI crawlers can follow.

For industry-specific subtype guidance, the Trystellor post on SEO for plumbers walks through the Plumber subtype in detail, and the med spa SEO guide covers medical subtype properties.


What properties does Google actually require?

Google’s required and recommended properties for LocalBusiness structured data are documented in Google Search Central. Here is what matters in practice.

Required properties

Pro Tip: NAP consistency is not just about matching your website. Every character in your name, streetAddress, and telephone must match your Google Business Profile exactly — including “LLC,” “Inc.,” suite numbers, and phone formatting. A mismatch between your JSON-LD and your GBP is one of the most common reasons businesses lose rich result eligibility.

Schema is not a ranking signal. It functions as a trust-and-clarity mechanism that stabilizes entity signals and improves eligibility for rich results and AI citations. Local pack ranking is still primarily driven by GBP completeness, proximity, and review volume. Schema reduces ambiguity and increases the accuracy of AI citations when it is consistent.


Which optional schema types give local businesses the best return?

Once your core LocalBusiness block is clean and validated, these five types deliver the most visible impact for the least implementation effort.

Schema Type Primary Benefit When to Use Key Caveat
AggregateRating / Review Star ratings in search snippets Only when real reviews are visible on the page Never fabricate review data; Google will penalize
FAQPage Featured snippet eligibility Q&A content already on the page Do not mark up hidden or auto-generated Q&A
Service Clarifies offering to Google and AI Service detail pages Keep service names consistent with GBP categories
Product / Offer Price and availability in results Storefronts with purchasable items Requires accurate, up-to-date pricing
Event Time-based rich results Classes, promotions, appointments Must include startDate, endDate, and location

AggregateRating and Review

This is the type most local businesses want first, and the one most commonly misused. The rule is absolute: only mark up reviews that are visible on the same page as the markup. If your reviews live on Google or Yelp and are not rendered on your page, you cannot mark them up. When implemented correctly, star ratings appear directly in the search snippet, which tends to increase click-through rates meaningfully.

The JSON-LD pattern looks like this conceptually: nest an aggregateRating object inside your LocalBusiness block, include ratingValue, reviewCount, and bestRating. Every number must reflect what is actually displayed on the page.

FAQPage

FAQPage markup is one of the fastest ways to earn a featured snippet for a question your customers are already asking. Mark up only the Q&A pairs that are rendered as visible text on the page. A plumbing company’s service page with a visible “How much does a water heater replacement cost?” section is a legitimate candidate. A hidden accordion that only opens on click is a gray area; a completely invisible Q&A block is not eligible.

Service and Product/Offer

Service schema is particularly useful for home service businesses because it signals to AI engines exactly what you do and where. A roofing company can list Roof Repair, Roof Replacement, and Gutter Installation as separate Service entities, each linked back to the parent LocalBusiness block. Product and Offer schema applies when you sell physical goods with a defined price and availability status.


How do you add JSON-LD to your pages and validate it?

JSON-LD is the format Google recommends for structured data. Place it inside a <script type="application/ld+json"> tag in either the <head> or <body> of your page. The <head> is conventional and slightly easier for crawlers to find, but either location works.

Minimal LocalBusiness block

{
  "@context": "https://schema.org",
  "@type": "Plumber",
  "@id": "https://example.com/locations/austin/",
  "name": "Acme Plumbing LLC",
  "telephone": "+15125551234",
  "url": "https://example.com/locations/austin/",
  "image": "https://example.com/images/acme-plumbing.jpg",
  "priceRange": "$$",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "123 Main St",
    "addressLocality": "Austin",
    "addressRegion": "TX",
    "postalCode": "78701",
    "addressCountry": "US"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 30.26715,
    "longitude": -97.74306
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
      "opens": "08:00:00",
      "closes": "18:00:00"
    }
  ]
}

LocalBusiness with AggregateRating

{
  "@context": "https://schema.org",
  "@type": "Plumber",
  "@id": "https://example.com/locations/austin/",
  "name": "Acme Plumbing LLC",
  "telephone": "+15125551234",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "123 Main St",
    "addressLocality": "Austin",
    "addressRegion": "TX",
    "postalCode": "78701",
    "addressCountry": "US"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.8",
    "reviewCount": "127",
    "bestRating": "5"
  }
}

Only include aggregateRating when those 127 reviews and the 4.8 rating are displayed as visible text on the page.

FAQPage block

{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "How much does a water heater replacement cost in Austin?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Water heater replacement in Austin typically costs between $800 and $1,500 including parts and labor, depending on tank size and unit type."
      }
    }
  ]
}

Validation checklist

  1. Google Rich Results Test — paste your page URL or code snippet at search.google.com/test/rich-results. Confirms whether Google can parse your markup and whether it qualifies for rich results.
  2. Schema Markup Validator — run at validator.schema.org for a broader property-level check against the schema.org specification.
  3. Google Search Console — check the “Enhancements” section for structured data errors and warnings across your entire site.
  4. GBP manual audit — open your Google Business Profile and compare name, address, and phone character-by-character against your JSON-LD.

For multi-location sites, validate one canonical location page fully, then sample-test three to five additional location pages. If you are running a CI pipeline, add a step that posts your JSON-LD to the Schema Markup Validator API on every deploy so regressions surface before they reach production.

Pro Tip: Add a short comment at the top of each JSON-LD block with a version date — for example, // Updated: 2026-03-15. When hours change or a new location goes live, you can trace exactly which deploy introduced the change and compare against your GBP audit log.

For a full implementation walkthrough with per-location examples, the Trystellor guide on LocalBusiness schema examples covers the complete JSON-LD patterns for home service providers.


What schema mistakes actually prevent rich results?

Most structured data failures come down to a short list of repeatable errors. Here is what breaks results and how to fix each one.

15-minute debug checklist

  1. Run the page through the Google Rich Results Test. Note every error and warning.
  2. Open Google Search Console and check the Enhancements report for the affected URL type.
  3. Compare every JSON-LD value against what is visible on the page. If a value is in the markup but not on the page, remove it or add it to the page.
  4. Open your GBP and compare name, address, and phone against the JSON-LD line by line.
  5. Use URL Inspection in Search Console to request a re-crawl after fixes are deployed.

How do you keep local schema accurate over time?

Schema is not a one-time publish. Outdated hours or a changed phone number in your JSON-LD that conflicts with your GBP actively undermines your entity-authority signals. Build a maintenance rhythm from the start.

Cadence Task Owner
Weekly Compare GBP hours and phone against live JSON-LD on all location pages SEO or site owner
Weekly Check Google Search Console Enhancements for new errors SEO
Monthly Full sitewide schema audit: validate all location pages, check @id consistency, confirm sameAs links are live SEO or developer
Monthly Review AggregateRating counts against on-page review counts Content or SEO
Trigger: hours change Update openingHoursSpecification and GBP simultaneously Site owner
Trigger: new location Create unique LocalBusiness block with new @id, address, telephone; add to Organization’s department or parentOrganization chain Developer
Trigger: phone number change Update telephone in JSON-LD, GBP, and all on-page NAP mentions Site owner

Automation options

If you are running a modern CMS or a headless stack, add a CI job that validates JSON-LD on every deploy. The Schema Markup Validator has an API endpoint you can call programmatically. Pair that with a scheduled weekly crawl using a structured-data-aware crawler and you will catch drift before Google does.

For teams managing ten or more locations, the manual audit cycle becomes the bottleneck. A managed platform handles the weekly GBP-versus-schema sync checks, flags drift automatically, and rolls out schema updates as part of the content publishing cycle. Trystellor’s weekly technical audits cover schema completeness, @id consistency, and AI-crawler readiness across all your location pages, so nothing slips between content releases.

Pro Tip: Add sameAs links to your GBP URL, your Facebook business page, your Yelp listing, and your Wikidata entry if one exists. AI engines use these cross-references to confirm your business identity before recommending you. A business with consistent sameAs signals across authoritative profiles is significantly more likely to be cited accurately by ChatGPT, Perplexity, and Gemini than one with schema alone.

For a broader audit framework that covers schema alongside technical SEO, the Trystellor SEO audit checklist for local service businesses is a practical companion resource.


Key Takeaways

Getting your local schema right means treating it as an ongoing identity system, not a one-time technical task. The most specific LocalBusiness subtype, exact GBP matching, and a stable @id are the three decisions that determine whether everything else works.

Point Details
Use the most specific subtype Plumber, Dentist, Restaurant unlock subtype properties that generic LocalBusiness cannot use.
Match GBP exactly Name, address, and phone in JSON-LD must be character-for-character identical to your Google Business Profile.
One stable @id per location Use each location page’s canonical URL as its @id across all schema blocks to build a unified entity graph.
Validate before and after every change Run the Google Rich Results Test and Schema Markup Validator after any update to hours, address, or phone.
Trystellor automates the upkeep Trystellor’s weekly audits and 30-article-per-month publishing cadence keep schema, content, and GBP signals aligned automatically.

Why schema is really an identity tool, not a rank trick

Schema markup gets framed as a ranking tactic in most SEO conversations, and that framing leads businesses to implement it once and forget it. The more accurate frame is that schema is an identity declaration. You are telling Google, ChatGPT, Perplexity, and every other engine that reads your page: “This is exactly who we are, where we are, and what we do.” The precision of that declaration determines whether those engines trust your business enough to surface it confidently.

What most guides understate is the AI citation angle. When someone asks ChatGPT for the best plumber in their city, the model is not running a live Google search. It is drawing on structured signals it has already indexed, and a business with clean, consistent schema across every location page, linked to authoritative profiles via sameAs, is far more likely to be named than one with vague or conflicting markup. Schema does not replace your GBP, your reviews, or your content. But it is the connective tissue that makes all of those signals coherent to a machine reading your site at scale.

The maintenance piece is where most businesses fall short. A phone number changes, the JSON-LD does not get updated, and suddenly your schema contradicts your GBP. That conflict does not just fail to help. It actively signals inconsistency to the entity model, which is worse than having no schema at all. Treat every business change as a schema update trigger, not an afterthought.


Trystellor handles your schema so you can focus on your business

Running a local business means your time is already spoken for. Schema implementation is technical, schema maintenance is ongoing, and the cost of getting it wrong is invisible until you notice you have dropped out of the local pack or stopped appearing in AI recommendations.

Trystellor

Trystellor publishes 30 GEO and SEO-optimized articles per month to your CMS, each one built with the correct LocalBusiness subtype, @id structure, and GBP-matched NAP baked in from the start. Weekly technical audits catch schema drift before it becomes a ranking problem. LLM visibility tracking across ChatGPT, Claude, Perplexity, and Gemini shows you exactly where your business is being cited and where it is not. The 4,000-site backlink network reinforces the authority signals that make your schema credible.

Here is what getting started looks like:

Pricing starts at $199 per month with a three-day free trial and no credit card required. See the full platform at Trystellor’s product page.


Useful sources


FAQ

What is the most important schema type for a local business?

The LocalBusiness type, using the most specific available subtype, is the foundation. Pair it with PostalAddress, telephone, openingHoursSpecification, and a stable @id to cover the properties Google uses for local pack and knowledge panel results.

Does LocalBusiness schema directly improve my Google ranking?

No. Schema is not a direct ranking signal. It functions as an entity-clarity mechanism that reduces ambiguity, improves rich result eligibility, and increases the accuracy of AI citations. Local pack ranking is primarily driven by GBP completeness, proximity, and review volume.

Should service-area businesses use LocalBusiness schema?

Yes, but with one key adjustment. Omit streetAddress and use areaServed to list the cities or regions you serve. Including a private or residential address when customers cannot visit the location can confuse Google’s entity model and harm local pack behavior.

How often should I update my LocalBusiness schema?

Update it immediately whenever your business hours, phone number, address, or service area changes. Run a full sitewide schema audit monthly, and do a weekly check comparing your GBP against your live JSON-LD to catch any drift before Google does.

Can Trystellor manage schema markup for multiple locations?

Yes. Trystellor’s platform publishes per-location LocalBusiness blocks with unique @id values, GBP-matched NAP, and correct subtype properties as part of its 30-article-per-month content cadence. Weekly technical audits flag schema drift across all location pages automatically.

← Back to all articles