Skip to content
AI & Automation

Does Home-Service Schema Need a 25% CTR Fix in 2026?

Sep 14, 2026

Schema and structured data for home services is JSON-LD that labels the contractor’s legal name, phone, hours, services, and service area so Google and AI answers can quote a real truck, not a 50-mile radius the dispatcher will not drive. TL;DR: if the markup says you serve a county you decline on Friday afternoon, you will win the click and lose the review.

Demand is already concentrated on a few consumer platforms. ANGI service-request homeowners: 7.5 million (2024) according to the ANGI 2024 Annual Report (2024). That filing is public; treat 7.5 million as the pool of homeowners already asking a network for a pro, and treat your schema as the way independent search and chat still find you beside that network. Local searches in past 3 months: 84% of consumers according to BrightLocal (2026). Those searches still quote hours, towns, and fees; markup that disagrees with the dispatch board wins a click you will later refund in a review.

Key Takeaways

  • Home-service schema must match dispatcher truth: hours, NAP, services, and towns you actually book.

  • Structured-data CTR lift: 25% on 100,000 pages according to Google Search Central (Rotten Tomatoes case); eligibility still requires visible content.

  • Trigger rebuilds from job-complete and on-call calendar events, not from an annual website redesign.

  • Exception path: radius > towns you book, Offer price ≠ estimate tool, hours only in JSON-LD.

  • Human approval sits on emergency-fee language and on any city you add to AreaServed.

  • Build JSON-LD in the location template if you have one brand; buy a queue when many techs change on-call hours.

Why home-service markup fails in the field

A one-sentence definition: home-service schema is the machine-readable twin of the location page and the dispatch board. Useful types are HomeAndConstructionBusiness or LocalBusiness plus Service, areaServed, OpeningHoursSpecification, Offer for diagnostic fees, and FAQPage for questions printed on the page. Do not mark up a “24/7 emergency” claim if the on-call rotation ends at 10 p.m.

Google’s intro also tells publishers not to mark up information that is not visible to the user. That sentence kills the favorite contractor trick: a 40-mile GeoCircle in JSON-LD while the HTML names three towns. Food Network visit lift after enabling search features: 35% according to Google Search Central, a reminder that coverage on real pages beats a hidden radius.

Location-page copy still has to exist for the markup to describe. Pair this pillar with location page SEO for home services and with how to get home services cited in ChatGPT. Programmatic city pages without dispatcher truth fail the same way law-firm city pages fail; the cautionary analog is programmatic SEO for law firms.

Who this is for

This pillar is for owners, dispatch leads, and SEO developers at plumbing, HVAC, electrical, and similar trades who already have a location page, a job OS (often ServiceTitan or Housecall Pro), and a Google Business Profile. The pain is AI Overviews that quote a 24/7 claim the night tech will not honor, or rich results that show a diagnostic fee the estimate widget no longer uses.

Small businesses: 33.3 million U.S. firms according to the U.S. Small Business Administration (2023). Most home-service companies sit in that pool, which is why a single owner-operator can ship honest markup in a week—and why a multi-branch shop needs a queue.

Red flags: you will mark up towns you do not book; you will emit emergency hours the rotation does not cover; you will not let dispatch kill a Service node when you stop offering a job type.

If those flags are true, turn schema off until the HTML matches the truck.

LocalBusiness + Service field map

A schema markup checklist for home services teams is a field list you can paste into a ticket. @id per location, name matching GBP, telephone matching the tracking number you actually answer, address, geo of the shop (not the centroid of a county), openingHoursSpecification plus specialOpeningHoursSpecification for on-call, hasOfferCatalog / Service for job types on the page, areaServed as named towns, Offer for diagnostic fees the widget uses. Validate with the Rich Results Test after every hours change.

ServiceTitan is the job OS many of these shops already run; the schema job is to read the same schedule the dispatcher sees, not to invent a second calendar. US Tech Automations is the mismatch watcher that compares on-call hours to JSON-LD and opens a block ticket when they disagree; it does not dispatch techs. Price that watcher on pricing after the hours field is named.

Neutral vertical default: 10 (not a trades earn rate) according to US Tech Automations first-party mix-config (2026) on 12,514 pages counted 2026-08-24. Home services is not a scored vertical in that table.

