Technical · Published: · Last verified: SEP 2026

Chapter 4 - Pre-GEO Hygiene

Sacha Lefebvre, founder of Are You Visible
Sacha Lefebvre Founder, Are You Visible · LinkedIn

Definition

Pre-GEO hygiene is the set of Shopify-specific technical health items that determine whether AI crawlers can read your store at all, separate from, and prerequisite to, the structured data, content, and authority work that follows. Most of these items don’t appear in a standard SEO audit because they were invented by Shopify’s variant system, app ecosystem, and theme defaults. Fix them first, or every later GEO investment compounds at a fraction of its potential.


Why it matters

Most Shopify stores doing $500k+/month believe they’re “technically clean.” The Google audit is green. Lighthouse scores are fine. PDPs render. The CFO is happy.

Then we run a crawl using ChatGPT’s user-agent (GPTBot/1.0)4. On a typical store, 30-40% of indexable product URLs are duplicate variants the crawler can’t deduplicate. The sitemap has 14,000 URLs but only 1,800 are SKUs. The hero image on the top PDP weighs 3.4MB and the bot times out before paint. The store thinks its problem is “GEO content.” The actual problem is its store can’t be read.

This is not theoretical. Chen et al. (September 2025) found that AI engines diverge significantly in how they handle freshness, language variants, query phrasing, and source domain mix1, meaning AI engines respond unevenly to the same hygiene defects. A store optimized for Google’s tolerances is not automatically tolerated by ChatGPT or Perplexity. Seer Interactive’s analysis of SearchGPT citation overlap with Bing top results showed an 87% match5, a hygiene defect that hurts your Bing index hurts your ChatGPT visibility almost in lockstep. Shopify’s own GEO Playbook (February 2026) confirms agentic AI crawlers prioritize clean URL structures and direct catalog data over rendered HTML2.

In a Shopify operator’s reality: a single broken canonical on a high-traffic PDP can split your citation signal across 8 variant URLs. Each variant looks like 1/8th of a product to the AI engine. None of them earn enough authority to be cited. Your competitor, same product, single canonical, gets the recommendation.

These are the items Chapter 1’s pre-flight checklist did not list, because they were invented by Shopify’s defaults, not search engine convention.


The system

CadenceTaskDifficultyNote
Real-timeCanonical tag on every PDP variant URL🟡?variant=xxx URLs split citation signal across 8+ duplicates
Real-timeRedirect chain monitoring (target: ≤1 hop)🟡Apps stack 301s; bots stop following at hop 2
WeeklySitemap.xml audit, exclude tag pages, vendor archives, empty collections🟡Shopify auto-bloats sitemaps to 10k+ URLs; bots waste crawl budget
WeeklyInternal link depth check on new PDPs (≤3 clicks from homepage)🟢PDPs 4+ clicks deep are functionally invisible to AI crawlers
WeeklyImage weight check on PDP hero (≤200KB target, ≤500KB hard cap)🟡3MB hero = 2-second timeout = bot never reads the page
MonthlyHreflang validation across all regional stores🔴Wrong hreflang sends ChatGPT US users to your EU PDP with EUR pricing
MonthlyCrawl budget audit, which URLs GPTBot, PerplexityBot, ClaudeBot actually hit🔴Server logs reveal whether AI bots reach your top SKUs
MonthlyLCP and CLS check on top 50 pages🟡Crawlers respect Core Web Vitals when ranking citation candidates
MonthlyOrphan page audit, pages with zero internal links🟢Orphans get crawled rarely, cited almost never
QuarterlyRedirect chain audit, flag any chain >1 hop🔴App uninstalls leave orphan redirects; chain depth grows silently
QuarterlyURL parameter cleanup, strip ?utm_, ?_pos, ?_sid from canonicals🟡Tracking params bloat the index; AI sees them as duplicate URLs
QuarterlyTag and collection page pruning, kill empty or near-duplicate collections🟢Empty collections dilute crawl authority
QuarterlyApp-induced URL parameter audit (review apps, upsell apps, currency apps)🔴Each installed app adds parameter patterns most owners never see
AnnualFull information architecture review🔴Category structure that worked at 200 SKUs breaks at 2,000
AnnualTheme migration assessment (Liquid → Hydrogen if SSR is fragile)🔴Theme defaults age fast; Hydrogen is now table stakes for $1M+/mo stores

Common gaps (8 out of 10 audits)

  • ?variant= URLs not canonicalized. A store with 12 SKUs and 8 variants per SKU has 96 indexable PDP URLs instead of 12. Each individual URL accumulates 1/8th the citation signal it should. Google’s product variants documentation (updated 2024) explicitly addresses this3, most Shopify stores have not implemented the fix.
  • Sitemap.xml at 14,000 URLs, 80% of them low-value. Tag pages, vendor archives, blog category pages, and empty collections crowd out actual SKUs. Bots crawl the noise, miss the signal. Shopify’s GEO Playbook confirms agentic crawlers prioritize clean catalog data structures2.
  • Hero images at 2-4MB. Theme defaults from 2022 are still live in 2026. The bot timeout window is 2 seconds. Your homepage never renders for GPTBot, and your top PDP drops from the AI engine’s index entirely.
  • Hreflang missing or wrong on multi-region stores. A US shopper asking ChatGPT “best merino base layer under $200” gets routed to your EU PDP in EUR. The recommendation is real. The conversion is dead. Multi-region Shopify setups are the most common offender.
  • Redirect chains 4-7 hops deep. App uninstalls leave orphan redirects. Domain migrations stack on top of theme changes stack on top of URL restructures. Each hop drops authority. By hop 4, the AI bot has stopped following.
  • No server log review, ever. The owner has never looked at which pages GPTBot, PerplexityBot, and ClaudeBot actually crawl. They’re optimizing blind. The data is in the access logs, free, untouched.

