Schema Markup for Local Business: The Complete Guide
Schema markup is structured data that tells search engines exactly what your business is, where it’s located, what services you offer, and when you’re open. Without it, Google has to guess this information from your page content. With it, Google knows with certainty — and rewards that certainty with richer search results and stronger ranking signals.
For local businesses, schema markup is one of the highest-impact, lowest-effort SEO improvements you can make. Most competitors don’t implement it (or implement it incorrectly), which means doing it right gives you an immediate edge.
What Schema Markup Does for Local SEO
- Confirms your business details to Google: Name, address, phone, hours, service area — all verified through structured data rather than inferred from page text.
- Enables rich results: FAQ dropdowns, star ratings, business info panels, and how-to steps all require schema markup to display.
- Strengthens entity recognition: Schema helps Google understand your business as a distinct entity, which improves both traditional rankings and AI/LLM visibility.
- Improves click-through rates: Rich results take up more visual space in search results and display more useful information, leading to higher CTR.
LocalBusiness Schema: The Foundation
Every local business website should have LocalBusiness schema on the homepage (at minimum) and on every location page.
Complete LocalBusiness Example
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Smith HVAC Services",
"image": "https://www.smithhvac.com/images/storefront.jpg",
"url": "https://www.smithhvac.com",
"telephone": "+1-555-123-4567",
"email": "[email protected]",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Main Street, Suite 200",
"addressLocality": "Austin",
"addressRegion": "TX",
"postalCode": "78701",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 30.2672,
"longitude": -97.7431
},
"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"
}
],
"priceRange": "$$",
"areaServed": [
{
"@type": "City",
"name": "Austin"
},
{
"@type": "City",
"name": "Round Rock"
},
{
"@type": "City",
"name": "Cedar Park"
}
],
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "HVAC Services",
"itemListElement": [
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "AC Installation",
"description": "Full residential and commercial AC system installation"
}
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Heating Repair",
"description": "Emergency and scheduled heating system repairs"
}
}
]
},
"sameAs": [
"https://www.facebook.com/smithhvac",
"https://www.yelp.com/biz/smith-hvac-austin",
"https://www.linkedin.com/company/smith-hvac"
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "156"
}
}
</script>
Breaking Down Each Property
| Property | Required? | Purpose |
|---|---|---|
| @type | Yes | Use the most specific type: “Plumber”, “Attorney”, “Dentist”, “Restaurant”, etc. |
| name | Yes | Your exact business name (match GBP) |
| address | Yes | Full postal address (match GBP exactly) |
| telephone | Yes | Primary phone number in E.164 format (+1-555-123-4567) |
| geo | Recommended | Latitude/longitude coordinates (helps distance calculations) |
| openingHoursSpecification | Recommended | Business hours (match GBP exactly) |
| areaServed | Recommended | Cities/regions you serve (especially for SABs) |
| hasOfferCatalog | Recommended | Services you provide with descriptions |
| sameAs | Recommended | Links to your social profiles and directory listings |
| aggregateRating | Optional | Your overall review rating (only if you can keep it current) |
| image | Recommended | Photo of your business (storefront, team, etc.) |
| priceRange | Optional | Relative price range ($, $$, $$$, $$$$) |
Choosing the Right @type
Don’t use generic “LocalBusiness” if a more specific type exists. Google provides better rich results for specific types:
- Legal: Attorney, LegalService
- Medical: Dentist, Physician, MedicalClinic
- Home services: Plumber, Electrician, HVACBusiness, RoofingContractor, LocksmithService
- Automotive: AutoRepair, AutoDealer
- Food: Restaurant, CafeOrCoffeeShop, Bakery
- Professional services: AccountingService, InsuranceAgency, RealEstateAgent
- Health/Wellness: DaySpa, HealthClub, BeautySalon
The full list is at schema.org/LocalBusiness.
FAQPage Schema: Capture Featured Snippets
FAQPage schema lets your FAQ answers appear directly in Google search results as expandable dropdowns. This takes up significantly more SERP real estate and dramatically improves click-through rates.
Implementation
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How much does AC installation cost in Austin?",
"acceptedAnswer": {
"@type": "Answer",
"text": "AC installation in Austin typically costs between $3,500 and $7,500, depending on the system size, brand, and complexity of the installation. Central AC for a 2,000 sq ft home averages $5,200."
}
},
{
"@type": "Question",
"name": "How long does AC installation take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "A standard residential AC installation takes 4-8 hours for a straightforward replacement. New installations requiring ductwork can take 2-3 days."
}
}
]
}
</script>
FAQ Schema Best Practices
- Only include genuine FAQs. Don’t use FAQ schema for content that isn’t structured as questions and answers on the page.
- The FAQ text must be visible on the page. Google requires that schema content match visible page content. Hidden content with FAQ schema is a violation.
- Include 3-5 questions per page. More than 8-10 FAQs on a single page dilutes the signal.
- Use questions people actually search. Check Google’s “People Also Ask” for your target keywords to find the right questions.
- Answers should be concise. 1-3 sentences. Long answers get truncated in search results.
Service Schema: Tell Google Exactly What You Do
Service schema is particularly valuable for service-area businesses and multi-service companies. It helps Google match your business with long-tail service queries.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Service",
"serviceType": "Emergency Plumbing Repair",
"provider": {
"@type": "Plumber",
"name": "Smith Plumbing",
"telephone": "+1-555-123-4567"
},
"areaServed": {
"@type": "City",
"name": "Austin, TX"
},
"description": "24/7 emergency plumbing repair for residential and commercial properties in Austin, including burst pipes, water heater failures, and sewer backups.",
"offers": {
"@type": "Offer",
"priceSpecification": {
"@type": "PriceSpecification",
"price": "89",
"priceCurrency": "USD",
"description": "Service call fee (waived with repair)"
}
}
}
</script>
Review Schema: Display Star Ratings in Search
Review schema can display star ratings directly in organic search results. Note that Google has tightened the rules around review schema:
- Self-serving reviews are ineligible: You can’t mark up reviews on your own website about your own business for rich result display.
- Third-party reviews are fine: Aggregated ratings from Google, Yelp, etc. can be included in your LocalBusiness schema via
aggregateRating. - Product/service reviews are allowed: Reviews of specific products or services (not the business itself) can use Review schema.
BreadcrumbList Schema: Improve Navigation Display
Breadcrumb schema shows your site structure in search results, replacing the plain URL with a clickable breadcrumb trail:
smithhvac.com > Services > AC Installation
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://www.smithhvac.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Services",
"item": "https://www.smithhvac.com/services/"
},
{
"@type": "ListItem",
"position": 3,
"name": "AC Installation",
"item": "https://www.smithhvac.com/services/ac-installation/"
}
]
}
</script>
Multi-Location Schema
For businesses with multiple locations, you have two options:
Option 1: Separate Schema Per Location Page
Each location page gets its own LocalBusiness schema with that location’s specific address, phone, hours, and coordinates. This is the preferred approach when each location has its own page.
Option 2: Organization + Locations on Homepage
On your homepage, use Organization schema with a department property listing each location. This approach works for a single “Locations” page that lists all locations.
For multi-location businesses, ensure each location has fully unique schema — not just a copy-paste with the city name changed. Each location should have its own coordinates, phone number, hours, and service area.
How to Implement Schema Markup
For WordPress Sites
- Manual JSON-LD: Add the schema code directly to your page template or using a plugin like “Insert Headers and Footers.” This gives you full control.
- Yoast SEO / Rank Math: Both plugins generate basic LocalBusiness schema automatically from your settings. This covers the basics but often misses services, geo coordinates, and area served.
- Schema-specific plugins: Plugins like “Schema Pro” or “WP Schema” provide a GUI for building structured data without writing JSON.
Validation
Always validate your schema after implementation:
- Google Rich Results Test: search.google.com/test/rich-results — shows which rich results your page is eligible for
- Schema Markup Validator: validator.schema.org — checks for syntax errors and warnings
Run both tests after implementation and after every site update. Theme changes, plugin updates, and page edits can break structured data.
Common Schema Mistakes
1. NAP Mismatch Between Schema and GBP
Your schema business name, address, and phone must exactly match your Google Business Profile. “123 Main St” in schema and “123 Main Street” in GBP creates an inconsistency that weakens trust signals.
2. Outdated Hours
Schema with wrong business hours creates a poor user experience and a trust violation. Update schema hours whenever you change your schedule, including holidays.
3. Missing Geo Coordinates
Many implementations skip latitude and longitude. These coordinates help Google precisely locate your business for proximity-based searches. Get your exact coordinates from Google Maps (right-click on your location).
4. Using @type: “LocalBusiness” When a More Specific Type Exists
If you’re a dentist, use @type: “Dentist” — not “LocalBusiness.” The more specific type enables more specific rich results and better entity matching.
5. Invisible Schema Content
FAQ schema must match visible page content. Adding FAQ schema with answers that don’t appear on the page violates Google’s guidelines and can result in a manual action.
Schema Checklist for Local Businesses
- [ ] LocalBusiness schema on homepage with all recommended properties
- [ ] Specific @type (not generic LocalBusiness) if applicable
- [ ] FAQPage schema on pages with FAQ sections
- [ ] BreadcrumbList schema on all internal pages
- [ ] Service schema on service pages
- [ ] Separate LocalBusiness schema on each location page
- [ ] NAP matches GBP exactly
- [ ] Geo coordinates included
- [ ] Opening hours match current schedule
- [ ] Validated with Google Rich Results Test
- [ ] sameAs links to social profiles and directory listings
Frequently Asked Questions
Does schema markup directly improve rankings?
Schema markup is a confirmed ranking signal for local search. Google’s John Mueller has stated that structured data helps Google understand page content more confidently, which can improve how pages are ranked. The indirect benefits (rich results, higher CTR, stronger entity recognition) also contribute to better rankings over time.
Can I add schema markup myself or do I need a developer?
You can do it yourself. JSON-LD schema is just a block of code pasted into your page’s HTML. WordPress plugins like Yoast and Rank Math handle basic schema automatically. For custom schema (services, FAQs, multi-location), you’ll need to add JSON-LD blocks manually or use a schema plugin with a visual builder.
How do I know if my schema is working?
Use Google’s Rich Results Test (search.google.com/test/rich-results). Enter your URL and it will show which rich results your page is eligible for, plus any errors or warnings in your structured data. Also check Google Search Console under Enhancements for ongoing schema monitoring.
Is there a limit to how much schema I can add to a page?
No hard limit, but only add schema types that are genuinely relevant to the page content. A homepage might have LocalBusiness + BreadcrumbList. A service page might have Service + FAQPage + BreadcrumbList. Don’t add schema types just to have more structured data — it should always match the actual page content.
Should I use JSON-LD or Microdata for schema?
JSON-LD. Google explicitly recommends JSON-LD as their preferred format. It’s easier to implement (a single script block in the page head or body), easier to maintain (all structured data in one place), and doesn’t interfere with your HTML markup. Microdata still works but is harder to manage and debug.