Guide

Local business schema for contractors: a worked example

By Youssef Hodaigui, Mindflow Marketing · Last reviewed November 1, 2026

Good LocalBusiness markup for a contractor is one block of code, usually on the home page, that uses your trade's type (such as Plumber), states your name and address, and adds the phone, website, hours and service towns your page already shows. Google requires only `name` and `address`. If you hide your address on Google, the markup shouldn't reveal it either.

This guide gives a worked example for a service-area business, shows which properties Google documents and which come only from schema.org, and walks through testing. For what the term means, see our glossary entry on LocalBusiness schema.

Start here:

  1. Pick the most specific trade type that's true.
  2. Fill in only facts the page visibly shows.
  3. Leave out star ratings for your own business.
  4. Test the code in Google's Rich Results Test before it goes live.
  5. Check the live page with Search Console's URL Inspection tool.
01

Which properties does Google actually use?

Google's local business documentation requires two properties, `name` and `address`, and recommends others such as `telephone`, `url`, `openingHoursSpecification` and `geo`. Its organization documentation adds `logo`, `sameAs` and `description`, and says local businesses should follow both. Anything else, such as `areaServed`, is schema.org vocabulary Google hasn't documented.

PropertyGoogle local business docsGoogle organization docsFor a contractor that hides its address
`name`RequiredRecommendedUse your real business name
`address`Required: "Include as many properties as possible"Recommended: "physical or mailing"In our view, city, state and ZIP only
`telephone`Recommended, with country and area codeRecommendedUse the number on the page
`url`Recommended: "must be a working link"RecommendedYour home page or location page
`openingHoursSpecification`Recommended, times in hh:mm:ssNot listedUse if you publish hours
`geo`Recommended, at least 5 decimal placesNot listedIn our view, leave out: it would pinpoint the address you hid
`priceRange`Recommended, under 100 charactersNot listedOptional
`image`Used in Google's examplesNot listedA real photo of your crew, van or work
`logo`, `sameAs`, `description`Not listedRecommendedUse
`areaServed`Not listedNot listedUse: schema.org's property for the places you serve
`aggregateRating`, `review`Only "for sites that capture reviews about other local businesses"Not listedLeave out
`serviceArea`Not listedNot listedDon't use: schema.org says `areaServed` supersedes it

Sources: Google Search Central, Local business structured data and Organization structured data (both last updated September 8, 2026); schema.org LocalBusiness and areaServed (version 30.1). All read November 1, 2026. Every property above exists on schema.org's LocalBusiness type.

02

What does the markup look like for a business that hides its address?

Like the example below, which uses a made-up company. It names the trade type, gives the business name, website, phone, hours and a photo, lists the towns served with `areaServed`, and gives only the city, state and ZIP in `address`. Google's documentation doesn't cover service-area businesses, so the address choice here is our view.

PropertyExample valueGoogle documents it?schema.org only?
`@type`PlumberYes: local business doc, "most specific" subtypeNo
`@id`https://www.example.com/#businessUsed to link items (general guidelines); JSON-LD keywordNot a property
`name`Example Plumbing Co.Yes: requiredNo
`url`https://www.example.com/Yes: recommendedNo
`telephone`Your number with +1 and area code (placeholder)Yes: recommendedNo
`image`https://www.example.com/images/crew-and-van.jpgIn Google's examples, not in the property listMostly
`logo`https://www.example.com/images/logo.pngYes: organization docNo
`description`Plumbing repair, drain cleaning and water heater replacement for homes in Springfield, Chatham and Rochester, IllinoisYes: organization docNo
`address` → `addressLocality`SpringfieldYes: `address` requiredNo
`address` → `addressRegion`ILYesNo
`address` → `postalCode`62701YesNo
`address` → `addressCountry`USYesNo
`address` → `streetAddress`Left out (in our view, when the address is hidden)YesNo
`areaServed`City: Springfield, IL · Chatham, IL · Rochester, ILNoYes
`openingHoursSpecification`Monday to Friday, opens 07:00:00, closes 18:00:00; Saturday, opens 08:00:00, closes 12:00:00Yes: recommendedNo
`sameAs`Your Facebook page and BBB profile addressesYes: organization docNo