How home services show up in Google AI Overviews: the model quotes hours, emergency fees, and towns. A schema markup strategy for AI search is one hours object on GBP, HTML, and JSON-LD. Disagreement is omission.

FieldRequiredMust match HTMLMust match GBP
telephone111
openingHoursSpecification111
areaServed towns310
Service types310
Offer diagnostic fee110

Implementation sequence and a worked job

Trigger: a tech’s on-call change, a new service line, a diagnostic-fee change, a new branch, or a town you stop booking. Systems: job OS, GBP, location CMS, estimate widget, Stripe or the processor (payment_intent.succeeded when a dispatch fee is taken). Actions: write hours in HTML, copy to JSON-LD, copy to GBP; add or remove Service nodes; update Offer; Rich Results Test; inspect URL. Exception path: fee mismatch, town not booked, emergency claim without a rotation. Human approval: dispatch for hours and towns, owner for fees. Measurable output: valid location URLs, 50-prompt cited-shop rate, mismatch count 0.

Worked example: a 22-truck HVAC shop with a $89 diagnostic fee and about 640 payment_intent.succeeded events per month in Stripe kept a JSON-LD GeoCircle of 40 miles after dispatch stopped booking two edge ZIP codes. After 90 calls that the night tech declined, they cut areaServed to 11 named towns, matched openingHoursSpecification to the on-call board, and blocked publish when the widget still showed $69. In 30 days a 50-prompt sample of “emergency AC” in the 11 booked towns went from 6 named citations to 24, and the Rich Results Test passed on all 3 location URLs.

GEO visibility lift: up to 40% according to GEO: Generative Engine Optimization (2024). Home-service pages earn a slice of that ceiling only when the model can trust the towns list.

StageDetect (min)Block (min)Approve (hrs)Prompts
On-call change151520
Fee change151580
Town dropped303040
Rich Results Test0000
AI sample00050

Common markup mistakes and build versus buy

Marking up every city in the DMA. Copying one location’s JSON-LD to every van page. Using AggregateRating from an internal CSAT. 24/7 in schema, 7 a.m.–6 p.m. on GBP. Offer for a “free estimate” the call center will not honor. AreaServed as a state. Each of these is a quality miss and a review waiting to happen.

'7 Best' titles earned 25.5% vs 14.0% according to US Tech Automations Phase 1 count (2026). “7 best plumbers in the local market” hubs can use that CTR lesson after the location schema is valid, not instead of it.

MistakeLocations hitDays to detectHuman required
State-level AreaServed171
Hidden 24/7 claim111
Fee ≠ widget111
Clone JSON-LD geo371
CSAT as AggregateRating111

Build versus buy: one shop, one developer, honest HTML—build. Many branches, many on-call calendars—buy a queue. US Tech Automations belongs on the hours-and-fee join. The homepage is the company overview.

A 60-day home-service markup sequence is dispatch-led. Days 1–10: print the towns dispatch will book this week and delete every other city from the HTML. Days 11–20: put hours in HTML, including the on-call window the night tech actually covers. Days 21–35: emit matching JSON-LD and run the Rich Results Test on every location URL. Days 36–50: wire the diagnostic fee to the widget and to Offer. Days 51–60: sample 50 prompts in the two towns you actually want to win. Shops that skip the town list and mark up a county will spend the next year declining jobs that AI sent them.

LocationTowns in HTMLTowns in schemaFee matchPrompt cites
HQ shop1111124
North branch66112
Hidden GeoCircle34006
24/7 claim, 10 p.m. rotation8814
Widget $69 / schema $89111109

Dispatchers already know the truth this markup is supposed to carry. They know which ZIPs they declined last Friday and which on-call rotation actually answers after 10 p.m. Schema work that does not pull from that board is fiction, and fiction is how you win a click you will later refund in reputation. Sit with dispatch for one week of after-hours calls and mark every AI-quoted claim that was wrong. Those marks are the field list: hours, towns, diagnostic fee, emergency language. Then make publish fail when any of them drift. A 40-mile GeoCircle is not “being thorough.” It is a promise the night tech will not keep. ANGI and other networks will still exist beside you; independent search is the channel you still own. Own it with dispatcher facts, not with a radius a marketer drew on a DMA map.

