It is 11 p.m. A woman in your service area has water spreading across her kitchen floor. She grabs her phone and says four words: “emergency plumber near me.”
Six businesses could take that job. She calls one.
Here is what stings. She rarely calls the best plumber. She calls the one whose website told Google, in plain code, “plumber, this town, open now, here is the number.”
That code is called schema markup. It takes about an hour to set up. Most trade sites either skip it or do it wrong. Most schema guides are written for shops and blogs.
This guide fixes that. You get copy-paste code for your trade, the mistakes that waste months, and a way to add it all in WordPress without touching code.
Quick answer: Schema markup is a small block of code you add to your website. It tells Google and AI tools what your business is, where you work, what you fix, and how people can book you. Home-service businesses should not use the generic LocalBusiness type. Use the exact type instead, like Plumber, Electrician, HVACBusiness, or RoofingContractor, plus Service markup on each service page.
What schema markup does for a service business
Search engines read your page like text. Schema turns that text into facts they can trust.
Without schema, Google guesses that “Call us anytime” means you are open 24 hours. With schema, you say it in plain data.
Here is what that gets you.
| What you gain | What it looks like |
| Better local matching | Google links your site, your Google Business Profile, and your service area as one business |
| Rich results | Breadcrumbs, star ratings on product-style pages, sitelinks, business info panels |
| AI answers | ChatGPT, Gemini, Perplexity, and AI Overviews can pull your name, phone, and service area as a fact, not a guess |
| Voice search | “Find an emergency electrician near me open now” needs hours and area data in a machine-readable form |
Important truth most guides skip: schema is not a ranking factor. Google has said this many times. Schema makes you eligible for extras and makes you easier to quote. Rankings still come from reviews, proximity, links, and content. Treat schema as a visibility multiplier, not a magic switch.
That said, the AI part is new and it matters. AI tools need clear entity data to name a business in an answer. A plumber with clean Plumber markup, a defined service area, and matching phone number is far easier to cite than one with none.
Good Read: Service Schema: How to Mark Up Your Services for Search and AI
The only schema types Homeservice Businesses really need