Example only. "Example Plumbing Co." is not a real business, and example.com is a domain reserved for examples. Replace every value with your own.

The markup itself goes in a single JSON-LD script tag in the page's HTML; Google describes JSON-LD as a notation "embedded in a script tag in the head and body elements of an HTML page." Your site builder's custom-code setting or an SEO plugin can place it for you.

What the less obvious rows do. `@type` is your trade: Plumber sits under schema.org's HomeAndConstructionBusiness, itself a LocalBusiness type, and our glossary entry lists the other trade types. `@id` is a fixed label for this business, so other markup on your site can point to the same entity; it doesn't need to be a real page.

The address leaves out the street. In our view, a business that hides its address on its Google Business Profile, as Google tells service-area businesses to do, shouldn't publish it in code. If your street address already appears on your site, include it. For `areaServed`, schema.org's definition is "The geographic area where a service or offered item is provided," and City is its type for "A city or town." List the towns your pages actually describe.

Copy the `description` from text the page shows; Google says "Don't mark up content that is not visible to readers of the page." Use `sameAs` for profiles you own and control, such as your BBB profile or social pages.

03

What changes if customers visit your shop?

Two things: the full street address and map coordinates. A showroom, yard or office that customers visit during business hours should show its full address on the page and in the markup. Google recommends `geo` coordinates with a precision of "at least 5 decimal places." Everything else stays, including `areaServed` if you also travel.

Add these two rows to the example above:

PropertyExample valueGoogle documents it?schema.org only?
`address` → `streetAddress`100 Example StreetYesNo
`geo` → `latitude`, `longitude`39.78172, -89.65015Yes: recommended, "at least 5 decimal places"No

Don't use a mailbox or a virtual office to look local. Google's Business Profile rules don't accept P.O. boxes or mailboxes as a business address, and a virtual office, an address the business doesn't operate from, "isn't eligible for a Business Profile." If the profile can't use an address, the markup shouldn't either.

04

Which page should carry the markup?

The page that describes your business: for most single-location contractors, the home page. Google's organization guide recommends "your home page, or a single page that describes your organization," and its general rules say to "Put the structured data on the page that it describes." Service pages don't need their own copy of the LocalBusiness block.

With more than one location, give each location its own page and its own block, with that location's address, phone, hours and `url`. Google describes `url` as "The fully-qualified URL of the specific business location." Each block gets its own `@id`.

Watch for duplicates. In our view, the most common placement problem is two blocks with different facts: one added by the theme, one by an SEO plugin, and sometimes a third pasted in by hand. Search engines then see two versions of your hours or phone. Keep one, and switch off the others.

05

What if you do more than one trade?

List every trade type that's true, as an array. Google says "If you have multiple types, specify them as an array (additionalType isn't supported)." A plumbing and HVAC company would use `"@type": ["Plumber", "HVACBusiness"]`. Each type should match services your website and Business Profile actually describe. If no page on your site mentions HVAC work, leave HVACBusiness out.

When your trade has no schema.org type, use the closest broader one, such as HomeAndConstructionBusiness or LocalBusiness, rather than inventing a name (trade types). A made-up type isn't schema.org vocabulary, so search engines can't recognize it.

06

How do you test LocalBusiness markup?

