Revenue AI Lab. Book the audit
All writing
Guide · 10 min read · May 2026 · PNW

Schema markup for trades businesses: the complete guide.

Schema markup is structured data you embed in your website's HTML so search engines and AI systems understand exactly what your business does, where you operate, and what services you offer. For trades contractors in the Pacific Northwest, adding the right JSON-LD blocks to your service pages is one of the fastest technical changes you can make to improve visibility in Google AI Overviews, ChatGPT, and Perplexity. Most trades websites have zero schema beyond a basic LocalBusiness block on the homepage, if that.

What schema markup actually does for a trades business

Schema markup is code (specifically JSON-LD, a format Google recommends) that you place in the <head> or <body> of your web pages. It doesn't change what visitors see. It changes what machines see. When Google's crawler, ChatGPT's retrieval system, or Perplexity's indexer hits your page, the JSON-LD block tells them: this business is an HVAC contractor, it serves Portland and Vancouver WA, it offers heat pump installation and emergency furnace repair, its hours are 7am to 6pm, its average review rating is 4.8 from 127 reviews.

Without schema, AI systems have to guess all of that from your prose. They frequently guess wrong, or they skip your page entirely in favor of a competitor whose structured data answers the query cleanly. AI crawlers parse structured data before they parse body copy. That's the core reason schema matters more now than it did two years ago: the machines making citation decisions read JSON-LD first.

A realistic expectation: schema markup alone won't get you cited in AI search. It works alongside content quality, freshness signals like Google Business Profile activity, and domain authority. But without it, you're asking AI engines to do extra work to understand your page. Most of the time, they just move on to a competitor who made the job easier.

The five schema types every trades contractor needs

1. LocalBusiness (or a specific subtype)

This is the foundation. Schema.org defines specific subtypes for trades businesses: HVACBusiness, Plumber, Electrician, RoofingContractor, and GeneralContractor all exist as official types. HomeAndConstructionBusiness is the parent category if your trade doesn't have its own subtype (landscaping, pest control, residential painting).

Use the most specific subtype that fits. An HVAC company should use HVACBusiness, not LocalBusiness. A plumber should use Plumber, not HomeAndConstructionBusiness. AI engines use the @type field to match your business against the query category. "Best plumber in Portland" pulls from pages typed as Plumber before pages typed as LocalBusiness.

Key properties to include: name, address (PostalAddress with streetAddress, addressLocality, addressRegion, postalCode), telephone, openingHoursSpecification, geo (latitude and longitude), url, image, and priceRange. For PNW contractors who travel to customers rather than serving them at a storefront, use the areaServed property with a list of cities (Portland, Beaverton, Lake Oswego, Tigard) instead of relying solely on the street address.

2. Service schema on every service page

This is where most trades websites fall short. Your homepage might have a LocalBusiness block, but your /heat-pump-installation page has nothing. AI engines treat each page as a standalone document. If the heat pump page has no structured data, the machine doesn't know it's about heat pump installation in Portland. It sees unstructured prose and moves on.

Service schema uses @type: Service with properties like serviceType ("Heat Pump Installation"), provider (a reference back to your LocalBusiness), areaServed (the specific cities this service covers), and description. You can nest services inside an OfferCatalog on your main services page, then break each one out into its own Service block on the dedicated page.

For a Portland HVAC contractor, you'd have separate Service blocks for: emergency AC repair, furnace installation, heat pump installation, ductless mini-split installation, and annual maintenance. Each block specifies the service type, the geographic area, and connects back to the parent business. That's five pages, five Service blocks, five opportunities for AI engines to match your business to a specific query.

3. FAQPage schema

FAQPage markup wraps the question-and-answer content that should already be on your service pages. When someone asks ChatGPT "how much does it cost to install a heat pump in Portland," the answer often gets pulled from a page with FAQPage schema because the machine doesn't have to extract the Q&A structure from prose. It's already labeled.

