Most LocalBusiness schema examples assume a coffee shop: one address, a storefront, a menu and opening hours on the door. That's fine if you run a coffee shop.
But a plumber who drives to customers' homes doesn't look like that. Neither does a cleaning company run from a home office, a law firm with three branches, or an HVAC contractor covering half a county. Copy a café template onto these businesses and you end up with the wrong type, a fake-looking address, missing service areas and, too often, review markup that breaks Google's rules.
This guide covers exactly what service businesses should mark up with LocalBusiness schema, property by property, and what to leave out. It includes four validated JSON-LD examples, covering service area markup, multiple locations and services, and every rule is sourced to Google's documentation or Schema.org.
What LocalBusiness Schema Does, and What It Doesn't
LocalBusiness schema is structured data, usually written as JSON-LD, that describes your business in a format search engines can read reliably: your name, address, phone number, hours, service area and services.
According to Google's LocalBusiness structured data guidelines, this markup can make a page eligible for local business rich results, and Google may show business details in a knowledge panel or a carousel. Google is clear that markup doesn't guarantee any of those features will appear.
It's also worth being clear about what it isn't:
- It isn't a ranking shortcut. Structured data helps search engines understand your business. It doesn't push you up the local pack on its own.
- It doesn't replace your Google Business Profile. Your profile drives most local visibility. Your schema should match it exactly.
- It isn't a substitute for visible content. Everything you mark up should also appear on the page for visitors.
Step 1: Pick the Most Specific Type
Google's guidance is to "use the most specific LocalBusiness sub-type possible." Schema.org defines a long list of them, and many fit service businesses directly.
Under HomeAndConstructionBusiness, you'll find:
ElectricianGeneralContractorHVACBusinessHousePainterLocksmithMovingCompanyPlumberRoofingContractor
Other useful branches of the Schema.org LocalBusiness type include ProfessionalService, LegalService, MedicalBusiness, AutomotiveBusiness, EmergencyService, HealthAndBeautyBusiness, FinancialService and RealEstateAgent.
Pick the type that matches your main service. If your business genuinely fits two, Google supports listing several types as an array, for example "@type": ["Plumber", "HVACBusiness"]. Google specifically notes that additionalType isn't supported for this. If nothing fits well, LocalBusiness or ProfessionalService is a safe fallback.
Step 2: The Properties Every Service Business Needs
Google lists two required properties and a set of recommended ones.
Required:
-
name: the business name, exactly as it appears on your signage and Business Profile. -
address: aPostalAddress. Google asks you to include as many of its properties as possible.
Recommended for service businesses:
-
telephone: your main number, including the country code. -
url: the URL of the page describing this business or location. -
geo: latitude and longitude. -
openingHoursSpecification: when you're open. -
priceRange: a short indication such as$$or$80-$200. Google says this must be shorter than 100 characters, and longer values are dropped.
Useful additions from Schema.org: image, logo, sameAs (links to profiles you control, such as your social accounts) and @id, a stable identifier other markup can reference.
Here's a complete example for a fictional plumber with a storefront:
{
"@context": "https://schema.org",
"@type": "Plumber",
"@id": "https://www.brightpipeplumbing.example/#business",
"name": "Bright Pipe Plumbing",
"url": "https://www.brightpipeplumbing.example/",
"telephone": "+1-555-010-0123",
"image": "https://www.brightpipeplumbing.example/images/van.jpg",
"logo": "https://www.brightpipeplumbing.example/images/logo.png",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "120 Market Street",
"addressLocality": "Springfield",
"addressRegion": "IL",
"postalCode": "62701",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 39.799,
"longitude": -89.644
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday"
],
"opens": "08:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "09:00",
"closes": "13:00"
}
],
"sameAs": [
"https://www.facebook.com/brightpipeplumbing.example",
"https://www.linkedin.com/company/brightpipeplumbing-example"
]
}
A few details about opening hours, all from Google's documentation:
- You can use a single
OpeningHoursSpecificationor an array of them, as above. - To show open 24 hours, use
"opens": "00:00"and"closes": "23:59". - To show closed all day, use
"opens": "00:00"and"closes": "00:00". - For hours that run past midnight, define them in a single entry rather than splitting them across two days.
- For holiday or seasonal hours, add
validFromandvalidThroughdates in YYYY-MM-DD format. Hours without these dates are treated as valid all year.
Step 3: Service-Area Businesses
This is where most templates fall apart. Many service businesses don't serve customers at an address. They travel to them.
Use areaServed
To describe where you work, use areaServed. Schema.org notes that areaServed supersedes the older serviceArea property, so use areaServed in new markup.
It accepts several kinds of values:
- Plain text, such as a city name
-
City,Stateor otherAdministrativeAreaobjects - A
GeoCircle, meaning a center point and a radius in meters - Other
PlaceorGeoShapevalues
Keep your markup consistent with the service areas in your Google Business Profile, which lets service-area businesses list up to 20 areas. If your profile lists ten towns, your schema shouldn't claim the whole state.
What to Do About a Hidden Address
Google requires address for local business rich results. So what should a business that hides its street address on its Business Profile do, perhaps because it's run from home?
Be consistent and honest:
-
Don't publish an address you've chosen to hide. If your street address is hidden on your Business Profile, leave
streetAddressout of your schema too. - Include what you're comfortable showing: the city, region, postal code and country.
- Accept the trade-off. Without a full address, you may not qualify for that specific rich result. The markup still describes your business, contact details and service area accurately.
- Never invent an address, and never use a virtual office or mailbox you don't actually operate from.
Here's an example for a fictional home cleaning company that serves a radius around its base and lists its main towns. Schema.org has no dedicated cleaning type, so it falls back to LocalBusiness:
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"@id": "https://www.freshnesthomes.example/#business",
"name": "Fresh Nest Home Cleaning",
"url": "https://www.freshnesthomes.example/",
"telephone": "+1-555-010-0456",
"priceRange": "$120-$300",
"address": {
"@type": "PostalAddress",
"addressLocality": "Austin",
"addressRegion": "TX",
"postalCode": "78704",
"addressCountry": "US"
},
"areaServed": [
{
"@type": "GeoCircle",
"geoMidpoint": {
"@type": "GeoCoordinates",
"latitude": 30.25,
"longitude": -97.76
},
"geoRadius": "40000"
},
{
"@type": "City",
"name": "Austin"
},
{
"@type": "City",
"name": "Round Rock"
},
{
"@type": "City",
"name": "Cedar Park"
},
{
"@type": "City",
"name": "Pflugerville"
}
],
"openingHoursSpecification": {
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
],
"opens": "07:00",
"closes": "19:00"
}
}
Step 4: Mark Up the Services You Offer
Service businesses usually offer several distinct services, such as drain cleaning, water heater installation and emergency repairs. Schema.org lets you list them with hasOfferCatalog, which LocalBusiness inherits from Organization.
{
"@context": "https://schema.org",
"@type": "Plumber",
"@id": "https://www.brightpipeplumbing.example/#business",
"name": "Bright Pipe Plumbing",
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Plumbing services",
"itemListElement": [
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Drain cleaning",
"url": "https://www.brightpipeplumbing.example/services/drain-cleaning/"
}
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Water heater installation",
"url": "https://www.brightpipeplumbing.example/services/water-heaters/"
}
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "24-hour emergency repairs",
"url": "https://www.brightpipeplumbing.example/services/emergency/"
}
}
]
}
}
Two tips make this work well:
-
Give each important service its own page, and mark up that page with a
Servicetype whoseproviderpoints to your business@id. The catalog on the main page then summarizes services that each have a detailed page. - Only mark up services that the page actually describes. If drain cleaning isn't mentioned on the page, it shouldn't be in the markup.
Step 5: Multiple Locations and Departments
If you operate from more than one location, Google's guidance is to define each location as its own LocalBusiness entity. The cleanest approach is a dedicated page for each location, each with its own markup, @id, address, phone number and hours, linked to the parent brand.
{
"@context": "https://schema.org",
"@type": "LegalService",
"@id": "https://www.harlowlaw.example/locations/denver/#location",
"name": "Harlow & Finch Law, Denver",
"url": "https://www.harlowlaw.example/locations/denver/",
"telephone": "+1-555-010-0789",
"address": {
"@type": "PostalAddress",
"streetAddress": "1550 Larimer Street, Suite 400",
"addressLocality": "Denver",
"addressRegion": "CO",
"postalCode": "80202",
"addressCountry": "US"
},
"openingHoursSpecification": {
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday"
],
"opens": "09:00",
"closes": "17:30"
},
"parentOrganization": {
"@type": "Organization",
"@id": "https://www.harlowlaw.example/#organization",
"name": "Harlow & Finch Law"
}
}
Don't stack every location onto the homepage. Each location page should describe one location, and the homepage can carry Organization markup for the brand as a whole.
If one location has distinct departments, such as a service desk and a parts counter with different hours, Google supports nesting them with the department property. Google asks that department names follow the format {store name} {department name}.
Reviews: The Rule Most Service Businesses Break
It's tempting to add aggregateRating to your LocalBusiness markup in the hope of showing gold stars in search results. Don't.
Google's LocalBusiness documentation says review and aggregateRating are only recommended "for sites that capture reviews about other local businesses." Google's review snippet guidelines go further: reviews that a LocalBusiness or Organization publishes about itself are considered self-serving and aren't eligible for star review snippets.
In practice:
- Don't mark up your own star rating in your LocalBusiness schema.
- Never copy ratings from Google, Yelp or other sites into your markup.
- Do show genuine reviews to visitors on your pages if you like, because they still help people decide. Just don't wrap them in rating markup aimed at search results.
Where to Put It and How to Test It
Place one JSON-LD block per page, inside a <script type="application/ld+json"> tag in the head or body. Google reads either.
The most reliable way to keep schema accurate is to generate it from the same data as your visible content. If your phone number, address and hours live in your CMS or a config file, render both the footer and the JSON-LD from that single source. Then the two can never drift apart after an edit.
Before publishing, test every template:
- Run the page through Google's Rich Results Test to check eligibility.
- Use a schema markup validator to catch syntax errors and invalid properties.
- After launch, watch Search Console for structured data warnings.
Then make it part of your routine. This on-page SEO checklist covers structured data alongside the other checks every page needs before it goes live.
Common Mistakes
- Using generic
LocalBusinesswhen a specific type such asPlumberexists - A name or phone number that doesn't match your Google Business Profile
- A fake, virtual or invented address
- Using the old
serviceAreaproperty instead ofareaServed - Claiming a service area far larger than you actually cover
- A
priceRangevalue of 100 characters or more - Self-serving
aggregateRatingor review markup - Every location's markup piled onto the homepage
- Hours in the markup that differ from the hours on the page
- Services in the markup that the page never mentions
Frequently Asked Questions
What is LocalBusiness schema?
LocalBusiness schema is structured data, usually in JSON-LD, that describes a local business to search engines: its name, address, phone number, hours, service area and services. It uses the LocalBusiness type from Schema.org, and Google uses it to understand businesses and to power local business rich results.
Does LocalBusiness schema help local SEO rankings?
Not directly. Structured data helps search engines understand your business and can make pages eligible for rich results, but it isn't a ranking boost on its own. Your Google Business Profile, relevance, distance, reviews and website quality matter far more. Schema is a supporting signal that keeps your details clear and consistent.
Should a service-area business use LocalBusiness schema without an address?
Yes, with care. Google requires an address for local business rich results, so a service-area business with a hidden street address may not qualify for that feature. You can still include your city, region and postal code, plus areaServed, to describe your business accurately. Never invent an address.
What's the difference between areaServed and serviceArea?
They describe the same idea: the geographic area where a business provides its services. Schema.org states that areaServed supersedes serviceArea, so use areaServed in new markup. It accepts text, administrative areas such as cities, geographic shapes and a GeoCircle with a center point and radius.
Can I add review stars to my LocalBusiness schema?
You shouldn't mark up your own reviews. Google recommends review and aggregateRating in LocalBusiness markup only for sites that review other local businesses, and its review snippet guidelines treat reviews a business publishes about itself as self-serving and ineligible for stars. You can still display genuine reviews to visitors.
Should LocalBusiness schema go on the homepage or every page?
Put full LocalBusiness markup on the page that best represents each business or location, usually the homepage for a single-location business or each location page for several. Other pages can reference the business by its @id, for example from a Service page's provider property, rather than repeating the whole block.
Wrapping Up
Good LocalBusiness schema for a service business comes down to a few honest choices. Use the most specific type, include the required name and address, describe your real service area with areaServed, list your services, give each location its own entity, skip self-serving review stars and test everything before it goes live.
Schema is one piece of a bigger picture. For the rest, work through this small business SEO checklist to cover the other fixes that matter most on a tight budget.
Top comments (0)