Skip to content
Made For Builders iconoMade For Builders
Visibility

Schema & Structured Data for Home Services

edu-lopez-parada16 min read
Schema & Structured Data for Home Services

Structured data is markup that tells search engines and AI answer engines exactly what a page means. For home-service businesses, the core types are LocalBusiness, Service, FAQPage, Review with AggregateRating, and BreadcrumbList, written as JSON-LD in the page head. It does not directly raise rankings, but it powers rich results and makes pages easier for engines to parse and cite. Validate every block with Google's Rich Results Test, never mark up content that is not visible, and keep your name, address, and phone identical everywhere.

Search engines read your website the way a person skims a foreign-language menu: they recognize some words, guess at the rest, and hope the picture helps. Structured data removes the guessing. It is a standardized vocabulary, defined at schema.org and supported by Google, Microsoft, and others, that lets you state in machine-readable terms exactly what a page means: this is a plumbing business, here is its phone number, these are the services it offers, this is the area it serves, and these are the questions it answers.

For a home-service business, that clarity translates into real outcomes. Rich results — star ratings, FAQ accordions, and breadcrumbs in the search snippet — can lift click-through rate. And as AI answer engines increasingly mediate how people find local contractors, the pages that are easiest for a machine to parse and attribute have a structural advantage. We explore that second benefit in depth in how to show up in ChatGPT and Perplexity.

This playbook covers the five schema types that matter most for contractors, with copy-adaptable JSON-LD, the testing workflow, and the mistakes that get markup ignored or, worse, penalized. It pairs with our local SEO for contractors guide and the visibility pillar.


What Structured Data Is (and Is Not)

Structured data is markup added to a page that describes its content using a shared vocabulary. Google strongly recommends the JSON-LD format: a block of JSON, placed in a <script> tag, that sits alongside your visible content without changing how the page looks.

It is not a ranking factor on its own. Google has said this repeatedly. What it does is make pages eligible for rich results and easier for engines to understand. Treat schema as a clarity-and-presentation layer, not a growth hack.

Close-up of colorful programming code on a computer monitor
JSON-LD lives in a script tag and never changes how the page looks — it only describes the page's meaning to machines.

The cardinal rule, stated plainly in Google's structured data guidelines: only mark up content that is actually visible to users on the page. Invisible or fabricated markup is a policy violation.


The Five Types That Matter for Contractors

Schema typeWhat it describesWhere it goes
LocalBusiness (or subtype)The business: name, phone, address, hours, area servedHomepage, contact, every page sitewide
ServiceA specific job you performEach service page
FAQPageQuestions and answers shown on the pageService pages, guides, FAQ sections
Review / AggregateRatingReal customer reviews and their averagePages that display genuine reviews
BreadcrumbListThe page's position in the site hierarchyEvery deep page

You will not use all five on every page. The pattern is: LocalBusiness sitewide, Service and FAQPage on service pages, Review/AggregateRating where real reviews appear, and BreadcrumbList on anything below the homepage.


LocalBusiness: The Foundation

Start here. The LocalBusiness type (and its trade-specific subtypes like Plumber, Electrician, HVACBusiness, RoofingContractor) describes the business itself. Use the most specific subtype that fits your trade.

{
  "@context": "https://schema.org",
  "@type": "Plumber",
  "name": "Brand Plumbing",
  "image": "https://example.com/storefront.jpg",
  "telephone": "+1-555-0100",
  "url": "https://example.com",
  "priceRange": "$$",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "100 Main St",
    "addressLocality": "Plano",
    "addressRegion": "TX",
    "postalCode": "75024",
    "addressCountry": "US"
  },
  "areaServed": [
    { "@type": "City", "name": "Plano" },
    { "@type": "City", "name": "Frisco" }
  ],
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
      "opens": "08:00",
      "closes": "18:00"
    }
  ],
  "geo": { "@type": "GeoCoordinates", "latitude": 33.0198, "longitude": -96.6989 }
}

The non-negotiable detail: the name, address, and telephone here must be identical to your Google Business Profile and to every citation across the web. Inconsistent NAP data is one of the most common and most damaging local SEO mistakes, and schema is where it often diverges first.


Service: One Block Per Job

On each service page, add a Service block describing that single job. This reinforces the service-by-location grid that drives local SEO.

{
  "@context": "https://schema.org",
  "@type": "Service",
  "serviceType": "Water Heater Installation",
  "provider": {
    "@type": "Plumber",
    "name": "Brand Plumbing",
    "telephone": "+1-555-0100"
  },
  "areaServed": { "@type": "City", "name": "Plano" },
  "hasOfferCatalog": {
    "@type": "OfferCatalog",
    "name": "Water Heater Services",
    "itemListElement": [
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Tankless installation" } },
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Standard tank replacement" } }
    ]
  }
}

Keep serviceType aligned with the page's H1. The closer your markup mirrors the visible content, the cleaner the signal.


FAQPage: Structured Answers

If your page displays a genuine question-and-answer section, mark it up with FAQPage. The answers in the markup must match the answers shown on the page word for word in substance.

{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "How long does a water heater installation take?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "A standard tank replacement typically takes two to three hours. Tankless conversions can take a full day because they often require new gas, venting, or electrical work."
      }
    }
  ]
}

Well-formed FAQ content is also exactly the kind of concise, self-contained answer that AI answer engines like to lift and cite. That overlap is not a coincidence — see how generative AI chooses which sources to cite.

Person typing on a laptop running an AI software interface
Clean FAQ schema gives both Google and AI answer engines a tidy, attributable block to surface.

Review and AggregateRating: Handle With Care

Review markup is powerful and heavily policed. The review snippet guidelines are strict: the reviews must be genuine, first-hand, and visible on the page. You may not invent ratings, and you may not pull in reviews from third-party platforms you do not control and present them as your own.

