If you build or maintain websites for trades businesses, such as painters, roofers or flooring installers, you'll get asked to "do the SEO stuff," and these days to "make us show up in ChatGPT." Structured data is one of the few parts of that request that's concrete, testable and fully under your control.
This post is a practical reference: which schema.org types fit contractors, a working JSON-LD pattern for a company with several service pages, what to do when the business doesn't publish a street address, and what structured data will and won't do.
Why bother? What do AI engines actually read on contractor sites?
On November 8, 2026, the Sourci team asked ChatGPT and Gemini to shortlist commercial painting, commercial roofing and epoxy floor contractors in 50 US metros, 300 answers in all. Contractor websites were the largest single category of cited sources for both engines: 58% of ChatGPT's 2,914 citations and 76% of Gemini's 638. ChatGPT cited the recommended contractor's own site in 89% of its recommendations, usually a service page for the exact trade asked about (full method and data).
That study measured citations, not markup. It doesn't show that JSON-LD causes recommendations, and we won't claim it does. What it does show is that the service page itself is the evidence. Structured data is the cheapest way to make that page's key facts unambiguous to any parser: who the business is, what it does, and where.
Which schema.org type should a contractor use?
Schema.org has a HomeAndConstructionBusiness type, a LocalBusiness described as one "that provides services around homes and buildings." Its subtypes include:
RoofingContractorHousePainterGeneralContractor-
Electrician,Plumber,HVACBusiness,Locksmith,MovingCompany
There's no dedicated flooring or coatings contractor type. For an epoxy or resinous flooring company, use HomeAndConstructionBusiness and describe the specialty with Service entries and knowsAbout.
Google's local business documentation says to "use the most specific LocalBusiness sub-type possible," and if a business has several types, to list them as an array because additionalType isn't supported. A company that paints and roofs would use:
"@type": ["HousePainter", "RoofingContractor"]
HousePainter is schema.org's name for painting businesses generally. It still fits a company that only does commercial work. Your page copy carries the "commercial" signal.
How do you mark up a contractor with multiple service pages?
Define the business once, with a stable @id, and reference it from each service page. Don't repeat a full LocalBusiness block on every page. Use an @graph on the homepage or about page:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": ["RoofingContractor"],
"@id": "https://example-roofing.com/#business",
"name": "Example Roofing Co.",
"url": "https://example-roofing.com/",
"logo": "https://example-roofing.com/logo.png",
"telephone": "+1-512-555-0100",
"areaServed": [
{ "@type": "City", "name": "Austin, TX" },
{ "@type": "City", "name": "Round Rock, TX" }
],
"knowsAbout": ["TPO roofing", "modified bitumen", "commercial roof inspections"],
"sameAs": [
"https://www.bbb.org/us/tx/austin/profile/roofing-contractors/example",
"https://www.facebook.com/exampleroofing"
]
}
]
}
Then on /commercial-roof-inspections:
{
"@context": "https://schema.org",
"@type": "Service",
"@id": "https://example-roofing.com/commercial-roof-inspections#service",
"name": "Commercial roof inspections",
"serviceType": "Roof inspection",
"provider": { "@id": "https://example-roofing.com/#business" },
"areaServed": { "@type": "City", "name": "Austin, TX" },
"audience": {
"@type": "BusinessAudience",
"audienceType": "Property managers and facility managers"
},
"description": "Twice-yearly and post-storm inspections for low-slope commercial roofs, with photo documentation and a written repair list."
}
A few notes from real implementations:
-
sameAsis where directory profiles go. In the study, ChatGPT cited directory or review sites in 85% of answers. BBB and Angi were in both engines' top-four third-party sources. Linking the company's real BBB, Angi or manufacturer-directory profile withsameAsties them to one entity. Only list profiles the business actually controls. -
areaServedtakes names, not just a radius.GeoCircleis valid, but a list of real cities matches how buyers phrase questions ("roofers in Round Rock"). -
Keep
nameidentical everywhere. It should match the business name on Google Business Profile and directories character for character. Entity matching breaks on "Example Roofing" vs "Example Roofing & Restoration LLC."
What if the business doesn't publish a street address?
Many trades companies are service-area businesses that run from a home office or yard and don't want an address public. That collides with one of Google's rules. In Google's local business structured data documentation, address is a required property for Local Business rich results.
Your options:
-
Use
PostalAddresswith only locality, region and country (addressLocality,addressRegion,addressCountry). It's valid schema.org, but it may not qualify for rich results. Treat it as descriptive markup. -
Use
OrganizationplusServicemarkup withareaServed, and leave the location details to Google Business Profile, where service-area businesses can hide their address.
Don't invent an address, and don't use a virtual office you don't operate from. Google's structured data guidelines warn that markup that misrepresents content can lead to a manual action, which means the markup gets ignored.
Should contractor sites still use FAQPage markup?
Not for Google rich results. In August 2023, Google limited FAQ rich results to well-known, authoritative government and health sites. Its Search Central changelog then says the FAQ rich result stopped appearing in Google Search on May 7, 2026, and the documentation was removed in June 2026. The FAQ content is still worth having. Direct question-and-answer blocks ("Do you work on occupied buildings?" "What roof systems do you install?") are easy for any engine to quote. Keep the markup if it's already there, since it's valid schema. Just don't sell it to a client as a ranking feature.
How do you test it?
- Rich Results Test (Google): checks eligibility for Google features and flags errors in supported types.
-
Schema Markup Validator (validator.schema.org): checks general schema.org validity, including types Google doesn't use for rich results, such as
Service. - URL Inspection in Search Console: confirms Google can crawl the rendered page. This matters if JSON-LD is injected client-side.
If you generate JSON-LD in JavaScript, render it server-side or at build time where you can. Google can process JavaScript-injected structured data, but not every crawler that feeds an AI answer renders JavaScript, and a static <script type="application/ld+json"> removes the question.
A checklist for contractor schema
- [ ] Most specific type (
RoofingContractor,HousePainter, orHomeAndConstructionBusinessfor flooring) - [ ] One business entity with a stable
@id, referenced from service pages - [ ] A
Serviceblock on each service page, withprovider,areaServedand a plain-languagedescription - [ ]
sameAslimited to real, controlled profiles - [ ] Name, phone and service area identical to Google Business Profile
- [ ] No invented addresses or self-serving review markup
- [ ] Validated in both the Rich Results Test and the Schema Markup Validator
Markup only helps if there's a real page underneath it. If your client sells commercial roofing but their site has one generic "Services" page, the first job is writing the page, then marking it up.
FAQ
Is there a schema.org type for epoxy flooring contractors?
No. Use HomeAndConstructionBusiness with Service entries describing the flooring systems.
Does structured data make ChatGPT recommend a business?
There's no published evidence that it does on its own. What the 50-metro study shows is that the contractor's own service page is the most-cited source. Structured data makes that page's facts unambiguous.
Can I list several trades in one @type?
Yes. Google's documentation says to use an array, for example ["HousePainter", "RoofingContractor"].
Written by The Sourci team. Sourci builds websites, SEO and AI-search visibility for commercial painting, roofing and coatings contractors.
Sources: Google Search Central, Local business structured data documentation; Google Search Central Blog, "Changes to HowTo and FAQ rich results" (Aug 8, 2023); Google Search Central documentation changelog (May and June 2026 entries); schema.org HomeAndConstructionBusiness; Sourci 50-metro AI contractor recommendations study, November 2026.
Top comments (0)