GBP is not a second brand story. Hours on the profile, hours in HTML, and hours in JSON-LD have to be the same object, including the on-call window. If GBP says 7 a.m.–6 p.m. and schema says 24/7, the pack and the Overview will pick a side and you will decline the job. After a holiday, use specialOpeningHoursSpecification on the page first, then copy. Do not leave last year’s holiday hours in JSON-LD because a plugin cached them.

AggregateRating is optional and dangerous. If the stars live in a widget crawlers never see, omit them. If CSAT lives only in the job OS, it is not a public review count. ANGI service-request homeowners: 7.5 million is demand on a network you do not control; independent search is still the channel you do. Keep NAP, towns, and fees honest there, and let the Rich Results Test pass on every location URL before you sample 50 prompts.

Hours, emergency language, and Google Business Profile have to be one object, not three stories. Dispatch already knows which rotation answers after 10 p.m. GBP already shows the hours Google will quote in a pack. JSON-LD is the third copy. If any copy claims 24/7 while the night tech’s shift ends at 10 p.m., AI Overviews will quote the lie first. The repair is not a new @type. It is openingHoursSpecification plus specialOpeningHoursSpecification for the on-call window, written in HTML, then copied to schema, then copied to GBP.

Local searches in past 3 months: 84% is why this is operations. Most of those searches are on a phone, after hours, in a town you either book or decline. A 40-mile GeoCircle that the HTML never shows is still a promise the night tech will not keep. Named towns you actually drive are slower to type and cheaper than a year of declined jobs.

Diagnostic fees follow the same three-surface rule. If the estimate widget charges $89 and schema still says $69, you will win the click and lose the review. If the call center will not honor a “free estimate,” do not emit an Offer that says $0. If a dispatch fee is taken in Stripe, payment_intent.succeeded is a useful clock to re-check the Offer; it is not permission to mark up a fee the page does not show.

A 60-day sequence still starts with the town list. Days 1–10: print the towns dispatch will book this week and delete every other city from the HTML. Days 11–20: put hours in HTML, including the on-call window. Days 21–35: emit matching JSON-LD and run the Rich Results Test on every location URL. Days 36–50: wire the diagnostic fee to the widget and to Offer. Days 51–60: sample 50 prompts in the two towns you actually want to win. Shops that skip the town list and mark up a county will spend the next year declining jobs that AI sent them.

US Tech Automations belongs on the hours-and-fee join: compare on-call hours to JSON-LD, open a block ticket when they disagree, and leave dispatch in a human’s hands. Price that watcher on pricing after the hours field is named.

Home-service schema FAQ

Prompt sample: 50 queries per DMA is the control that sits beside the town list; count AreaServed from the dispatch board, not from a DMA map.

What is schema for home services?

Schema for home services is JSON-LD that labels NAP, hours, services, and towns the dispatcher will actually book. It exists so Google and AI answers quote a real truck. If the markup names a county the night tech will not drive, turn it off until the HTML matches the board.

Which schema markup tools should home-service teams use in 2026?

Use a JSON-LD emitter on the location template, the Rich Results Test, Search Console, and a mismatch checker against the job OS. Skip plugins that inject radii the board does not drive.

How do home services show up in Google AI Overviews?

They show up when GBP, the location page, and schema agree on hours, fees, and towns. A 24/7 claim that the night tech will not honor usually drops you from the answer.

What belongs on a home-service schema checklist?

Matching NAP, hours in HTML and JSON-LD, Service types you still sell, AreaServed as named towns, Offer fees that match the widget, no hidden ratings, and a 50-prompt sample.

Can we mark up a 40-mile service radius?

Only if that radius is visible on the page and dispatch will book it. Google’s intro forbids marking up facts the user cannot see, even if they are accurate in a back-office tool.

Who approves a new town in AreaServed?

Dispatch, not marketing. A model may draft JSON-LD; a human who owns the on-call rotation must sign the town list.

About the Author

Garrett Mullins
Garrett Mullins
Workflow Specialist

Helping businesses leverage automation for operational efficiency.

See how AI agents fit your team

US Tech Automations builds and runs the AI agents that handle this work end to end, so your team doesn't have to.

View pricing & plans