
Local Schema Markup for Service Providers
Local Schema Markup for Service Providers
Schema is a note to machines telling them exactly what your business is. Most sites never leave one.
TL;DR Paste one block of JSON-LD into your site head. It tells Google and AI tools your name, address, phone, hours, and service area in a format they cannot misread. Copy the template below, change the values, validate, done.
What JSON-LD actually is
A block of structured text in your page’s <head>. Invisible to visitors. Read by machines.
Without it, a crawler guesses your hours from a paragraph. With it, you hand over the answer.
Three things to know
- JSON-LD is the format Google recommends. Ignore microdata and RDFa advice from 2016.
- It goes in the head, on every page, or at minimum the homepage and contact page.
- It must match your visible content. Marking up hours you do not display is a violation.
The template
Change every value in caps. Delete what does not apply.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Plumber",
"name": "YOUR EXACT BUSINESS NAME",
"image": "https://YOURSITE.com/logo.png",
"@id": "https://YOURSITE.com/#business",
"url": "https://YOURSITE.com",
"telephone": "+15085551234",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "160 EXAMPLE ST",
"addressLocality": "Fall River",
"addressRegion": "MA",
"postalCode": "02720",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 41.7015,
"longitude": -71.1550
},
"areaServed": [
{ "@type": "City", "name": "Fall River" },
{ "@type": "City", "name": "Somerset" },
{ "@type": "City", "name": "Swansea" }
],
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "08:00",
"closes": "17:00"
}],
"sameAs": [
"https://www.facebook.com/YOURPAGE",
"https://www.instagram.com/YOURPAGE"
]
}
</script>
Pick the right @type
LocalBusiness works. A specific type works better, because it carries more meaning.
| Trade | Use |
|---|---|
| Plumbing | Plumber |
| Electrical | Electrician |
| HVAC | HVACBusiness |
| Roofing, general contracting | HomeAndConstructionBusiness |
| Salon, barber | HairSalon |
| Cleaning | HousePainter or LocalBusiness |
| Anything without a match | LocalBusiness |
Schema.org lists them all. Use the most specific one that fits.
Service-area businesses: drop the address
If customers do not come to you, do not publish a street address. Use areaServed and omit address, or Google may treat a home address as a storefront.
GeoCoordinates note. Latitude and longitude help disambiguate you from similarly named businesses. Get them by right-clicking your location in Google Maps and copying the numbers.
Where to put it
| Platform | How |
|---|---|
| WordPress | A schema plugin, or paste into header.php before </head> |
| Shopify | Edit theme.liquid, paste before </head> |
| Webflow | Project Settings, Custom Code, Head |
| GoHighLevel | Funnel or site settings, Tracking Code, Head |
| Squarespace | Settings, Advanced, Code Injection, Header |
| Hand-coded | Directly in <head> |
Validate before you walk away
Two free tools. Use both.
- Google’s Rich Results Test. Paste your URL. It tells you what Google can read.
- Schema.org Validator. Stricter. Catches syntax errors the Google tool tolerates.
The error you will hit: a stray comma. JSON does not allow a trailing comma before a closing brace. If the validator throws a parse error, look for that first.
What schema does and does not do
Does: clarify your entity to search engines and AI tools. Improve eligibility for rich results. Make your hours, phone, and service area machine-readable and unambiguous.
Does not: rank you by itself. Schema is a clarity tool, not a ranking hack. It removes doubt. Doubt is what gets you left out of AI answers.
Paste the template, change the values, run the validator. Twenty minutes, once, and your business stops being a guess.
Not a tech-savvy pro? That is exactly what we are here for. [CALL NOW]
Common mistakes that make schema worthless
Marking up content that is not on the page. Search engines treat this as spam. If the schema says you are open until 8pm, the page must say so too.
Multiple conflicting LocalBusiness blocks. One per page, matching that page’s subject. A service page marked up as the whole business confuses the entity.
Fake or aggregated review markup. Self-serving review snippets from your own site are widely discounted, and inventing an aggregate rating is a manual-action risk. Mark up reviews only where they genuinely exist on the page and were genuinely left by customers.
Copying a competitor’s block without changing the NAP. It happens more than you would expect, and it points your schema at somebody else’s business.
Leaving the markup static while the business changes. Hours, phone number and service area drift. Schema that contradicts your Google Business Profile is worse than none, because inconsistency is the exact signal you were trying to fix.
Validating it
Two tools, both free, both run in under a minute.
- Google’s Rich Results Test tells you which rich result types the page is eligible for. This is the one that matters for search appearance.
- Schema.org’s own validator checks the markup is structurally valid, regardless of what Google does with it.
Run both. A page can be valid schema and still ineligible for a rich result, and vice versa. The two tools answer different questions.
Then check Search Console. The Enhancements reports show errors detected on live pages across the whole site, which is where you will catch a template change that broke markup on two hundred pages at once.
Where to put it
JSON-LD in the head or body, not microdata in the markup.
Microdata and RDFa still work, and they entangle your structured data with your HTML so that a design change breaks your markup. JSON-LD sits in a single script block, is easy to generate from a template, and is straightforward to audit.
One block per page, generated from your CMS fields rather than hand-written per page. Hand-written schema goes stale the moment somebody changes a phone number.
