Schema Markup for Local Businesses: Complete Implementation Guide
Schema Markup for Local Businesses: Complete Implementation Guide
When Google crawls your website, it reads text the same way a human would — but understanding context requires interpretation. A page might say "We're open 9–5," but that sentence could mean business hours, a store sale period, or the title of a TV show. Schema markup eliminates this ambiguity. It is structured data that you embed in your website's code to tell search engines, in precise machine-readable language, exactly what your content means.
For local businesses, schema markup is one of the most underutilized technical SEO advantages available. Most small and mid-sized businesses have not implemented it, and many that have done so have done it incorrectly. Getting schema right gives you an edge in local search visibility, enables rich search result features, and reinforces every other local SEO signal you are building.
This guide covers everything you need to implement schema markup effectively: the formats available, the most important schema types for local businesses, complete code examples, and how to validate your implementation.
What Schema Markup Is and Why It Matters for Local SEO
Schema.org is a collaborative vocabulary for structured data, created by Google, Microsoft, Yahoo, and Yandex in 2011. It defines a shared language for describing entities — businesses, products, events, people, reviews, and much more — in a format that any search engine can parse reliably.
When you add schema markup to your website, you are not changing what users see. You are adding invisible metadata that search engines read during the crawling and indexing process. This metadata answers questions that would otherwise require interpretation:
- Is this a dental practice or a dental product store?
- Does "Monday–Friday 9am–5pm" describe business hours or a service schedule?
- Is this star rating from an independent review site or is it self-assigned?
- Does this FAQ apply to the whole business or to one specific service?
From a local SEO perspective, schema markup matters for three reasons:
1. It improves Google's confidence in your business data. Google cross-references your business information across your website, your Google Business Profile, and third-party directories. When your website's schema markup precisely matches your GBP data, it reinforces the accuracy signal. Consistent data across sources increases Google's trust in your listing.
2. It can enable rich results. Certain schema types unlock enhanced displays in search results — star ratings, business hours, FAQ dropdowns, and service listings that appear directly in the search result card. These rich results increase click-through rates significantly.
3. It supports voice search and AI-driven results. Voice assistants and AI overviews pull structured data directly to answer spoken queries. A business with clean schema markup is more likely to be cited when someone asks "What are the hours for [business type] near me?"
JSON-LD: The Recommended Format
Schema markup can be implemented in three formats: JSON-LD, Microdata, and RDFa. Google recommends JSON-LD, and it is also the simplest to implement and maintain.
JSON-LD (JavaScript Object Notation for Linked Data) is placed in a <script> tag in your HTML's <head> section. It is entirely separate from your visible page content, which means you can add or update it without touching your design or layout.
The basic structure looks like this:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Your Business Name"
}
</script>
The @context field always points to https://schema.org. The @type field specifies what kind of entity you are describing. Everything else depends on the schema type.
The LocalBusiness Schema: A Complete Example
The LocalBusiness schema type is the foundation. It describes your business's core identity — the information that Google uses to populate your knowledge panel, local search results, and Maps listing.
Here is a complete, well-structured LocalBusiness schema example:
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Apex Plumbing Services",
"image": "https://www.apexplumbing.com/images/storefront.jpg",
"url": "https://www.apexplumbing.com",
"telephone": "+1-312-555-0100",
"priceRange": "$$",
"description": "Licensed plumbing services in Chicago including emergency repairs, water heater installation, and drain cleaning.",
"address": {
"@type": "PostalAddress",
"streetAddress": "1234 North Michigan Avenue",
"addressLocality": "Chicago",
"addressRegion": "IL",
"postalCode": "60601",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 41.8827,
"longitude": -87.6233
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "08:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "09:00",
"closes": "14:00"
}
],
"sameAs": [
"https://www.google.com/maps?cid=YOUR_CID",
"https://www.yelp.com/biz/apex-plumbing-chicago",
"https://www.facebook.com/apexplumbingchicago"
]
}
Let us go through the most important fields:
name: Your exact business name, matching your Google Business Profile precisely.
image: A URL to a high-quality photo of your business (exterior or logo). Use a photo that is publicly accessible and at least 800px wide.
telephone: Your primary business phone number in E.164 international format (+1-XXX-XXX-XXXX for US/Canada numbers).
priceRange: A price indicator using $ symbols ($ = inexpensive, $$$$ = very expensive). This may appear in search results and Maps.
address: Use the PostalAddress type with separate fields for each component. Do not combine fields — Google needs them separately to process the address correctly.
geo: Latitude and longitude coordinates. These help Google precisely locate your business, which is particularly important if your address is ambiguous or in a mixed-use building. You can find your coordinates from Google Maps by right-clicking your location.
sameAs: Links to your profiles on authoritative platforms. This helps Google connect your website to your GBP listing, Yelp profile, and other directory presences.
Using the Right LocalBusiness Subtype
LocalBusiness is a parent type with hundreds of more specific subtypes. Using the most specific applicable subtype always produces a stronger signal than using the generic parent.
Some commonly used subtypes:
| Business Type | Schema Type |
|---|---|
| Restaurant, cafe, bar | Restaurant, CafeOrCoffeeShop, BarOrPub |
| Dental practice | Dentist |
| Medical practice | MedicalBusiness, Physician, MedicalClinic |
| Law firm | LegalService, Attorney |
| Plumbing, electrical, HVAC | Plumber, Electrician, HVACBusiness |
| Auto repair | AutoRepair |
| Hair salon, spa | HairSalon, DaySpa, BeautySalon |
| Hotel, motel | Hotel, Motel, LodgingBusiness |
| Gym, fitness studio | SportsActivityLocation, HealthClub |
| Real estate agency | RealEstateAgent |
| Accounting firm | AccountingService |
To use a subtype, simply change the @type value:
{
"@context": "https://schema.org",
"@type": "Dentist",
"name": "Westside Family Dental",
...
}
You can also stack multiple types using an array when your business spans categories:
"@type": ["MedicalClinic", "Dentist"]
Opening Hours Schema in Detail
The openingHoursSpecification property handles regular weekly hours. For each set of hours that share the same open/close times, create one OpeningHoursSpecification object:
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "09:00",
"closes": "17:30"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "10:00",
"closes": "15:00"
}
]
Time values must be in 24-hour format (HH:MM). For businesses open 24 hours, use "opens": "00:00" and "closes": "23:59".
Special hours (holiday closures, extended seasonal hours) use the specialOpeningHoursSpecification property with a validFrom and validThrough date range:
"specialOpeningHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Monday",
"opens": "00:00",
"closes": "00:00",
"validFrom": "2026-12-25",
"validThrough": "2026-12-25"
}
]
In the example above, opens and closes both set to "00:00" signals that the business is closed that day.
AggregateRating Schema
If your website displays customer reviews or an aggregate rating, you can mark them up with AggregateRating schema. When implemented correctly, this can produce star rating rich snippets in your search results.
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "127",
"bestRating": "5",
"worstRating": "1"
}
Important: This schema should only be added if your website actually displays reviews from real customers. Do not add AggregateRating markup for ratings that are not visible on the page — Google considers this a violation of its structured data guidelines and can penalize your site.
Individual reviews can be marked up with the Review type nested within your LocalBusiness schema:
"review": [
{
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5"
},
"author": {
"@type": "Person",
"name": "Sarah M."
},
"reviewBody": "Incredibly fast service. The technician arrived within two hours and fixed the issue on the first visit."
}
]
FAQ Schema for Local Pages
The FAQPage schema type marks up question-and-answer content on your page. When Google renders FAQ schema in search results, each question appears as an expandable dropdown directly in the search result card — significantly increasing your result's visual footprint and click-through rate.
FAQ schema is particularly effective on local service pages ("FAQ: Plumbing Services in Chicago") and location pages.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Do you offer emergency plumbing service?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, we provide 24/7 emergency plumbing service throughout the Chicago metro area. Call us at (312) 555-0100 for immediate assistance."
}
},
{
"@type": "Question",
"name": "What areas do you serve?",
"acceptedAnswer": {
"@type": "Answer",
"text": "We serve Chicago and surrounding suburbs including Evanston, Oak Park, Naperville, and Schaumburg."
}
}
]
}
Use FAQ schema only for questions and answers that actually appear on the page. Google will not render rich results for schema that describes content not visible to users.
Service Schema
The hasOfferCatalog and Service schema types let you describe the specific services your business offers. This is particularly useful for service-area businesses with multiple distinct offerings.
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Plumbing Services",
"itemListElement": [
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Emergency Drain Cleaning",
"description": "Rapid drain clearing for blocked sinks, toilets, and sewer lines."
}
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Water Heater Installation",
"description": "Installation of tank and tankless water heaters, all brands."
}
}
]
}
Service schema helps Google understand your full service offering, which improves relevance matching for specific service queries — "water heater installation near me" vs. just "plumber near me."
How to Test Your Schema Implementation
After adding schema markup to your website, always validate it before considering the work done.
Google Rich Results Test (search for it at search.google.com/test/rich-results): Paste your URL or code snippet and Google will show you exactly what rich results your schema qualifies for, along with any errors or warnings. This is the most important test to pass.
Schema.org Validator (validator.schema.org): A more technical validator that checks your markup against the full Schema.org specification. Useful for catching property name errors or type mismatches.
Google Search Console: Once your pages are indexed, the "Enhancements" section in GSC shows which schema types Google has detected on your site, how many items it found, and any errors that prevented rich results from displaying.
When testing, look for two categories of issues:
- Errors: Problems that prevent the schema from being processed at all (missing required fields, invalid property names, malformed JSON)
- Warnings: Issues that do not break the schema but prevent certain rich result features (missing recommended fields like
imageorpriceRange)
Address errors first. Warnings represent optimization opportunities rather than blocking problems.
Common Implementation Mistakes
Mismatched data: The most damaging mistake is having schema markup that contradicts your GBP or other directory data. If your schema says your address is "123 Main Street" but your GBP says "123 Main St," you are creating a conflicting signal. NAP data in your schema must match your canonical NAP exactly.
Marking up non-visible content: Adding schema for reviews, ratings, or hours that are not displayed on the page violates Google's guidelines. Only mark up information that users can see.
Using the wrong schema type: Using Organization instead of LocalBusiness loses all the location-specific fields. Using a generic parent type when a specific subtype is available reduces relevance.
Invalid JSON: A single missing comma or unclosed bracket in your JSON-LD will prevent the entire schema block from being parsed. Always validate after any edit.
Not updating schema when business details change: If you move, change your hours, or get a new phone number, your schema must be updated immediately. Stale schema creates a conflicting signal with your updated GBP and directories.
Duplicate schema blocks: Some CMS plugins and page builders add their own schema automatically. If your site has two LocalBusiness blocks with conflicting data, Google may ignore both. Check your page source to ensure you have only one schema block per entity type.
How LocalScan Audits Your Schema
LocalScan includes schema markup analysis as part of its comprehensive local SEO audit. The tool scans your website to detect what structured data is present, checks for errors and missing required fields, and verifies that your schema data is consistent with the business information you provided — flagging any mismatches between your website schema and your directory listings.
For businesses that have never implemented schema, the audit provides a clear starting point. For businesses that have existing markup, it surfaces errors that may be silently preventing rich results or creating conflicting signals.
Run a free schema audit at LocalScan to see exactly where your structured data stands and what specific fields need attention.
Conclusion
Schema markup is one of the highest-leverage technical SEO improvements available to local businesses, yet it remains widely underimplemented. Unlike tactics that require ongoing content production or link outreach, schema markup is a one-time implementation that pays dividends continuously — improving how Google understands your business, enabling rich search result features, and reinforcing every other local signal you are building.
The implementation process is straightforward: choose the most specific applicable LocalBusiness subtype, populate all required and recommended fields with data that precisely matches your GBP, add opening hours and service schema, validate with Google's Rich Results Test, and update whenever your business details change.
Businesses that implement schema correctly gain a measurable advantage in local search visibility that their competitors — who have not bothered — simply cannot match without doing the same work.
Check your local SEO score for free
Scan your business across 25+ directories in under a minute.
Run Free Audit