Write 5 to 8 FAQs per service page. Use the actual questions your customers ask on calls and in emails. "How much does furnace repair cost in Portland?" "Do I need a permit to replace a water heater in Washington?" "How long does a heat pump installation take?" Answer each in 2 to 4 sentences. Wrap the entire set in FAQPage JSON-LD with each question as a Question entity and each answer as an acceptedAnswer.

One rule: only mark up FAQs that actually appear on the page as visible text. Google's guidelines require that the FAQ content in your schema matches what users can see. Hidden FAQ schema with no visible counterpart gets flagged and ignored.

4. AggregateRating

If you have reviews (and you should), AggregateRating schema lets AI engines see your rating and review count without parsing your page visually. Properties: ratingValue (4.8), reviewCount (127), bestRating (5). Nest this inside your LocalBusiness block.

This matters for AI citations because when ChatGPT or Perplexity recommends a contractor, it often includes the rating. If your rating is in structured data, the AI can surface it confidently. If it's only in a paragraph of text, the AI might not extract it at all, or might attribute the wrong number.

5. Article schema on blog posts

If you publish blog content (seasonal maintenance guides, rebate explainers, city-specific advice), Article schema helps AI engines categorize and cite that content. Properties: headline, datePublished, dateModified, author, publisher. The dateModified field is particularly important for freshness signals. A post about "heat pump rebates in Oregon 2026" with a dateModified of this month signals current information. Without Article schema, AI engines have to guess the publish date from context clues, and they often get it wrong.

Implementation: where to put it and how

JSON-LD format, every time

Three formats exist for schema: JSON-LD, Microdata, and RDFa. Use JSON-LD. Google recommends it, AI engines prefer it, and it's the easiest to maintain because the code lives in a single <script> block rather than scattered across your HTML. Place the <script type="application/ld+json"> block in the <head> of each page or just before the closing </body> tag. Both work.

One block per page vs. nested blocks

For your homepage: one JSON-LD block with your LocalBusiness (or subtype), AggregateRating nested inside, and optionally an OfferCatalog listing your services. For each service page: a separate JSON-LD block with Service as the primary type, referencing the provider (your business). For blog posts: an Article block. For any page with FAQs: an additional FAQPage block (you can have multiple JSON-LD blocks on one page).

Testing and validation

After adding schema, run every page through Google's Rich Results Test (search.google.com/test/rich-results) and the Schema.org Validator (validator.schema.org). The Rich Results Test shows whether Google can parse your markup and whether it qualifies for rich results. The Schema.org Validator catches structural errors. Fix every error and warning before moving on to the next page.

Common mistakes: missing required properties (PostalAddress without postalCode), using the wrong @type (Service instead of Plumber on the main business block), and duplicating the same LocalBusiness block across every page (use it once on the homepage, reference it from service pages).

PNW-specific schema decisions

areaServed for multi-city contractors

Most PNW trades contractors serve a metro area, not a single city. A Portland plumber likely covers Beaverton, Tigard, Lake Oswego, Milwaukie, Gresham, and maybe out to Hillsboro. A Seattle electrician covers Bellevue, Kirkland, Redmond, Renton. Use the areaServed property with a list of City entities, each with its own name and sameAs link (a Wikipedia or Wikidata URL for the city). This tells AI engines exactly which "near me" queries should return your business.

If you also have a physical storefront, keep the address property and add areaServed alongside it. If you're a service-area business with no public address (many trades contractors operate from home), omit the street address and rely on areaServed plus your GBP service area.

Seasonal services and hasOfferCatalog

PNW trades have strong seasonal patterns. HVAC companies do AC installs in summer and furnace work in fall/winter. Roofers do inspections after rain season. Use OfferCatalog to organize services, and consider adding availability or seasonal notes in Service descriptions. A service description that says "Emergency furnace repair, available 24/7 October through March" gives AI engines a temporal signal that generic service descriptions lack.

Rebate-aware service pages

