Phoenix contractor websites: AI readiness

How many Phoenix roofing, HVAC, and window contractor websites pass five basic AI-readiness tests: AI crawlers allowed, a valid llms.txt, business details in structured data, published prices, warranties, or specs, and other citable data. Aggregate counts by trade, each with its sample size.

382 websites, up to 8 pages each, read . Aggregates only: no business or website is named.

What we found

  • 12% (43 of 361) of the sites we could fully read pass all five tests: AI answer-engine crawlers allowed, a valid llms.txt, business details in LocalBusiness schema, prices, warranties, or specs published, and other citable data. By score: 43 pass all five, 81 pass four, 87 pass three, 69 pass two, 81 pass one.
  • 29% (108 of 378) of the sites we checked have a valid llms.txt file, the test the most sites miss; some site builders and SEO plugins now create one automatically, so having one does not show the business wrote it.
  • 99% (377 of 379) of the sites whose robots.txt answered let every AI answer-engine crawler in; 1% (2 of 379) block at least one AI crawler, CCBot included.
  • 43% (156 of 361) of the homepages that loaded have a LocalBusiness node with the business's name, phone, and address; 24% (87 of 361) have more than one separate business node, which leaves an engine to guess which is the business.
  • 50% (180 of 361) of the sites we read publish a price, a warranty term, or a product spec somewhere on the pages we read, but 4% (13 of 361) put any of it in structured data. A warranty term with its length appears on 39% (139 of 361), a price on 26% (95 of 361), and a product spec with its value on 12% (44 of 361).
  • 60% (215 of 361) publish at least two kinds of other citable data. Years in business are stated on 60% (216 of 361), FAQ content appears on 51% (183 of 361), service-area cities on 50% (180 of 361), a license number on 49% (176 of 361), a table of numbers on 9% (33 of 361), and a published dataset on 0% (0 of 361).
  • WordPress runs 51% (185 of 361) of the homepages that loaded, the most of any platform we detect.

Each figure is a count over the sites it could be read on, with the share beside it; a share is stated only from 20 sites up.

What this means for business owners

The bar is low, and it will not stay this low. Today a contractor who does this work stands next to competitors whose sites give an AI answer engine little to read, quote, or cite. For the businesses that go after it now, this is a rare opening: the field is wide and most of the competition has not started. It narrows as site builders, plugins, and competitors catch up.

Only 43 of the 361 Phoenix contractor sites we could fully read (12%) pass all five tests. The one most sites miss is "a valid llms.txt" (29% (108 of 378) pass).

Passing the tests does not make an engine name a business; it removes the reasons it cannot. What an engine actually says about you is a separate measurement, and it is the one we report to clients every week.

