Guide

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.

Get foundfaster
Service area business schema guide: LocalBusiness markup for businesses with a hidden address

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: HomeAndConstructionBusiness works as a fallback for cleaners, landscapers and pest control, which don’t have their own types.
  • Mobile professionals: ProfessionalService for mobile notaries or bookkeepers who visit clients, AutoRepair for 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 setupTypeaddressareaServedgeo
Storefront only (salon, clinic, shop)Specific subtypeFull street addressOptionalYes, your front door
Hybrid: customers visit, and you travelSpecific subtypeFull street address, shown on the siteYes, same areas as your profileYes
Service area only, address hidden (most trades, home-based)Specific subtypeCity, state, ZIP, country. No streetYes, same areas as your profileLeave it out
Online only, no in-person contactOrganizationOptional mailing addressOnly 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 GeoCircle radius is valid schema.org, but it says something different from your profile, and it can’t be shown as readable text on the page.
  • @id gives the business one identityUse the same @id on every page that mentions the business so separate blocks connect instead of describing four different companies.
  • sameAs points 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

  1. Publishing the address you hid. The most common one, usually from a plugin default or a template copied from a storefront guide.
  2. 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.
  3. 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.
  4. Marking up your own reviews. Google’s review snippet guidelines say pages using LocalBusiness or Organization markup are ineligible for review stars when the business controls the reviews about itself. That includes embedded Google review widgets. Leave aggregateRating out.
  5. 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.
  6. 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.

  1. Confirm there’s exactly one business block and that its name, phone and city match your Business Profile character for character.
  2. Search the output for streetAddress. If you’re a hidden-address business and it’s there, find which plugin or theme is adding it.
  3. Check every areaServed entry also appears as visible text on the page.
  4. 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.
  5. 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?
You don’t need it, but it helps. Your Business Profile does most of the work in the map pack. Schema tells Google that your website belongs to the same business, with the same name, phone number and service area. It takes about an hour to set up and rarely needs changing, so it’s usually worth doing once your profile is in order.
Should I use GeoCircle or a list of cities for areaServed?
For most small service businesses, list named cities or ZIP codes. That matches how Google Business Profile defines service areas, and you can show the same list as text on the page. A GeoCircle is valid schema.org markup, but it can’t be shown to readers in the same way and doesn’t match a profile that names places.
Can I put my service area schema in Google Tag Manager?
Google can read JSON-LD that’s added with JavaScript, including through Tag Manager, but it’s easier to get wrong and harder to check. Adding it directly in the page template or through your SEO plugin is simpler. Whichever method you use, test the live URL in the Rich Results Test to confirm Google sees it.
Will schema markup get my business stars in Google search?
Usually not. Google’s review snippet rules say businesses that control the reviews about themselves aren’t eligible for star ratings from LocalBusiness or Organization markup. That includes embedded review widgets. Stars in the map pack come from your Google reviews, not from code on your website.

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.