In four steps, all free. Test the code in Google's Rich Results Test before it goes live, check schema.org-only properties in the Schema Markup Validator, publish on one page and inspect it with Search Console's URL Inspection tool, then watch Search Console after future site changes. Google's own advice is to "fix any critical errors" first.

  1. Rich Results Test. Paste the code or the page URL. It "shows which rich result types were found on the page" and lists errors and warnings. Fix errors before publishing.
  2. Schema Markup Validator (validator.schema.org). It checks properties Google's tool may not report on, such as `areaServed`, against the schema.org vocabulary.
  3. URL Inspection. After publishing, Google's local business guide says to check a few pages with the URL Inspection tool and allow time for recrawling. Its live test "fetches and examines the URL in real time."
  4. After site changes. Google notes that markup can break because of templating or serving problems, and its rich result status reports in Search Console help you spot that. Re-run the Rich Results Test after a theme, plugin or page-builder update.

Our technical SEO checklist puts this check in order with the rest of your site's health checks.

07

What are the most common LocalBusiness schema mistakes?

Star ratings for your own business, facts the page doesn't show, and properties that don't exist or aren't supported. Each one either breaks Google's structured data rules or describes a different business from the one on your page. Most are quick to fix once you know where to look.

MistakeWhy it's a problemFix
Star ratings for your own businessGoogle recommends `aggregateRating` only for sites reviewing other businesses; 699 of the 4,433 contractor homepages we crawled still had itRemove it; show reviews as text with a link to the profile
A street address the page doesn't showGoogle: "Don't mark up content that is not visible"Match the page, or drop `streetAddress`
`serviceArea` instead of `areaServed`schema.org marks `serviceArea` as supersededRename to `areaServed`
`additionalType` for a second tradeGoogle: "additionalType isn't supported" for multiple typesUse an array of types
Hours as "7am–6pm"Google wants `opens` and `closes` "in hh:mm:ss format"Use "07:00:00" and "18:00:00"
Phone without country codeGoogle: include "the country code and area code"Start with +1
`url` pointing to a redirect or old pageGoogle: "The URL must be a working link"Use the final, live address
Hours or phone that differ from your profileTwo sets of facts about one businessUpdate both the same day
Two LocalBusiness blocks from theme and pluginConflicting facts on one page (our view)Keep one source

Crawl figure: Mindflow contractor website study, saved homepages, October 2026, from the saved files as collected.

08

What won't LocalBusiness schema do?

It won't rank you, put you on the map or get you into AI answers alone. A structured data manual action can cost a page its rich-result eligibility, but Google says it "doesn't affect how the page ranks in Google web search." Markup confirms what your page already states. Our schema markup entry covers AI features and our crawl figures.

09

Frequently asked questions

Do I need a plugin to add LocalBusiness schema? No. A JSON-LD block can go in your page's code through your site builder's custom code setting, and Google recommends JSON-LD "if your site's setup allows it." Plugins work too. Whichever you use, run the page through the Rich Results Test to see what's actually output, and make sure only one tool is adding the block.

Should I add star ratings from my Google reviews? No. Google recommends review markup on a local business only "for sites that capture reviews about other local businesses," so stars about yourself on your own site won't qualify. Show your rating as text with a link to your Google profile instead. Our aggregate rating entry explains the rule in more detail.

Do I need to update the markup when my hours change? Yes, the same day you update your Business Profile and the hours on your page. Google's documentation also supports seasonal closures, with `validFrom` and `validThrough` dates in YYYY-MM-DD format. Out-of-date hours in your markup give search engines a second, wrong answer to "are they open?"

Should my home address go in the markup? In our view, no, if you've hidden it on your Business Profile. Google tells service-area businesses to "hide your business address from customers," and markup shouldn't publish what the profile hides. Use your city, state and ZIP and list your towns in `areaServed`. Google's markup documentation is silent on this case.

How long before Google reads new markup? It varies. Google's local business guide says to allow time for recrawling and reindexing, and notes it "may take several days after publishing a page for Google to find and crawl it." Check the page with URL Inspection after a few days, then watch the rich result status reports in Search Console for errors.

10

Sources

All read November 1, 2026.

More guides on websites are in websites. Want to know whether your markup, profile and listings agree? Get a free AI Visibility Review.