The Bulletin Schema

No. 019

LocalBusiness schema for contractors: which type to use

Schema.org has a specific type for plumbers, electricians, roofers and more. Using the generic LocalBusiness type instead is the most common mistake.

Schema.org has dozens of business types, and most contractor sites use the wrong one. Google's own documentation says to "use the most specific LocalBusiness sub-type possible," and for most trades a specific type already exists.

Find your specific type first

Common ones under the HomeAndConstructionBusiness branch include Electrician, GeneralContractor, HVACBusiness, HousePainter, Locksmith, MovingCompany, Plumber and RoofingContractor. If your trade isn't listed by name, HomeAndConstructionBusiness is a reasonable fallback, and plain LocalBusiness is the last resort.

Using the specific type over the generic one doesn't change how the page reads to a visitor. It changes how precisely a machine understands what you do, which matters more as AI assistants pull from this kind of data.

What Google says is required, and what it recommends

Google's structured data guidelines for LocalBusiness list only two required properties: name and address. Everything else, telephone, openingHoursSpecification, priceRange, review, aggregateRating, geo and url, is recommended but optional. That's a lower bar than most schema guides imply, but recommended isn't optional in practice: the more of these you include accurately, the more a search engine or AI assistant can do with the listing.

One requirement is easy to miss: Google says the url property "must be a working link." A dead or mistyped URL in the code is worse than leaving the property out.

A minimal, correct example

A plumber's homepage might carry something close to this, adjusted for the real business:

`` { "@context": "https://schema.org", "@type": "Plumber", "name": "Business name", "address": { "@type": "PostalAddress", "streetAddress": "123 Main St", "addressLocality": "City", "addressRegion": "ST", "postalCode": "00000" }, "telephone": "+1-000-000-0000", "url": "https://example.com", "openingHoursSpecification": { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], "opens": "08:00", "closes": "17:00" } } ``

Google recommends the JSON-LD format shown above over the older microdata or RDFa formats, and it's the easiest to maintain since it sits in one block instead of being woven through the visible HTML.

Where service-area businesses differ

If you work from a home base and don't want your address public, the fix isn't to leave the address out of the schema. It's to set your Google Business Profile to a service-area business, which hides the address from what visitors see while Google still uses it in the background for verification and proximity. The schema on your site should still match what's true, and matching your Business Profile and your website reduces the inconsistencies that make AI assistants and search engines trust a listing less.

Add Service schema for each offering

LocalBusiness describes the company. Service describes what it sells. A page for water heater installation can carry its own Service block naming the service and linking back to the provider. Doing this for each major service page is a bigger lift than the one homepage block, but it's what lets a single service page be understood on its own.

A common mistake: copying a template without changing the type

A lot of schema ends up wrong not from neglect but from copying a template built for a different kind of business. A generator or a theme's default snippet often ships with plain LocalBusiness, or with a type like Store or ProfessionalService because that's what the template author had on hand. It's easy to install it, see that a validator doesn't flag an error, and assume it's correct. A validator checks that the structure is valid schema, not that you picked the type that actually describes your business. Open your own site's code and check the @type value against the list above.

Multiple services, one schema strategy

If you offer more than one trade's worth of work, for instance a general contractor who also does roofing, schema.org supports listing more than one type as an array rather than forcing a single choice. That's the exception, not the rule: most single-trade businesses are better served by one accurate, specific type than by a broad list that dilutes the signal.

Questions

Do I need aggregateRating in my schema?

Only if you can populate it with real review data and keep it current. A stale or invented rating in your schema is worse than no rating at all, since it's a factual claim search engines can check.

Should every page carry LocalBusiness schema, or just the homepage?

Once, on the homepage or a site-wide template, is usually enough for the business-level information. Individual service and location pages are better served by Service or a page-specific type layered on top.

What happens if my schema doesn't match my Google Business Profile?

Nothing breaks outright, but a mismatch (different hours, different phone number) is exactly the kind of inconsistency that recent research says makes both search engines and AI assistants less confident in a listing.

Sources

Want a site that launches with answers already written?

Start a project