You do not need thirty schema types. You need five.
| Schema type | Where it goes | Why it matters |
| Plumber, Electrician, HVACBusiness, etc. | Homepage and contact page | Your business identity, phone, hours, and area |
| Service | Each service page — drain cleaning, panel upgrade, AC repair | Tells Google what you actually sell and where |
| FAQPage | Service and city pages | Helps AI tools pull direct answers from your page |
| BreadcrumbList | Every page | Shows the site path in search results |
| Review and AggregateRating | Only where real reviews are shown on the page | Trust signals, with strict rules — see section 8 |
Two optional ones that pay off: Person for licensed techs, and WebSite plus Organization for site-wide identity.
Pick your exact schema type (do not use LocalBusiness)
This is the single biggest gap in competing guides. They tell you to use LocalBusiness. That is like telling a customer you are “a business.” True, but useless.
Schema.org has a branch called HomeAndConstructionBusiness built for trades. Use the closest match.
| Your trade | Use this @type |
| Plumbing | Plumber |
| Electrical | Electrician |
| Heating, cooling, AC | HVACBusiness |
| Roofing | RoofingContractor |
| Painting | HousePainter |
| Locksmith | Locksmith |
| General contracting, remodels | GeneralContractor |
| Moving | MovingCompany |
| Landscaping, cleaning, pest control, appliance repair | HomeAndConstructionBusiness or ProfessionalService |
Why it matters: a more specific type gives search engines more meaning with the same amount of code. Plumber already implies local, physical, home service. LocalBusiness implies nothing.
Copy-paste code for plumbers
Put this on your homepage. Change every value to your real details. Nothing here should be invented, because schema must match what people can see on the page.
json
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Plumber",
"@id": "https://example.com/#business",
"name": "Rapid Flow Plumbing",
"url": "https://example.com/",
"logo": "https://example.com/images/logo.png",
"image": "https://example.com/images/service-van.jpg",
"telephone": "+1-555-123-4567",
"email": "book@example.com",
"priceRange": "$$",
"description": "Licensed plumbers in Springfield handling drain cleaning, burst pipes, water heaters, and 24 hour emergency callouts.",
"address": {
"@type": "PostalAddress",
"streetAddress": "742 Evergreen Terrace",
"addressLocality": "Springfield",
"addressRegion": "IL",
"postalCode": "62701",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 39.7817,
"longitude": -89.6501
},
"areaServed": [
{ "@type": "City", "name": "Springfield" },
{ "@type": "City", "name": "Chatham" },
{ "@type": "City", "name": "Rochester" }
],
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "07:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Saturday"],
"opens": "08:00",
"closes": "14:00"
}
],
"paymentAccepted": "Cash, Credit Card, Debit Card",
"currenciesAccepted": "USD",
"hasMap": "https://maps.google.com/?cid=YOUR_GOOGLE_MAPS_CID",
"sameAs": [
"https://www.facebook.com/yourpage",
"https://www.yelp.com/biz/yourbusiness",
"https://www.google.com/maps/place/yourbusiness"
]
}
</script>
The three fields people get wrong
telephone. Use one number with the country code. Use the same number that is on your Google Business Profile and on your website header. If they differ, you have just told Google you might be two businesses.
sameAs. This is not decoration. It is how you connect your site to your Google Maps listing, your Facebook page, and your review profiles. AI tools use these links to confirm you are a real, single business. Add your Google Maps place URL first.
@id. That #business anchor lets every other page on your site point back to this one business instead of repeating it. You will see it used in the next section.
Copy-paste code for electricians and service pages
Your homepage says who you are. Your service pages say what you sell. Those are two different jobs and they need two different schema types.
Here is a Service block for an electrician’s “Electrical Panel Upgrade” page.
json
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Service",
"@id": "https://example.com/panel-upgrades/#service",
"name": "Electrical Panel Upgrade",
"serviceType": "Electrical panel replacement and upgrade",
"description": "Full replacement of outdated fuse boxes and 100 amp panels with permitted 200 amp service, including inspection sign-off.",
"provider": {
"@type": "Electrician",
"@id": "https://example.com/#business",
"name": "Bright Spark Electric",
"telephone": "+1-555-987-6543"
},
"areaServed": [
{ "@type": "City", "name": "Springfield" },
{ "@type": "City", "name": "Chatham" }
],
"offers": {
"@type": "Offer",
"priceCurrency": "USD",
"priceSpecification": {
"@type": "PriceSpecification",
"minPrice": "1800",
"maxPrice": "4200",
"priceCurrency": "USD"
},
"availability": "https://schema.org/InStock",
"url": "https://example.com/panel-upgrades/"
},
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Panel and wiring services",
"itemListElement": [
{ "@type": "Offer", "itemOffered": { "@type": "Service", "name": "200 amp panel upgrade" } },
{ "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Sub-panel installation" } },
{ "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Fuse box replacement" } }
]
}
}
</script>
No storefront? Here is how to handle service areas
This is the question that fills forum threads. “I run my plumbing business from my house. Do I put my home address in schema?”
Here is the practical answer.
Google’s LocalBusiness rich result requires a name and address. There is no version of the markup that skips address entirely and still qualifies.
But you have options:
- Use your address in schema, hide it on Google Business Profile. Google lets service-area businesses hide the address on the profile while still verifying it. Your website schema can carry the address without publishing a “walk in here” invitation.
- Use a real commercial address if you have one. A yard, a shop, a unit. Never a virtual office or mailbox, which violates Google’s guidelines.
- Define your area properly so Google knows how far you drive.
Two ways to define the area. Use whichever fits.
Named towns (clearest for AI tools):
json
"areaServed": [
{ "@type": "City", "name": "Springfield" },
{ "@type": "City", "name": "Chatham" },
{ "@type": "State", "name": "Illinois" }
]
Radius from a point (best for "we cover 40 km"):
json
"serviceArea": {
"@type": "GeoCircle",
"geoMidpoint": {
"@type": "GeoCoordinates",
"latitude": 39.7817,
"longitude": -89.6501
},
"geoRadius": "40000"
}
geoRadius is in meters. 40000 means 40 km.
A warning about city pages. Many trades build fifty near-identical pages, one per town, each with schema swapped out. Google calls those doorway pages and they get filtered. If you build city pages, each one needs real local content: a job you did there, a photo, a local permit note, a nearby landmark. The schema is the last step, not the trick.
24/7 emergency hours in schema
If you take emergency calls, say it in data. This is a real competitive edge for trades, because “open now” filters and voice search both depend on it.
For true 24/7 coverage:
json
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Monday","Tuesday","Wednesday",
"Thursday","Friday","Saturday","Sunday"
],
"opens": "00:00",
"closes": "23:59"
}
]
If your office is 8 to 5 but your emergency line runs all night, do not claim 24 hours for the whole business. Mark the office hours honestly and add a second contact point for emergencies:
json
"contactPoint": [
{
"@type": "ContactPoint",
"telephone": "+1-555-123-4567",
"contactType": "customer service",
"hoursAvailable": {
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "08:00",
"closes": "17:00"
}
},
{
"@type": "ContactPoint",
"telephone": "+1-555-123-9999",
"contactType": "emergency",
"availableLanguage": ["en-US","es-US"]
}
]
Also worth adding if you serve non-English speakers. availableLanguage is a small field that quietly wins jobs.
Reviews and star ratings: the rule most sites break
You have seen sites with gold stars in search results. You want that. Here is the rule that stops most trades from getting it.
Google does not show review stars for reviews you write about yourself. That includes LocalBusiness and Organization markup on your own site. It is called self-serving review markup and it has been ineligible since 2019.
So what actually works?
| Approach | Star result in Google? | Worth doing? |
| Pasting your Google reviews into AggregateRating on your homepage | No | No. Risky and pointless |
| Real reviews collected on your own site for a specific Service or Product page | Sometimes | Yes, if reviews are genuine and shown on the page |
| Third-party review platform widget with its own markup | Often yes, via the platform | Yes |
| Review schema with no visible reviews on the page | No | Never do this. It can trigger a penalty |
The safe path: collect real reviews on your site, show them on the page, mark up what is visible, and never invent a number.
License and technician markup (almost nobody does this)
Trust is the whole game in home services. People are letting a stranger into their house. Yet almost no trade site marks up its licenses or its people.
This is free ground. Add it.
json
"employee": {
"@type": "Person",
"name": "Dave Morales",
"jobTitle": "Master Plumber",
"hasCredential": {
"@type": "EducationalOccupationalCredential",
"credentialCategory": "license",
"name": "Illinois Master Plumber License",
"identifier": "IL-PL-058812",
"recognizedBy": {
"@type": "Organization",
"name": "Illinois Department of Public Health"
}
}
}
Why this matters right now: AI answers weigh trust signals heavily. When an assistant is picking which of six plumbers to name, a business with a marked-up license number, a named master tradesperson, and a linked Google Maps profile is a safer pick than an anonymous one. This is the clearest example of schema helping AI visibility even though it will never show a rich result.
Same logic applies to award, memberOf for trade associations, and knowsAbout for specialties.
How to add all of this in WordPress with Schema Engine AI
You do not have to paste JSON-LD into your theme files. If you do that, one theme update can wipe it out.
Schema Engine AI by RadiusTheme handles this inside WordPress. It generates JSON-LD, validates it against Google’s requirements, and scores every page. It works next to Yoast SEO or RankMath without fighting them. Here is the setup for a home-service site.
Step 1: Turn it on

