Service area business schema: how to mark up a business with no public address
Service area business schema should restate what your Google Business Profile already says: a specific LocalBusiness type, city-level address only if your street is hidden, and the same service areas listed under areaServed and on the page.

For a service area business, use the most specific LocalBusiness subtype (Plumber, Electrician, HousePainter and so on). Put only your city, state, ZIP code and country in address, never the street address you hid on Google. Then list the same areas you entered in your Business Profile under areaServed. Keep it boring and keep it matching. The point of the markup is to restate facts Google can already confirm, not to add new ones.
Most guides on this topic were written for storefronts and just bolt areaServed on at the end. This one starts from the awkward case: no public address, a home base you don’t want on the internet, and a Business Profile that already lists your cities. You’ll get a decision table for every business setup, a copy-ready example, the mistakes that make markup work against you, and an honest answer on what it does for AI search.
What schema should a service area business use?
Use LocalBusiness or, better, its most specific subtype, because you serve customers in person. Add areaServed for the places you travel to and a partial address that matches what’s public. Use plain Organization only if you never meet customers face to face.
Google’s local business structured data documentation says to use “the most specific LocalBusiness sub-type possible.” Schema.org has dedicated types for most trades. A few you’ll actually use:
- Trades:
Plumber,Electrician,HVACBusiness,RoofingContractor,HousePainter,Locksmith,GeneralContractor. - Home services:
HomeAndConstructionBusinessworks as a fallback for cleaners, landscapers and pest control, which don’t have their own types. - Mobile professionals:
ProfessionalServicefor mobile notaries or bookkeepers who visit clients,AutoRepairfor mobile mechanics.
The property that defines your territory is areaServed. Schema.org describes it as “the geographic area where a service or offered item is provided”, and it accepts a place, an administrative area, a shape or plain text. You may see older templates using serviceArea. Schema.org has marked that property as superseded, so don’t add it to new markup.
Pick your setup: the decision table
Your markup should mirror how your Business Profile is set up. Google’s service area help page gives three options: storefront, hybrid (customers visit and you travel), or service area only with the address removed. Find your row before you write a line of code.
| Your setup | Type | address | areaServed | geo |
|---|---|---|---|---|
| Storefront only (salon, clinic, shop) | Specific subtype | Full street address | Optional | Yes, your front door |
| Hybrid: customers visit, and you travel | Specific subtype | Full street address, shown on the site | Yes, same areas as your profile | Yes |
| Service area only, address hidden (most trades, home-based) | Specific subtype | City, state, ZIP, country. No street | Yes, same areas as your profile | Leave it out |
| Online only, no in-person contact | Organization | Optional mailing address | Only if it’s a real limit (e.g. licensed states) | No |
The row that trips people up is the third one. Google’s documentation lists address as a required property for local business markup, but if your profile hides the address, publishing your home street in the code undoes that choice. Anyone can read structured data with a browser’s view-source. Give the city, state and ZIP you already show publicly and stop there. The same goes for geo: latitude and longitude to five decimal places is your house, so leave it out.
Why matching your Business Profile matters
Google’s structured data guidelines say not to mark up content that isn’t visible to readers of the page. So the areas in your areaServed also need to appear as text on the page, usually a short “Areas we serve” list. And the Business Profile allows up to 20 service areas, set by city, ZIP code or region rather than a radius. Using that same list in three places (profile, page text, markup) gives Google one consistent story. A different list in each place gives it three.
A working example for a service area business
Here’s the shape of the markup for a made-up plumber based in east Dallas with the address hidden on its Business Profile. Swap in your own details, and only include properties that are true and visible on your site.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Plumber",
"@id": "https://example.com/#business",
"name": "Example Plumbing",
"url": "https://example.com/",
"telephone": "+1-214-555-0100",
"logo": "https://example.com/logo.png",
"image": "https://example.com/van.jpg",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"addressLocality": "Dallas",
"addressRegion": "TX",
"postalCode": "75214",
"addressCountry": "US"
},
"areaServed": [
{"@type": "City", "name": "Dallas, TX"},
{"@type": "City", "name": "Richardson, TX"},
{"@type": "City", "name": "Garland, TX"},
{"@type": "City", "name": "Mesquite, TX"}
],
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "07:00",
"closes": "18:00"
}],
"sameAs": [
"https://www.facebook.com/exampleplumbing",
"https://www.yelp.com/biz/example-plumbing-dallas"
]
}
</script>
A few choices in there are deliberate:
- The name is the real-world nameIt’s exactly what’s on the van, the invoices and the Business Profile. “Example Plumbing Dallas Emergency Drain Repair” is keyword stuffing, here as much as on Google Maps.
- The cities are named, not drawnThe profile uses named places, so the markup does too. A
GeoCircleradius is valid schema.org, but it says something different from your profile, and it can’t be shown as readable text on the page. @idgives the business one identityUse the same@idon every page that mentions the business so separate blocks connect instead of describing four different companies.sameAspoints to profiles you controlYour real social and directory listings with matching details. Leave out anything with an old phone number until it’s fixed.- No ratings blockSee the mistakes section below.
Put the block on your homepage, or on your contact page if that’s where the business details live. It doesn’t need to sit in the footer of every page. A plugin such as Yoast or Rank Math can output most of it on WordPress, but check what it actually produces. Plugin defaults often fill in a street address from your settings.
Service pages and city pages: when to add Service markup
If you have a dedicated page for each core service, you can describe it with a Service block that points back to the business through provider (using the same @id) and carries its own areaServed. That’s useful when coverage differs by service, for example drain cleaning across the whole metro but water heater installs only in three cities.
City pages are where this goes wrong. A page for each suburb with the same paragraph and a swapped city name is a doorway page whether it has schema or not, and adding areaServed doesn’t make it useful. Only mark up a city page that has something specific to say about that city: the jobs you do there, local permit quirks, response times from your base. If you can’t write that, one solid “areas we serve” section beats twenty thin pages.
Mistakes that make schema work against you
- Publishing the address you hid. The most common one, usually from a plugin default or a template copied from a storefront guide.
- Inventing an address. A virtual office or a mailbox in a better ZIP code doesn’t become real because it’s in JSON-LD. Google’s Business Profile rules don’t accept those addresses either, and our post on failed Google Business Profile video verification covers why they cause verification trouble.
- Listing every town within 80 miles. The Business Profile help page says your overall area shouldn’t extend more than about two hours’ drive from your base. A markup list far bigger than your profile list adds nothing.
- Marking up your own reviews. Google’s review snippet guidelines say pages using
LocalBusinessorOrganizationmarkup are ineligible for review stars when the business controls the reviews about itself. That includes embedded Google review widgets. LeaveaggregateRatingout. - Hours that don’t match. If the profile says 7–6 and the markup says 8–5, one of them is wrong. Update both when you change hours.
- Two competing blocks. A theme outputs one
LocalBusiness, an SEO plugin outputs another with different details. Run the test below and delete one.
How to test your markup in ten minutes
Paste your page URL into Google’s Rich Results Test and the Schema Markup Validator. The first shows what Google can read and whether the page qualifies for any rich result. The second checks the markup against schema.org more broadly and will show areaServed and other properties Google’s tool doesn’t report on.
- Confirm there’s exactly one business block and that its name, phone and city match your Business Profile character for character.
- Search the output for
streetAddress. If you’re a hidden-address business and it’s there, find which plugin or theme is adding it. - Check every
areaServedentry also appears as visible text on the page. - Treat errors as fixes and warnings as judgment calls. A missing optional property isn’t a problem if the fact doesn’t apply to you.
- After changes, use URL Inspection in Google Search Console to request a recrawl of the page.
Does schema help you show up in AI Overviews and ChatGPT?
Not directly, and anyone promising otherwise is guessing. Google’s page on AI features and your website says there’s “no special schema.org structured data” you need to appear in AI Overviews or AI Mode. Its structured data policies also say correct markup doesn’t guarantee any feature will show.
What schema does is state your basic facts (who you are, what you do, where you work, how to reach you) in a format machines don’t have to guess at. AI tools that recommend local businesses lean on the same signals as local search: a complete Business Profile, consistent details across directories, reviews, and a site that clearly says what you do and where. Schema supports the last one. It won’t make up for missing the others, and it’s a small part of the work behind our local SEO service for exactly that reason.
Where to start this week
Open your Business Profile and write down three things: whether the address is shown or hidden, your exact business name, and your service area list. Then run your homepage through the Rich Results Test and compare. If the markup shows a street address you hid, names areas your profile doesn’t, or doesn’t exist at all, that’s your fix list. Add a visible “Areas we serve” section before the markup, not after.
If you’re in Dallas–Fort Worth, our Dallas local SEO page covers how service businesses there compete in the map pack, and trades can find more on our professional services page. If your site needs rebuilding anyway, our website design work adds this markup as standard. Or start with the free visibility audit below. It checks your markup, profile and listings against each other and tells you what doesn’t match.
Questions people ask
Do I need schema markup if I already have a Google Business Profile?
Should I use GeoCircle or a list of cities for areaServed?
Can I put my service area schema in Google Tag Manager?
Will schema markup get my business stars in Google search?
Does your markup match your profile?
Our free visibility audit compares your website schema, Google Business Profile and listings, and shows you every detail that doesn’t line up.