Shopify variant URL canonicalization playbook

Variant canonicalization has one job: every indexable product variant URL must declare the product-level URL as the canonical unless the variant is intentionally a distinct crawlable product page with its own copy, media, offers, and structured data. Google’s product variant guidance allows multiple variant URL patterns, but the operator still has to make the relationship explicit and consistent3. On Shopify themes, the failure usually lives in layout/theme.liquid, snippets/meta-tags.liquid, snippets/seo-meta.liquid, or an SEO app snippet that overrides the theme’s native canonical. The audit is simple: open /products/example, then open /products/example?variant=123456789, view source on both, and confirm the same canonical appears on both pages: <link rel="canonical" href="https://store.com/products/example">. If the second URL canonicals to itself, the store is splitting product authority.

StackFileEditCorrect output
Online Store 2.0 Liquidlayout/theme.liquid or SEO snippetProduct templates must use product.url for canonical output/products/handle
Liquid collection PDP URLsProduct-card snippetsProduct links should avoid collection-scoped URLs unless intentionally needed/products/handle, not /collections/name/products/handle
Variant selectorsProduct form JavaScriptVariant changes can update purchase state without rewriting canonical tagsCanonical remains product-level
HydrogenProduct route meta exportBuild canonical from selected product handle, not selected variant IDStorefront origin plus /products/{handle}

Liquid theme edit. Find the active canonical line first. Common forms are <link rel="canonical" href="{{ canonical_url }}">, {% render 'seo-meta' %}, or an app-owned meta snippet. The product-specific replacement should be placed where the theme outputs canonical tags, with only one canonical emitted per page:

{% if template.name == 'product' and product %}
  <link rel="canonical" href="{{ shop.url }}{{ product.url }}">
{% else %}
  <link rel="canonical" href="{{ canonical_url }}">
{% endif %}

That edit strips ?variant=, tracking parameters, and collection-scoped product paths from the declared canonical on PDPs while leaving collections, pages, articles, and the homepage on Shopify’s native canonical_url. If the theme has product cards that link through collections, replace collection-scoped product links with product-level links in the relevant card snippet. The pattern to remove is usually {{ product.url | within: collection }}. The replacement is {{ product.url }}. This does not prevent users from browsing by collection. It prevents crawlers from treating the same PDP as multiple canonical candidates.

Variant selector rule. Variant JavaScript should update price, availability, selected options, media, and form ID. It should not inject a new canonical tag, duplicate an old one, or rewrite the canonical to window.location.href. If the product page must keep variant IDs in the visible URL for shareability, use the variant URL as the browser state and keep the source canonical product-level. The crawler can see the variant state. The canonical still tells it where the citation signal belongs.

Hydrogen approach. In Hydrogen, canonical control belongs in the route metadata, not in client-side effects. The product route should load the product by handle, choose the selected variant for commerce behavior, then return a canonical that ignores the variant parameter. The operating rule is: variant selection affects the offer, not the identity of the document. The canonical should be computed from the storefront origin and product handle, for example https://store.com/products/${product.handle}, while structured data can still describe the selected or first available variant as the offer when appropriate. If the Hydrogen build uses generated SEO helpers, inspect the final rendered HTML and confirm there is one canonical, server-rendered, before hydration. AI crawlers should not have to execute client code to discover the canonical.

Validation. After the edit, crawl a sample of product URLs with and without ?variant=, with collection-scoped paths, and with common app parameters such as ?_pos, ?_sid, and review-widget parameters. The pass condition is boring: one canonical tag, product-level URL, 200 status, no redirect chain, product schema still present, and variant URLs excluded from the sitemap unless the operator has a deliberate variant indexing strategy. For operators these collapse into one practical conclusion: Shopify variants can exist for shoppers, merchandisers, and ads, but organic AI visibility needs one stable product URL to accumulate citation signal.

Deeper dive

Standalone posts will go further on:

Subscribe →, 4x weekly. Deep-dives ship here.


  1. Chen, M., Wang, X., Chen, K., & Koudas, N. (September 2025). Generative Engine Optimization: How to Dominate AI Search. arXiv:2509.08919.↩
  2. Risley, K. (February 2026). The GEO Playbook: How (& Why) to Optimize for AI Discovery. Shopify Enterprise Blog.↩
  3. Google Search Central. Product variants structured data. developers.google.com/search/docs/appearance/structured-data/product-variants.↩
  4. OpenAI. Bots documentation. GPTBot, OAI-SearchBot. platform.openai.com/docs/bots.↩
  5. Seer Interactive. SearchGPT and Bing citation overlap analysis (2025). 87% match between SearchGPT citations and Bing top organic results.↩