Install and activate the plugin. Open SchemaEngine AI › Settings › General and switch on Enable Schema. Nothing outputs until that toggle is on.
Step 2: Fill in Site Info
Go to Settings › Schema › Site Info. This becomes your business identity everywhere else.

| Field | What to enter |
| Site Represents Type | Organization |
| Sub-Category | LocalBusiness. Select your business sub category correctly. This unlocks Address, Telephone, Price Range, and Opening Hours |
| Name | Legal business name, spelled exactly as on your Google Business Profile |
| Business Logo | Upload. Minimum 112 x 112 pixels |
| Telephone | Required. Include the country code |
| Price Range | $$ or $149-$900 |
| Address | Add one card per branch. Each becomes its own PostalAddress |
| Geo Coordinates | Right-click your spot in Google Maps and copy. Latitude first. Set Radius if you drive to customers |
| Opening Hours | One row per day, 24-hour format. 3 p.m. is 15:00. Split shift means two rows. For 24/7, use 00:00 to 23:59 |
| Help Center | Add your emergency line as a second contact point, type emergency |
| Page | Assign your About and Contact pages. Google uses these to confirm identity |
Click Save Change.
Step 3: Map your post types
Go to Settings › Schema › Post Type Mapping. Pick a schema type for each post type on the left, leave Auto-Generate on, and save each one separately. New pages then inherit schema the moment you publish.