{
  "@context": "https://schema.org",
  "@type": "Plumber",
  "name": "Brand Plumbing",
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.8",
    "reviewCount": "126"
  },
  "review": {
    "@type": "Review",
    "author": { "@type": "Person", "name": "J. Martinez" },
    "reviewRating": { "@type": "Rating", "ratingValue": "5" },
    "reviewBody": "Same-day water heater replacement, clean work, fair price."
  }
}

If you do not yet display real reviews on the page, do not add this markup. Fabricated or self-serving review markup is the fastest route to a manual action. The underlying truth is that real reviews move revenue regardless of markup — the evidence is in the science of online reviews and in Google reviews for home service businesses.


BreadcrumbList: Show the Hierarchy

BreadcrumbList tells engines where a page sits in your site structure and can produce a breadcrumb trail in the search snippet.

{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com" },
    { "@type": "ListItem", "position": 2, "name": "Services", "item": "https://example.com/services" },
    { "@type": "ListItem", "position": 3, "name": "Water Heater Installation", "item": "https://example.com/services/water-heater-installation" }
  ]
}

This reinforces the internal-linking hierarchy described in our service and city pages guide.


Testing and Deployment Workflow

Never ship schema you have not validated. The workflow:

  1. Draft the JSON-LD for the page type.
  2. Run the Rich Results Test to confirm eligibility and catch errors and warnings Google cares about.
  3. Run the Schema Markup Validator for general schema.org validity beyond Google's specific features.
  4. Deploy, then monitor Google Search Console — the Enhancements and rich-results reports flag live errors and which pages are eligible.
  5. Re-test after any template change, because schema breaks silently when a developer edits the surrounding markup.

In this project, schema validity is enforced in CI: invalid JSON-LD fails the build. That is the right posture for any serious site — broken schema is worse than no schema.

Close-up of colorful source code on a monitor representing validation and testing
Validate every block before and after deployment. Broken structured data is worse than none at all.

Common Mistakes

  • Marking up invisible content. If users cannot see it, do not mark it up.
  • Fabricated or borrowed reviews. A guaranteed policy violation.
  • NAP mismatches between schema, Google Business Profile, and citations.
  • Using generic LocalBusiness when a specific subtype (Plumber, HVACBusiness) exists.
  • Stale data: hours, phone, or area served in schema that no longer match reality.
  • Never re-testing after a site redesign or template change.
  • Over-marking: stacking irrelevant types in the hope something sticks. Mark up what is true and present, nothing more.

Conclusion

Structured data will not magically lift your rankings, and any agency that promises it will is selling the wrong thing. What it does is make your pages unambiguous to the machines that decide how you are presented in search results and, increasingly, how you are quoted by AI answer engines.

Start with LocalBusiness sitewide. Add Service and FAQPage to your service pages, BreadcrumbList to deep pages, and Review/AggregateRating only where genuine reviews are displayed. Validate everything, keep your NAP consistent, and re-test after every change. To put this to work, pair it with our service and city pages guide, how to rank on Google Maps, how generative AI chooses which sources to cite, the visibility pillar, and the full blog.

Frequently asked

We answer before we start

Direct help

Question not listed?

Talk to the team
  1. Q/01Does adding schema directly improve my Google rankings?

    No, not directly. Google has consistently stated that structured data is not a ranking factor on its own. What it does is make a page eligible for rich results (star ratings, FAQ accordions, breadcrumbs in the search snippet) and help search engines understand the page's content and entities. Those rich results can substantially increase click-through rate, and clearer machine understanding can help with relevance. So the benefit is real, but it is indirect: better presentation and comprehension, not a ranking boost you can point to in isolation.

  2. Q/02Which schema type should a contractor use, LocalBusiness or a more specific type?

    Use the most specific type that fits. Schema.org provides specific subtypes under LocalBusiness, including Plumber, Electrician, HVACBusiness, RoofingContractor, GeneralContractor, and HousePainter. Choosing Plumber over the generic LocalBusiness gives engines a more precise signal about what you do. If no exact subtype exists for your trade, fall back to LocalBusiness and describe the work clearly in the name, description, and Service markup. Specificity helps both traditional search and AI answer engines categorize you correctly.

  3. Q/03Can I mark up review stars that I made up or that are not shown on the page?

    No. Google's structured data policies require that review and rating markup reflect genuine, first-hand reviews that are visible to users on the page. Marking up ratings you invented, aggregating reviews from other sites you do not control, or hiding the reviews from visitors while showing stars to Google are all violations that can trigger a manual action. The safe pattern is to display real reviews on the page and mark up exactly what is displayed. Never fabricate an AggregateRating.

  4. Q/04How do I test whether my structured data is valid?

    Use two tools. Google's Rich Results Test confirms whether a page is eligible for specific rich results and flags errors and warnings in the markup it cares about. The Schema Markup Validator (from Schema.org, formerly the Structured Data Testing Tool) checks general schema.org validity beyond Google's specific features. Run both: the Rich Results Test for eligibility and the Schema Validator for completeness. After deploying, monitor the Enhancements and "Rich results" reports in Google Search Console for live errors.

  5. Q/05Does schema help AI answer engines like ChatGPT and Perplexity cite my site?

    It helps indirectly. Structured data makes the meaning of a page explicit and machine-readable: what the business is, what services it offers, where it operates, and what questions it answers. Generative engines that crawl the web can use clean structure and explicit entities to extract and attribute information more reliably. Schema is not a guaranteed ticket to a citation, but pages that are well-structured, factually specific, and easy to parse tend to be easier for these systems to quote accurately. Combine schema with clear headings, concise answers, and cited claims.