AEO Case Study · Ongoing
From a new WordPress site to ChatGPT and Gemini citations in six weeks.
AZ Coatings is a multi-state commercial roofing contractor with offices in Southeast Michigan (headquarters) and Southeast Florida, operating across Michigan, Florida, Ohio, and Indiana, and specializing in polyurea coatings. When the engagement started on April 8, 2026, the site was a brand new 7-page WordPress build with effectively zero structured data and no AI visibility for its core prompts.
Six weeks and six phases later, AZ Coatings is named in ChatGPT, shown in the ChatGPT map result with a 5.0 rating, and cited inline in Gemini answers for buyer queries like “polyurea roof coatings” and “polyurea commercial roofing” (for users located in Michigan, since AI engines pass user location automatically). The engagement continues.
Snapshot
Client
AZ Coatings LLC
Multi-state commercial roofer specializing in polyurea coatings. Southeast Michigan HQ, Southeast Florida office.
Engagement
Started Apr 8, 2026
Six weeks shipped across six phases. Engagement is ongoing.
Starting Point
Zero structured data
A brand new 7-page WordPress site. No SSH. No Git. Only REST API and wp-admin.
Six Weeks In
Cited in ChatGPT and Gemini
5.0 in the ChatGPT map result for "polyurea roof coatings" (for users in Michigan). Inline citations in Gemini answers.
Proof in AI Answers
Where AZ Coatings shows up today.
These are unedited screenshots of ChatGPT and Gemini responding to real polyurea roofing prompts. The business is named, linked, and shown in the map view. The snippet text comes directly from the new meta descriptions. The inline definition language draws on the rewritten Polyurea page.