Step 4: Add FAQs
Use the AI FAQ generator on service and city pages. It reads the page and outputs valid FAQPage JSON-LD.
Two rules: edit every answer to match your real prices and timelines, and keep the FAQ block visible on the page. Hidden FAQ markup breaks Google’s rules.
How to test your markup
Three tools, three jobs. Use all of them.
| Tool | What it tells you |
| Google Rich Results Test | Which rich results your page qualifies for, plus errors and warnings |
| Schema Markup Validator | Whether your code is valid schema.org, even for types Google ignores |
| Google Search Console | Whether Google actually sees your markup on the live site over time |
A page can pass the validator and still fail the Rich Results Test. That is normal. The validator checks syntax. The Rich Results Test checks Google’s specific requirements.
Also do this: open your live page, view page source, and search for application/ld+json. If you see your business twice, you have a duplicate problem to fix.
Then check Search Console under Enhancements every month. Errors appear there weeks before you would ever notice them yourself.
Good Read: Schema for Google AI Mode: What Actually Works
Common mistakes from real forum threads
These come up constantly in SEO communities and trade groups.
“I added schema and nothing happened.” Expected. Schema is not a ranking factor. If you had no reviews and no local citations before, you still have none. Schema makes your existing signals readable, it does not create new ones.
Different phone numbers in schema, in the site footer, and on Google Business Profile. Call tracking numbers cause this. If you use tracking, keep your main number in schema and in your GBP, and use dynamic number swapping on the visible page only.
Copying Google reviews onto the site with AggregateRating. Not eligible for stars, against the terms of the review platform, and a risk to your site. Skip it.
Running two schema plugins at once. Yoast plus a schema plugin plus a theme that adds its own markup equals three LocalBusiness blocks. Google may pick the worst one. Turn off all but one.
Marking up services you do not have a page for. If your schema lists “sewer line replacement” and there is no page, no photo, and no mention on the site, that is markup with nothing behind it. Build the page first.
Using LocalBusiness when Plumber exists. Costs nothing to fix. Gains meaning immediately.
Setting up schema once and never touching it. You change your hours for winter. You add a new town. You raise prices. Your schema still says the old thing. Put a fifteen minute schema check in your calendar every quarter.
Marking up an address you do not actually operate from. Virtual offices and mailbox addresses break Google’s guidelines and get listings suspended. Not worth it.
What results to expect, and when
Set expectations honestly, because unclear expectations are why people quit at week three.
| Timeframe | What usually happens |
| Days 1 to 7 | Google recrawls your pages. Markup starts appearing in the Rich Results Test |
| Weeks 2 to 4 | Search Console starts reporting detected structured data. Breadcrumbs may appear in results |
| Weeks 4 to 8 | Better matching for “near me” and “open now” queries. More consistent business info panels |
| Months 2 to 6 | AI tools begin naming your business more often, especially if your GBP, site, and citations all agree |
What schema will not do: it will not lift a site with thin content, no reviews, and no local links. Fix those first, then add schema so the good signals you have are readable.
Frequently Asked Questions (FAQs)
Do plumbers and electricians really need schema markup?
Yes, if you want AI tools and voice search to name your business. Schema is the only way to state your service area, emergency hours, and license in a form machines can read without guessing.
Should I use LocalBusiness or Plumber schema?
Use Plumber. It is a subtype of LocalBusiness, so you keep every benefit of LocalBusiness and add meaning on top. Same for Electrician, HVACBusiness, and RoofingContractor.
Can I add schema without an address?
Google’s LocalBusiness rich results require a name and address, so you should include one. If you work from home, include the address in schema and hide it on your Google Business Profile as a service-area business.
Does schema markup improve rankings?
Not directly. It makes you eligible for rich results and easier for AI systems to quote. Rankings still come from reviews, proximity, links, and content quality.
Will FAQ schema show a dropdown in Google?
For almost all businesses, no. Google removed FAQ rich results for most sites in 2023. FAQ schema is still worth adding because AI tools and answer engines read it.
What if I already use Yoast or RankMath?
Keep using them for titles, meta, and sitemaps. Let one tool own business schema. Schema Engine AI is built to run alongside both, and includes conflict controls so you do not double up.
Your next step
Do these three things this week.
- Change your type. Swap LocalBusiness for Plumber, Electrician, or your exact trade. Ten minutes.
- Fill in your Site Info once. Name, phone, address, geo coordinates, service radius, real hours, and your About and Contact pages. Every other page will build from it.
- Test one service page in the Rich Results Test and fix whatever it flags.
If you run WordPress, Schema Engine AI handles the generation, validation, and health scoring in one place.
The trades that win local and AI search over the next year will not be the ones with the flashiest sites. They will be the ones whose business facts are clear, consistent, and machine-readable. That starts with schema.