The five tests

  1. AI answer-engine crawlers allowed. robots.txt does not block GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot, or Google-Extended from the homepage (no robots.txt at all passes).
  2. A valid llms.txt. /llms.txt is a text file whose first line is a "# " title, as the llmstxt.org format asks.
  3. Business details in schema. The homepage's JSON-LD has a LocalBusiness node (or a subtype, such as RoofingContractor or HVACBusiness) that itself carries the business's name, a phone number, and an address.
  4. Prices, warranties, or specs published. On any page we read, a price (an Offer price, a priceRange with a number, or a dollar figure stated as a range, per unit, installed, or "starting at"), a warranty with its length (in years, or lifetime), or a product spec with its value (U-factor, SHGC, SEER2, AFUE, impact class, wind rating, and the like), in structured data or in the page text.
  5. Other citable data. At least two of five kinds, on the pages we read: FAQ content (FAQPage schema, or an FAQ page or section with three or more questions); a published dataset (Dataset schema, a /data/ section, or a CSV, JSON, or spreadsheet download); an HTML table with numbers in it (business hours do not count); service-area cities (city location pages, or a service-area page naming three or more of the metro's cities); and a business fact (a contractor license number, or years in business).
TestAll (382 sites)Heating and air conditioning (147)Roofing (125)Windows and doors (110)
1. AI answer-engine crawlers allowed99% (377 of 379)99% (145 of 146)99% (123 of 124)100% (109 of 109)
2. A valid llms.txt29% (108 of 378)26% (37 of 145)32% (40 of 124)28% (31 of 109)
3. Business details in schema43% (156 of 361)50% (67 of 135)46% (56 of 121)31% (33 of 105)
4. Prices, warranties, or specs published50% (180 of 361)53% (72 of 135)48% (58 of 121)48% (50 of 105)
5. Other citable data60% (215 of 361)67% (91 of 135)59% (71 of 121)50% (53 of 105)
Passes all five12% (43 of 361)15% (20 of 135)12% (14 of 121)9% (9 of 105)
Passes exactly 4 of five22% (81 of 361)23% (31 of 135)27% (33 of 121)16% (17 of 105)
Passes exactly 3 of five24% (87 of 361)25% (34 of 135)20% (24 of 121)28% (29 of 105)
Passes exactly 2 of five19% (69 of 361)19% (26 of 135)17% (21 of 121)21% (22 of 105)
Passes exactly 1 of five22% (81 of 361)18% (24 of 135)24% (29 of 121)27% (28 of 105)
Passes exactly 0 of five0% (0 of 361)0% (0 of 135)0% (0 of 121)0% (0 of 105)

Each test counts over the sites it could be read on; the all-five and exact-score rows count only the sites whose robots.txt, llms.txt, and homepage were all read (361 sites overall).

By trade

MeasureAll (382 sites)Heating and air conditioning (147)Roofing (125)Windows and doors (110)
Site basics
Homepage loaded96% (361 of 378)93% (135 of 145)98% (121 of 124)96% (105 of 109)
At least one page beyond the homepage read88% (318 of 361)89% (120 of 135)88% (106 of 121)88% (92 of 105)
Served over HTTPS100% (361 of 361)100% (135 of 135)100% (121 of 121)100% (105 of 105)
Has an llms.txt file34% (128 of 378)35% (51 of 145)35% (43 of 124)31% (34 of 109)
Homepage has JSON-LD structured data75% (269 of 361)79% (107 of 135)74% (89 of 121)70% (73 of 105)
Homepage has a LocalBusiness (or subtype) node51% (183 of 361)58% (78 of 135)53% (64 of 121)39% (41 of 105)
Prices, warranties, and specs (test 4)
A price, in structured data or page text (a range, per unit, installed, or starting at)26% (95 of 361)35% (47 of 135)23% (28 of 121)19% (20 of 105)
A price in structured data (an Offer price, or a priceRange with a number)3% (10 of 361)4% (6 of 135)2% (2 of 121)2% (2 of 105)
A warranty term with its length (years or lifetime), in structured data or page text39% (139 of 361)36% (49 of 135)38% (46 of 121)42% (44 of 105)
A warranty in structured data1% (2 of 361)1% (1 of 135)1% (1 of 121)0% (0 of 105)
A product spec with its value (U-factor, SEER2, impact class, and the like), in structured data or page text12% (44 of 361)24% (32 of 135)7% (9 of 121)3% (3 of 105)
A product spec in structured data (additionalProperty on a Product or Service)<1% (1 of 361)1% (1 of 135)0% (0 of 121)0% (0 of 105)
A price, warranty, or product spec in structured data4% (13 of 361)6% (8 of 135)2% (3 of 121)2% (2 of 105)
Other citable data (test 5)
FAQ content: FAQPage schema, or an FAQ page or section with three or more questions51% (183 of 361)56% (75 of 135)52% (63 of 121)43% (45 of 105)
FAQPage structured data30% (107 of 361)36% (48 of 135)31% (38 of 121)20% (21 of 105)
A published dataset (Dataset schema, a /data/ section, or a CSV, JSON, or spreadsheet download)0% (0 of 361)0% (0 of 135)0% (0 of 121)0% (0 of 105)
An HTML table with numbers in it9% (33 of 361)7% (9 of 135)13% (16 of 121)8% (8 of 105)
Service-area cities: city location pages, or a service-area page naming three or more metro cities50% (180 of 361)64% (86 of 135)46% (56 of 121)36% (38 of 105)
A contractor license number (Arizona ROC format) on the site49% (176 of 361)53% (71 of 135)51% (62 of 121)41% (43 of 105)
Years in business stated ("since 1998", "25 years of experience", or foundingDate)60% (216 of 361)61% (83 of 135)60% (73 of 121)57% (60 of 105)
Other checks from our audit
Homepage has more than one separate business node24% (87 of 361)30% (40 of 135)25% (30 of 121)16% (17 of 105)
Business schema gives more than one phone or street address across the pages read7% (25 of 361)10% (13 of 135)7% (8 of 121)4% (4 of 105)
Review or aggregateRating markup on a page read19% (67 of 361)29% (39 of 135)16% (19 of 121)9% (9 of 105)
Homepage business node lists sameAs profiles40% (144 of 361)46% (62 of 135)43% (52 of 121)29% (30 of 105)
Homepage is over 150 KB of HTML62% (223 of 361)56% (76 of 135)66% (80 of 121)64% (67 of 105)
A page read has a template title ("Complete Guide", "Everything You Need")1% (3 of 361)0% (0 of 135)2% (2 of 121)1% (1 of 105)
The blog post read names a person as its author33% (66 of 199)28% (23 of 82)38% (26 of 68)35% (17 of 49)
The blog post read shows a date48% (95 of 199)50% (41 of 82)49% (33 of 68)43% (21 of 49)
AI crawlers
Blocks any AI crawler in robots.txt1% (2 of 379)1% (1 of 146)1% (1 of 124)0% (0 of 109)

A site listed in two trades counts once in each trade and once in All. Bases differ by row: homepage measures count the sites whose homepage loaded; page measures, the sites whose homepage loaded, from up to 8 pages each; robots.txt measures, the sites whose robots.txt answered; llms.txt, the sites where we checked it. The AI crawler row counts GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot, Google-Extended, and CCBot; the download breaks it out crawler by crawler.

Website platforms

PlatformAll (361 homepages)Heating and air conditioningRoofingWindows and doors
WordPress51% (185 of 361)56% (75 of 135)53% (64 of 121)44% (46 of 105)
Wix4% (15 of 361)3% (4 of 135)3% (4 of 121)7% (7 of 105)
Squarespace2% (8 of 361)1% (2 of 135)2% (2 of 121)4% (4 of 105)
GoDaddy Website Builder3% (12 of 361)1% (1 of 135)3% (4 of 121)7% (7 of 105)
Duda4% (14 of 361)1% (2 of 135)7% (8 of 121)4% (4 of 105)
Webflow2% (6 of 361)1% (2 of 135)2% (2 of 121)2% (2 of 105)
Shopify<1% (1 of 361)1% (1 of 135)0% (0 of 121)0% (0 of 105)
Weebly1% (2 of 361)1% (1 of 135)0% (0 of 121)1% (1 of 105)
Other or not detected33% (118 of 361)35% (47 of 135)31% (37 of 121)32% (34 of 105)

For comparison

Outside figures measure different things on different samples (the web at large, all employer businesses); they are context, not a like-for-like comparison.

Sample

410 active businesses in the three trades; 382 with a website on record; 382 distinct sites read.

  • Set aside, in review or rejected (not confirmed as the trade): 71.
  • Set aside, active but no website on record: 28.

Not read further: 1% (3 of 382) of sites, because robots.txt gave a server error or no response; <1% (1 of 382), because robots.txt disallows our crawler.

How this was measured

The sample is every business we track in Phoenix's roofing, heating and air conditioning, and window and door trades that is active (confirmed as the trade) and has a website: 382 sites after removing duplicate listings of the same domain. Each site was read once, Oct 1, 2026 to Oct 2, 2026, by our crawler (CiteMyResearch/1.0 (+https://citemy.ai/research/phoenix-contractor-ai-readiness; contact https://citemy.ai/contact)), one request at a time per site, a second apart, at most four sites at once, with a 15-second timeout, and only at public addresses. We read robots.txt first and obeyed it for our own crawler: a site whose robots.txt disallows us, or does not answer (a server error or no response, which RFC 9309 says to treat as a full disallow), was not read further and is counted apart. Then /llms.txt, the homepage, the sitemap (the file robots.txt names or /sitemap.xml, and up to two files of a sitemap index), and up to 7 more pages from the sitemap and the homepage's links, 8 pages at most: pricing, warranty, FAQ, service, product, about, service-area, one blog post, and financing pages first, only pages robots.txt allows us. Crawler access is what robots.txt says for each AI agent's token at the homepage path, using the same robots.txt parser as our audit; we did not send requests as those agents, so a firewall that blocks them is not measured here. llms.txt counts as present when /llms.txt returns a non-HTML file, and valid when its first line is a "# " title, as the llmstxt.org format asks. Structured data is the pages' JSON-LD, read with our audit's parser. Prices, warranties, specs, license numbers, location pages, datasets, and duplicate or conflicting business nodes are judged with our audit's own checks and patterns; FAQ sections and tables are read from the page markup. The five tests: (1) AI answer-engine crawlers allowed: robots.txt does not block GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot, or Google-Extended from the homepage (no robots.txt at all passes). (2) A valid llms.txt: /llms.txt is a text file whose first line is a "# " title, as the llmstxt.org format asks. (3) Business details in schema: The homepage's JSON-LD has a LocalBusiness node (or a subtype, such as RoofingContractor or HVACBusiness) that itself carries the business's name, a phone number, and an address. (4) Prices, warranties, or specs published: On any page we read, a price (an Offer price, a priceRange with a number, or a dollar figure stated as a range, per unit, installed, or "starting at"), a warranty with its length (in years, or lifetime), or a product spec with its value (U-factor, SHGC, SEER2, AFUE, impact class, wind rating, and the like), in structured data or in the page text. (5) Other citable data: At least two of five kinds, on the pages we read: FAQ content (FAQPage schema, or an FAQ page or section with three or more questions); a published dataset (Dataset schema, a /data/ section, or a CSV, JSON, or spreadsheet download); an HTML table with numbers in it (business hours do not count); service-area cities (city location pages, or a service-area page naming three or more of the metro's cities); and a business fact (a contractor license number, or years in business). A site is scored on the tests only when its robots.txt, llms.txt, and homepage were all read. Platform is detected from markers in the homepage HTML (theme and asset paths, generator tags), as in our audit. Every share is over the sites the measure could be read on, stated beside it. A share is stated only from 20 sites up. No business or website is named in this study or its data.

Limitations

  • Up to 8 pages per site, chosen by URL: a price, an FAQ, or a table on a page we did not read is not counted, so the figures for tests 4 and 5 are a floor, not a full inventory.
  • Text patterns, not reading comprehension: a rebate or an industry-average range can read as a price, and a spec shown only in an image or a PDF is missed.
  • robots.txt rules only: a firewall or bot-protection service that refuses AI crawlers is not visible to a polite crawler that announces itself.
  • Our list of businesses, not every contractor: it comes from Google Places results and AI answers for Phoenix searches, so it leans toward businesses that already show up somewhere.
  • Some sites are national or franchise sites rather than a local contractor's own.
  • One reading on one day: sites change, and a page that was down, slow, or refused our crawler (a 403 from bot protection, say) counts as not loaded.
  • An llms.txt counts whoever wrote it: some site builders and SEO plugins now generate one on their own (one we opened begins "Generated by Rank Math SEO"), so having one does not mean the business wrote it.

Data

Download the aggregate table: CSV · JSON · dataset page. CC BY 4.0, cite as “Phoenix contractor websites: AI readiness, October 2026, CiteMy”.

Results describe what was measured, not a promise of ranking.

See what the engines say about your business.

A free audit by our AI business engine: it crawls your site the way AI crawlers do and emails you a score out of 100 and the three findings that matter most.