Starting State
What it looked like on April 8.
A brand new WordPress build, no schema, no blog, no developer access to the box. The starting state is worth recording in detail because most of the constraints below shaped the architecture of every fix that followed.
- Stack
- WordPress 6.x, Hello Elementor, Elementor Pro 3.35, LiteSpeed Cache
- Hosting
- Hostinger shared
- Access
- WordPress REST API + wp-admin only. No SSH, Git, or CI.
- Pages
- 7 (Home, About, Contact, Polyurea Roofing, Industrial, Michigan, SE Florida). No blog.
- Structured data
- Effectively none beyond plugin defaults
- Brand collision
- An unrelated "AZ Custom Coatings" in Tempe, AZ was confusing AI entity resolution
- Founding date
- Site said 2003. Actual: 2021.
Six Phases (so far)
The work, broken out.
Each phase below is a real shipping window with a single motivating idea, plus the concrete artifacts that landed during that window.
SEO and AEO overhaul
Build the structured data foundation and stand up the geographic hierarchy.
- Two new regional pages (Michigan, Southeast Florida)
- Service, RoofingContractor, DefinedTerm, HowTo, Review, and Person schema across the core five pages
- Two subOrganizations under the parent Organization (Michigan HQ, Florida office)
- "Meet the Founders" section with Person schema for Jason and Zyljana Daggy
Citation recovery sweep
Direct-answer content and meta rewrites targeting commercial polyurea search.
- 6 new sections + FAQ schema each on Polyurea, Michigan, and SE Florida
- 3 sections + Service schema on Industrial (5 offerings: roof, floor, secondary containment, water treatment, hangar)
- 18 contextual cross-links across the 5 target pages
- Meta description rewrites that fixed a broken homepage and a Michigan-to-Florida copy paste
Schema hygiene
Discovered Google merges entities sharing an @id. Made @id ownership canonical.
- Single canonical source per @id (SEO plugin emits basic Organization; sitewide snippet purely additive)
- Inline references converted to @id-only refs
- Killed duplicate FAQPage emissions
Home polish + VideoObject
Google Search Console flagged "Video isn't on a watch page." Solved with schema, not hiding.
- VideoObject markup with uploadDate, duration, thumbnailUrl, publisher @id reference
- Credential icon-box grid refinements + typography sync
- Schema-first response to the GSC warning instead of removing the video
Blog system on a stack that does not support it
Hello Elementor + Elementor Pro do not trigger Single Post template swap. So bypass the Theme Builder.
- Each post bakes Hero, Content, Author Byline, and CTA into its own Elementor data using canvas template
- Archive template with custom CSS to defeat a transform offsetting thumbnails ~190px
- 5 articles primed, 1 published (/blog/polyurea-vs-silicone/)
- Per-post BlogPosting JSON-LD using @id refs to existing entities (never re-declares canonical fields)
Invisible AEO refinement
Quiet structural fixes targeting Entity Consistency, Content Freshness, and Definition Blocks.
- Blog post meta title trimmed from 83 to 56 characters
- Brand normalization across bylines, pullquotes, bio ("AZ Coatings LLC" to "AZ Coatings")
- A custom mu-plugin injects dateModified into blog, category, and author archives (the SEO plugin in use does not expose archive freshness by default)
- Entity disambiguation: disambiguatingDescription + 5-element alternateName array to separate AZ Coatings (Michigan) from AZ Custom Coatings (Tempe, AZ)
- 5 stale "2003" references corrected to "2021" across visible copy and structured data
- Footer brand standardization across UAE template post 16
Why We Think It Moved
AI engines see one clearly identified business
The Michigan headquarters, the Florida office, and both founders are now described as one connected business. AI engines stop confusing AZ Coatings with an unrelated Arizona company that uses a similar name, so answers point at the right contractor in the right state.
Buyer questions have direct answers on the site
The new Michigan and Florida pages, plus a rewritten polyurea section, answer the questions buyers actually type: what polyurea is, whether it is walkable, how it compares to a full roof replacement, and what it costs. ChatGPT and Gemini can pull those answers straight from azcoatingsllc.com.
The site stays current and consistent across pages
Update dates on the blog and archive pages stay accurate everywhere, and the entity signals (founding year, services, geographies) match across every page. AI engines pull current content from a site that looks alive, not one ranked as stale.
Beyond The Site
AEO is holistic. The website is one layer.
Everything above is on-site work: schema, content, AI-readable surfaces, freshness. That layer is necessary but not sufficient. AI engines also weigh what the rest of the web says about a business. Listings on local commerce websites, industry directories, trade associations, regional review sites, and a hardened Google Business Profile all corroborate or contradict the on-site claims, and AI answers lean on whichever side has more independent agreement.
For AZ Coatings, on-site work produced the first wave of citations. The next phase widens the same identity layer across the rest of the web so AI answers keep pointing at the right contractor across every state the business serves:
- Local commerce listings across Michigan, Florida, Ohio, and Indiana: chambers of commerce, regional business hubs, and city or county directories where commercial buyers (and AI engines) verify a contractor exists in the service area
- Industry directories and trade associations for polyurea contractors, commercial roofing, and industrial coatings, where the business profile and capabilities can be confirmed by a credible third-party source
- Regional roofing review sites and trade publications, so the 5.0 Google rating is mirrored by independent reviews and editorial mentions
- Google Business Profile hardening: services, photos, regular posts, and review velocity, so the map listing keeps pace with the on-site entity graph
AI answers that pull from one source are easy to dispute. AI answers that pull from many sources saying the same thing are sticky. The on-site work made the site quotable. The off-site work makes the quotes durable. See the 16-factor methodology for how off-site corroboration fits into the broader model.
Six Weeks In, By The Numbers
The schema graph in production includes Organization, RoofingContractor (with two subOrganizations for the Michigan and Florida offices), Service, DefinedTerm, HowTo, Review, Person (for both founders), VideoObject, BlogPosting, and FAQPage. A single mu-plugin handles archive dateModified injection. Three sitewide code snippets handle the LocalBusiness Organization, llms link tag, and FAQPage emission.
The aggregate score above comes from @ainyc/aeo-audit, our open-source npm package that scores any public URL across 16 on-site AEO factors (structured data depth, schema validity, AI-readable files, entity consistency, definition blocks, and more). The same engine powers the free AEO check on this site.
Hard-Won Lessons
Schema-first beats content-first when access is locked down
A surgical meta + Organization schema rewrite, paired with two new regional pages, did more for AI citation than any volume of additional body copy. Structured data is where the AI retrieval layer reads first.
MCP turns WordPress into a programmable surface
The Elementor MCP plugin (97 tools) replaced "push the whole page" exports with surgical widget and container edits on production and staging. Repo files stayed the source of truth; MCP applied the diffs.
@id collisions are invisible until they break
Google merges any entities sharing an @id and flags every duplicated field, even when the values are identical. The fix: refactor to a single canonical source per @id, with inline references converted to @id-only refs.
Cache discipline is non-negotiable
Every Elementor MCP change requires an Elementor CSS purge plus a LiteSpeed purge or the change is invisible. One "Clear Files and Data" silently dropped a widget-level custom font sitewide. Post-cache-clear font verification is now part of the workflow.
Brand guardrail: invisible vs visible
Invisible structural fixes (schema, mu-plugins, sitemap entries) ship freely. HowTo, FAQ, and Person schema with quotable text needs per-item sign-off, because those quotes are exactly what AI assistants surface in citations.
Entity disambiguation is a real AEO factor
A separately owned "AZ Custom Coatings" in Tempe, AZ was muddying the brand. disambiguatingDescription plus an alternateName list across the structured data was load-bearing for clean AI entity resolution.
What’s Next
The engagement continues.
Six weeks in is not a finish line. These are the active workstreams as the engagement moves into its second phase.
Continuous citation monitoring through Canonry
Canonry, our open-source AEO operating system, tracks how ChatGPT, Claude, Gemini, Perplexity, and Copilot answer the buyer prompts AZ Coatings cares about, week over week, with the target Michigan geography passed on every check. New citations get logged; regressions get flagged before they linger.
Off-site corroboration rollout
Building presence across the local commerce websites, industry directories, association profiles, and regional review sites outlined in the Beyond The Site section above. Each state served (Michigan, Florida, Ohio, Indiana) gets its own short list of credible third-party surfaces that match the on-site entity graph.
Google Business Profile optimization
The ChatGPT map result already shows 5.0 for users in Michigan. The next step is hardening the underlying Google Business Profile (services, photos, posts, review velocity) so the map listing keeps pace with the on-site entity graph.
More published blog posts
Four primed drafts queued behind the live polyurea-vs-silicone post. Each one ships with per-post BlogPosting JSON-LD that references the existing canonical entities by @id.
Re-score each change with the audit engine
Before any schema or content change ships to production, the team re-runs @ainyc/aeo-audit (the 16-factor open-source engine that powers the free AEO check) on the page that was touched, to confirm the affected factor actually moved.
Start with the free audit, then map the same approach to your site.
The AZ Coatings engagement follows the same 16-factor on-site model that powers the free audit. If you want to see where your own site stands across structured data, AI-readable files, entity consistency, and definition-block content, start there.