LocalBusiness Schema: The Copy-Paste Guide for Service Businesses
LocalBusiness schema is a block of JSON-LD in your page's HTML that states your business name, address, phone, hours, service area, and services in a format machines read without interpretation. Use the most specific type available — Plumber, Electrician, Dentist — rather than generic LocalBusiness, and put it on your homepage.
Schema markup is the least glamorous item on any AI visibility list and one of the highest-return. It takes twenty minutes and it converts every important fact about your business from something a machine has to infer into something it simply reads.
Here is a working template and the specifics that matter.
What it actually is
A block of JSON in a <script type="application/ld+json"> tag. Invisible to visitors. Read by Google, by AI crawlers, and by anything else parsing your page.
Without it, a machine reading your homepage has to infer your service area from marketing copy, guess whether the phone number in your footer is yours or a partner's, and work out your hours from a graphic. With it, all of that is stated.
Use the specific type, not the generic one
This is the most common mistake. LocalBusiness works, but schema.org defines far more specific types, and specificity is the entire point.
Common types for local service businesses:
| Trade | Schema type |
|---|---|
| Plumbing | Plumber |
| HVAC | HVACBusiness |
| Electrical | Electrician |
| Roofing | RoofingContractor |
| General contracting | GeneralContractor |
| Painting | HousePainter |
| Landscaping | LandscapingBusiness |
| Pest control | PestControlService |
| Locksmith | Locksmith |
| House cleaning | HouseCleaningService |
| Moving | MovingCompany |
| Auto repair | AutoRepair |
| Dentistry | Dentist |
| Chiropractic | Chiropractic |
| Legal | Attorney or LegalService |
| Day spa | DaySpa |
| Veterinary | VeterinaryCare |
If nothing fits, HomeAndConstructionBusiness is a better fallback than bare LocalBusiness for trades, and ProfessionalService for everything else.
The template
Replace every value. Delete what does not apply. Do not leave placeholder text in a live block.
{
"@context": "https://schema.org",
"@type": "Plumber",
"@id": "https://carterplumbing.com/#business",
"name": "Carter Plumbing & Drain",
"url": "https://carterplumbing.com",
"telephone": "+1-813-555-0100",
"email": "office@carterplumbing.com",
"description": "Licensed residential plumbing, water heater replacement, and 24/7 emergency service in Tampa and eastern Hillsborough County.",
"foundingDate": "1998",
"address": {
"@type": "PostalAddress",
"streetAddress": "1400 W Kennedy Blvd",
"addressLocality": "Tampa",
"addressRegion": "FL",
"postalCode": "33606",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 27.9447,
"longitude": -82.4801
},
"areaServed": [
{ "@type": "City", "name": "Tampa" },
{ "@type": "City", "name": "Brandon" },
{ "@type": "City", "name": "Riverview" },
{ "@type": "City", "name": "Carrollwood" }
],
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "07:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Saturday","Sunday"],
"opens": "08:00",
"closes": "16:00"
}
],
"hasCredential": "FL Certified Plumbing Contractor CFC1428xxx",
"priceRange": "$$",
"makesOffer": [
{
"@type": "Offer",
"itemOffered": { "@type": "Service", "name": "Water Heater Replacement" }
},
{
"@type": "Offer",
"itemOffered": { "@type": "Service", "name": "Emergency Plumbing Repair" }
},
{
"@type": "Offer",
"itemOffered": { "@type": "Service", "name": "Trenchless Sewer Line Repair" }
}
],
"sameAs": [
"https://www.google.com/maps/place/?q=place_id:ChIJxxxxxxxxxxxx",
"https://www.yelp.com/biz/carter-plumbing-tampa",
"https://www.facebook.com/carterplumbingtampa",
"https://www.bbb.org/us/fl/tampa/profile/plumber/carter-plumbing-xxxxx"
]
}
The fields that matter most, and why
@id — a stable unique identifier for your business entity. Use your domain with a fragment. It lets other schema on your site reference the same business rather than describing a new one.
name — your exact legal or operating name, identical to your Google Business Profile. Not a keyword-stuffed version. "Carter Plumbing & Drain," not "Carter Plumbing | Best Plumber in Tampa FL."
areaServed — list individual cities as City objects. This is one of the highest-value fields for AI visibility and one of the most commonly omitted. If you serve twelve cities, list twelve.
sameAs — links to your profiles elsewhere. This is how you tell a machine that the business on your site, the one on Yelp, and the one on Google are the same entity. It is the single most under-used field in local schema and it directly addresses the entity-consistency problem that keeps businesses out of AI answers.
Include: Google Maps place URL, Yelp, Facebook, BBB, Angi, your trade association profile, manufacturer dealer listings, and your state license lookup if it has a stable public URL.
hasCredential — license numbers, certifications, authorizations. Verifiable facts, stated.
openingHoursSpecification — real hours. If you genuinely run 24/7, use "opens": "00:00", "closes": "23:59" across all seven days.
makesOffer — your actual services. List the ones you want to be called for, using the words customers use.
Fields to be careful with
aggregateRating — only include if you display genuine reviews on your own site and the numbers are real. Fabricated ratings are a policy violation with real consequences, and self-serving ratings with no verifiable source add little anyway. Your Google reviews are already visible to the systems that matter.
priceRange — the $ to $$$$ convention. Harmless, low value. A priceSpecification on specific offers is far more useful if you publish prices.
image and logo — include them, use absolute URLs, and make sure they load.
The mistakes that break it
A syntax error. One missing comma and the entire block is silently ignored. Validate.
Placeholder text left in. We see live sites with "streetAddress": "123 Main St" more often than you would think.
Mismatched facts. If your schema says one phone number and your footer says another, you have made the entity-confusion problem worse rather than better. Everything in the block must match your site, your Google Business Profile, and your directory listings exactly.
Marking up a business that does not match the page. Schema describes reality. Do not mark up services you do not offer or areas you do not serve.
Multiple conflicting blocks. Some site builders and SEO plugins inject their own LocalBusiness schema. Two blocks describing the same business differently is worse than one. Check your rendered page source for duplicates.
How to install it
WordPress: a header-injection plugin, your theme's custom-code field, or an SEO plugin's schema section. If your SEO plugin already outputs LocalBusiness schema, configure that rather than adding a second block.
Squarespace: Settings → Advanced → Code Injection → Header.
Wix: Settings → Custom Code → Add Code to Head.
Webflow: Project Settings → Custom Code → Head Code, or per-page custom code.
Shopify: theme.liquid, before the closing head tag.
Custom site: in your head, or rendered server-side. Make sure it appears in raw HTML, not injected by client-side JavaScript — a crawler that does not run JavaScript will not see it.
Validate before you walk away
Two tools, both free, both take thirty seconds:
- Google Rich Results Test — paste your URL, see what Google parses
- Schema.org Validator — stricter, catches issues Google tolerates
Fix every error. Warnings about optional fields are fine to ignore.
What to do this week
- Pick the most specific schema type for your trade.
- Fill in the template with your real details.
- Add every city you serve to
areaServed. - Add every profile URL you have to
sameAs. - Install it on your homepage and validate.
- Check your page source for a duplicate block from a plugin.
Then check the rest
Schema is one of fifteen on-page signals we check. Our free scan runs all of them alongside twenty-five real customer questions across five AI assistants, and tells you exactly which are missing.
About fifteen seconds, free, no account.
Common questions
- Where does the schema go on my site?
- In a script tag with type="application/ld+json", anywhere in the head or body of your homepage. Most site builders have a custom-code or header-injection field for exactly this. It is invisible to visitors.
- Do I need schema on every page?
- LocalBusiness belongs on your homepage and contact page. Individual service pages should carry Service schema instead, and pages with question sections should carry FAQPage. Repeating the full LocalBusiness block on every page is unnecessary and makes it harder to maintain.
- How do I know if my schema is working?
- Google's Rich Results Test and the Schema.org validator both parse a live URL and report errors. Run your homepage through both. A block with a syntax error is silently ignored, so validation is not optional.
- Does schema help my Google ranking?
- Directly, only modestly — it can produce rich results in search. Its larger value is that it removes ambiguity for AI systems assembling facts about your business, which is why it has become substantially more valuable than it was three years ago.
See exactly what the five AIs say about your business.
Twenty-five real customer questions across Claude, ChatGPT, Gemini, Perplexity, and Google AI Overviews. Free, about fifteen seconds, no account.
Run the free scanKeep reading
- The 15-Point AI Visibility Audit You Can Run YourselfTechnical fixes
- Entity Building: Making AI Understand Your Business ExistsTechnical fixes
- FAQPage Schema: The Fastest Path Into AI AnswersTechnical fixes
- A 30-60-90 Day AEO Plan for a Local Service BusinessMeasurement & buying
- What Is Answer Engine Optimization? A Local Business Owner's GuideFoundations