Tony Castillo
Prepared for Barrel

Technical SEO audit of a Shopify store

(Only partial insights shared for client privacy)

01What we found

Pages crawled
17,286
11,976 product, 5,233 category, 74 non-200 responses in total.
Pages blocking AI crawls
0
Across 38 named AI agents and 17,286 URLs tested. Access is not the problem.
At risk of truncation
62%
173 of 277 pages fetched, then cut off before the content is reached.
AI readiness across 277 sampled pages
Scored on delivery, payload and structure · median 68.1
20 81 121 55 Not ready Needs work Acceptable Good 101 of 277 below acceptable

02What to do first

Ordered by what moves the most, and by what has to happen before it.

  1. Cut page weight. The median page is 1.9 MB and 2.9% of it is text. That ratio is why 173 of 277 sampled pages are at risk of being cut off before an AI crawler reaches the product information: it works to a token budget and stops. A search crawler will read the whole page, but it spends crawl budget doing it and the speed counts against the page. Defer scripts, trim the markup the theme emits, lazy-load media. It is also the only item here that makes the page faster for shoppers. Applies to: AI crawlers first, search crawlers second. Effort: an engineering sprint. Impact: highest here.
  2. Add cache headers. No page returns Cache-Control, ETag or Last-Modified, so every return visit by either crawler downloads two megabytes again instead of ending in a 304. Adding them is a platform-level change measured in hours. Applies to: AI and search crawlers equally. Effort: hours. Impact: high, and it repeats on every crawl.
  3. Declare the variant relationship on product pages. 11,976 product pages publish eight offers each with nothing tying them together. A search crawler sees eight products competing for the same query; an AI assistant answering a size or colour question has no way to know they are one item. ProductGroup with hasVariant fixes both in a single template. Applies to: AI and search crawlers. Effort: one template. Impact: the most valuable schema change here.
  4. Support the 10,153 star ratings with review markup. The rating is marked up. The reviews behind it are not. Search crawlers will not show a review snippet on an aggregate with nothing underneath it, and an AI assistant asked whether a product is well reviewed has a number and no evidence. Applies to: search crawlers first, AI assistants second. Effort: depends on the review app. Impact: medium.
  5. Turn off the collection generator before pruning anything. The 1,425 empty collections exist because the platform builds one for every tag combination. Prune first and they return next month. Turn it off, keep the few with real search demand, redirect the near-duplicates, noindex the rest. Both crawlers currently spend requests on pages that answer with nothing. Applies to: AI and search crawlers. Effort: one setting, then a week of triage. Impact: crawl efficiency.
  6. Add ItemList to the collection template, Organization and WebSite to the homepage. ItemList tells both crawlers that a category page is a ranked list rather than a wall of links. Organization and WebSite give the brand an entity for a search crawler to attach to and for an AI assistant to resolve the company against. Two template edits covering 5,233 category pages and the homepage. Applies to: AI and search crawlers. Effort: an afternoon. Impact: modest.

03The data behind it

What the crawler actually receives
277 sampled pages, measured under crawler conditions
MeasureMedian90th pctWorstReading
HTML delivered1,092 KB1,911 KB2,360 KBSitewide the average page is 1,922 KB and the largest 4,199 KB.
Text as a share of HTML2.93%1.91%On the homepage, 14 KB of text arrived inside 1,356 KB of markup.
Where content starts36.6%39.2%A third of the document is consumed before the first useful word.
Time to first byte1,211 ms1,954 ms2,976 msMarginal for a crawler working 17,000 URLs, and over two seconds on 20 pages.
Cache headers present0 of 277No Cache-Control, no ETag, no Last-Modified anywhere.
173 of 277 pages are flagged at risk of truncation, and 20 are heavy enough that a crawler is expected to abandon them before finishing. Every one of those pages returned a clean 200.
Structured data: expected against found
Schema validation pass over 17,286 pages
TypePages expecting itFoundValidGap
Product11,97611,97611,975Complete. One warning across the set.
BreadcrumbList17,28511,97611,976Missing on 5,309 pages, all of them category pages.
ItemList5,23300No category page declares that it is a list of products.
ProductGroup11,97600Eight offers per product, no relationship declared between them.
Review10,15300The ratings are marked up. The reviews behind them are not.
Organization100A partial node appears on 11,979 pages; none of it validates.
WebSite100Nothing on the site has a company entity to attach to.
FAQPage100The FAQ page carries no FAQ markup.
The product markup is close to perfect and that is the number that gets quoted. It measures whether the markup that exists is well formed, not whether the right types are present.
Validation status by page type
The same pass, counted by page rather than by type
Page typePagesValidErrorsShare valid
Product11,97611,975099.99%
Category5,23305,2330%
Other templates750750%
Homepage1010%
FAQ1010%
All pages17,28611,9755,31069.3%
Read by page type instead of by markup quality, the picture inverts: every category page on the site fails validation, and category pages are where a shopper starts.
Why 1,425 pages were classified as empty
5,213 candidates screened by page size, structure and rendered content
ClassificationPagesWhat the page returns
Empty collection845The rendered page states explicitly that it holds zero products.
Populated shell575A grid renders, but the body carries only 11 product links and no collection content.
Thin body5166 useful bytes after boilerplate is removed, and 26 content words against a threshold of 50.
Classified as empty1,425All returning a clean 200 at between 1.2 and 2.2 MB.
None of these is an error page. They return 200, they are indexable, and they weigh two megabytes each. Nothing in a standard crawl report flags them.
Every named AI agent, checked against robots.txt
38 agents tested · 24 shown · 0 fully blocked
AgentCompanyPurposerobots.txt
GPTBotOpenAITraining crawlerAllowed
ChatGPT-UserOpenAIChatGPT browsingAllowed
OAI-SearchBotOpenAIChatGPT searchAllowed
ClaudeBotAnthropicTraining crawlerAllowed
Claude-UserAnthropicClaude browsingPlatform defaults
Claude-SearchBotAnthropicClaude searchPlatform defaults
GooglebotGoogleSearch crawlerPlatform defaults
Google-ExtendedGoogleGemini trainingAllowed
Google-CloudVertexBotGoogleVertex AIPlatform defaults
bingbotMicrosoftBing and CopilotAllowed
PerplexityBotPerplexityAI searchAllowed
Perplexity-UserPerplexityAI assistantAllowed
ApplebotAppleSearch and SiriAllowed
Applebot-ExtendedAppleApple IntelligenceAllowed
Meta-ExternalAgentMetaMeta AI trainingAllowed
Meta-ExternalFetcherMetaMeta AI assistantPlatform defaults
AmazonbotAmazonAlexa answersAllowed
BytespiderByteDanceDoubao trainingAllowed
DuckAssistBotDuckDuckGoAI assistantAllowed
CCBotCommon CrawlOpen training datasetAllowed
MistralAI-UserMistralAI assistantPlatform defaults
cohere-aiCohereTraining crawlerAllowed
YouBotYou.comAI searchAllowed
ai2botAllen InstituteOLMo trainingAllowed
Of 38 agents checked, none is fully blocked. The 17 marked platform defaults inherit the store platform's wildcard rules, which cover cart, checkout, account and search parameters and no product or category content. Across 17,286 URLs tested, zero were blocked to any agent.