Oregon's Energy Trust rebates and Washington's HEEHRA program make heat pump queries high-volume in the PNW. If you have a dedicated rebate page or a heat pump service page that references these programs, your Service schema description should mention the specific programs. "Ductless heat pump installation for Portland-area homes, eligible for Energy Trust of Oregon rebates." That description in structured data connects your page to rebate-related AI queries that a generic "HVAC installation" description would miss.

What schema won't do (and what to pair it with)

Schema markup is a technical layer. It makes your existing content readable by machines. It does not fix bad content, and it does not replace the other signals AI engines use to decide who gets cited.

There's conflicting data on how much schema alone moves the needle. Some studies report that pages with proper schema have a meaningfully higher chance of appearing in AI-generated answers. Other research found no statistically significant increase in AI citations from schema alone. The honest read: schema is necessary but not sufficient. It works best when paired with direct-answer content (that TL;DR paragraph at the top of each service page), active Google Business Profile posting, and genuine review velocity.

Think of schema as the translation layer. You write a great service page. Schema translates it into a format machines can parse without guessing. The content quality is what earns the citation. The schema is what makes the citation mechanically possible.

FAQ

Do I need schema markup if I already rank well on Google?

Yes. Traditional Google rankings and AI search citations use different mechanisms. You can rank #1 in organic results and still not appear in the AI Overview or in ChatGPT's answer. Schema markup helps the AI layer specifically. It's not a replacement for traditional SEO. It's an additional layer that addresses a different channel.

Which schema type should I use for my trades business?

Use the most specific subtype: HVACBusiness for HVAC, Plumber for plumbing, Electrician for electrical, RoofingContractor for roofing, GeneralContractor for general contracting. If your trade doesn't have a dedicated subtype, use HomeAndConstructionBusiness. Landscapers and pest control companies typically fall into this bucket.

How many JSON-LD blocks should I have on one page?

As many as accurately describe the page content. A typical service page might have two: one Service block and one FAQPage block. Your homepage might have one large block with LocalBusiness, AggregateRating, and OfferCatalog nested together. There's no penalty for multiple blocks as long as each one is valid and non-duplicative.

How long does it take for schema changes to affect AI search?

Google re-crawls most active local business sites within 1 to 2 weeks of a change. AI Overviews can start reflecting your schema within that window. ChatGPT and Perplexity have longer re-indexing cycles, typically 60 to 90 days for first citations. Schema changes are among the faster technical fixes to propagate because they don't require new content, just new metadata on existing pages.

Can I use a WordPress plugin to handle schema instead of writing JSON-LD manually?

Plugins like Rank Math, Yoast, and Schema Pro can generate LocalBusiness and FAQPage markup. They work fine for the basics. The gap shows up with Service schema and areaServed, which most plugins handle poorly or not at all. If you use a plugin for the foundation (LocalBusiness, FAQPage), expect to add Service and OfferCatalog blocks manually or through a developer. Validate everything through Google's Rich Results Test regardless of how you generated it.

Where to start this week

Pick your highest-traffic service page. Add a LocalBusiness (or subtype) JSON-LD block if the page doesn't have one. Add a Service block that names the specific service, your business as the provider, and your service area cities. If the page has FAQ content, wrap it in FAQPage schema. Run the page through Google's Rich Results Test. Fix any errors. Resubmit the URL in Google Search Console.

That single page gives you a clean baseline. You'll know within 2 to 4 weeks whether Google's AI Overview is picking up the structured data (check Search Console's search appearance report for rich results). From there, repeat across every service page, add Article schema to your blog posts, and make sure your homepage has the full LocalBusiness block with AggregateRating and OfferCatalog. The whole project takes a few hours per page. For a 10-page trades website, you're looking at two to three days of focused work or one afternoon with a developer.

Want this done for you

Book a 15-minute audit on your trades website's structured data.

On the call we pull your site's schema markup, run it through Google's Rich Results Test, and check which of your service pages AI engines can actually parse. You see the gaps and the fix list. No pitch, just the technical read.

  • Free
  • No deck
  • Written scope in 48 hrs