We audited 12 top DTC stores: here's who the agents can read.

One product page per store, one date, one location, seventeen checks. What the public HTML showed, where the common gaps are, and what any store can take from it.

By Recommended by AgentsPublished 9 min read

A row of unbranded product boxes on a dark shelf, some glowing amber, one standing dark, and a few half hidden behind a pane of frosted glass

On September 21, 2026 we took one product page from each of twelve well-known direct-to-consumer stores and ran it through the same free readiness check anyone can use on our home page. It reads only what each store's server sends to an automated visitor that says who it is.

First, what this is not. It measures how easy a page is for software to read, not whether any AI agent recommends the brand. We did not ask ChatGPT, Gemini or any other agent a single question. The weighting is ours, one product page is not a whole store, and pages change. None of these brands were contacted beforehand, and none are clients.

The results: twelve stores, one product page each

Scores run from 0 to 100 across seventeen weighted checks. “Biggest gap” is the check that cost the page the most points. The order reflects this one page, not the brand or the whole store.

One product page per store, checked on September 21, 2026 from a single location outside the United States. Scores reflect the regional page each store served us. Brand and product names are trademarks of their owners.
RankStoreProduct page testedScoreGradeBiggest gap
1AwayShoe Cube in Large100ANone found by this check
2GymsharkEveryday Holdall Medium97ABasic Open Graph tags only
3OlipopCaramel Apple94ANo ratings or reviews in the schema
4AllbirdsMen's Tree Runner NZ91ANo ratings or reviews in the schema
5HexCladDamascus Steel Knife Set, 7-pc (Blonde)90ANo ratings or reviews in the schema
6Magic SpoonCinnamon Crunch, 1 case89ASchema product name not matched in the served page text
7GlossierCloud Paint Plush Blush85ANo GTIN, MPN or SKU in the schema
8MejuriMargot Hinge Cuff80BNo ratings or reviews in the schema
9Our PlaceCookware Set + Dual Handle Always Pan78BNo ratings or reviews in the schema
10GrazaHot 'n Sweet Olive Oil Potato Chips73BNo GTIN, MPN or SKU in the schema
11BrooklinenWashed Velvet Quilt36FProduct data is added by JavaScript, so it is not in the served HTML (see below)
Not rankedRidgeBurnt Damascus KeycaseNot scoredNo gradeOur request was refused with HTTP 403 (see below)

The average across the eleven scored pages is 83 and the median is 89. Ten of the eleven sit between 73 and 100: well-built stores, separated mostly by details. Two results need explaining: Brooklinen's 36, which is about where its product data lives and not whether it exists, and Ridge, which we could not score.

Two smaller notes. Because the check ran from outside the US, several stores redirected us to a regional storefront: Glossier served its /en-co/ page, with a schema price of 97000 COP, and Mejuri served /world/en/. A shopper or agent in the US may be served a different page. And the Our Place page we were served carried a robots meta tag reading noindex,nofollow, which cost it 4 points. We fetched it a second time to confirm. We tested one page, a cookware bundle, so we can't say whether the tag applies elsewhere, and it may be deliberate.

What the best pages have in common

The top five pages (Away, Gymshark, Olipop, Allbirds and HexClad, all 90 or above) share four habits.

  • The product data is in the HTML the server sends. Each has a JSON-LD Product or ProductGroup block in the first response, with a plain-number price, a currency, availability, a brand and at least one image.
  • The name and price are plain text too. All five passed the check that looks for the schema's product name and price in the page text, without running scripts.
  • The description says something. Their schema descriptions run from 253 to 552 characters.
  • The door is open. None of the nine AI user agents we test were blocked in robots.txt. Away's file names seven of the nine explicitly.

What separates 100 from 90 is evidence that travels. Away, Gymshark and Olipop were the only pages with a GTIN in the schema. Away and Gymshark also expose ratings there (4.35 from 60 reviews, and 4.4 from 305). Away's page passed all seventeen checks.

Check by check: how the eleven scored pages did

If you run a store, this is the most useful table here: every check, the points it carries, and how many of the eleven scored pages passed it. A partial earns half the points.

Eleven scored pages. Brooklinen counts as “not passed” on the first eight rows for one shared reason, explained below. Weights total 100.
CheckPointsPassed, of 11PartialNot passed
Product schema (JSON-LD) in the served HTML161001
Price and currency121001
Availability71001
Brand41001
Product identifiers (GTIN, MPN, SKU)7353
Ratings and reviews in schema6308
Images in schema41001
Description in schema (120+ characters)4533
Title and meta description5920
Canonical URL31100
Open Graph product tags3821
Name and price in the server HTML9650
AI agents allowed in robots.txt101100
No noindex or nosnippet41001
llms.txt published2830
HTTPS21100
Server response under one second2920

All eleven pages passed three checks: HTTPS, a canonical URL, and a robots.txt that lets AI agents in. The points are lost further down the list.

The five most common gaps, and the fix for each

Counts are out of eleven. The first three include Brooklinen, whose schema our check could not read, for the reason explained below.

  1. Ratings that aren't in the schema (8 of 11). Only Away, Gymshark and Magic Spoon had an AggregateRating with a review count in the schema we could read. Star ratings often arrive through a widget that loads later. Fix: have your reviews platform write aggregateRating into the Product JSON-LD, for genuine, visible reviews only.
  2. No GTIN (8 of 11). Three pages had one. Five had a SKU or MPN only, and two (Glossier and Graza) had no identifier in the schema. A GTIN ties your page to the same product in feeds, marketplaces and reviews elsewhere. Fix: add the UPC or EAN barcode as gtin, alongside sku and mpn.
  3. Thin or missing schema descriptions (6 of 11). Three ran to 96, 79 and 39 characters, and two pages had none. Fix: put 150 characters or more in description: materials, size, use, what makes it different.
  4. Product name not matched in the served text (5 of 11, all partial). On four pages the schema's product name did not appear in the text of the served HTML. The visible name may be drawn by JavaScript, or the two may differ: Mejuri's schema name was a variant label (“Gold Finished Steel / 6"”), not the product title. The fifth partial was Brooklinen's missing h1. Fix: render name and price on the server, and keep the schema name identical to the visible one.
  5. Open Graph product tags and llms.txt (3 of 11 each). Gymshark and Magic Spoon had basic Open Graph tags without product or price tags, and on Graza's page og:title or og:image was missing. Three stores had no /llms.txt. Both are small, at 3 and 2 points, and no major agent has confirmed using llms.txt for recommendations. Fix: add og:type “product” with product:price:amount and product:price:currency.

Brooklinen: the data exists, just not where a non-rendering agent looks

Brooklinen's Washed Velvet Quilt page scored 36, and that number is easy to misread. The page does have complete Product structured data. We checked by hand.

The HTML that Brooklinen's server sends contains one JSON-LD block, a BreadcrumbList. The Product block is built in the browser: a script creates a <script type="application/ld+json" id="productData"> element at runtime. Anything that runs JavaScript, such as Googlebot or a browser agent, would see it. Anything that reads the raw HTML without running scripts sees no product data. Our check works the second way, and so do many AI crawlers and fetchers.

Eight of our seventeen checks read from that one block, and they carry 60 of the 100 points, so they all came back “not found” together. Elsewhere the page passed eight of the other nine checks, with a partial on the ninth because the served HTML had no h1 heading.

This is the most instructive finding in the audit, because nothing is missing. The data arrives one step too late for a reader that doesn't execute scripts. The fix is to print the same JSON-LD into the server-rendered template, and to test pages with JavaScript switched off, or with curl, not only with a rendering validator.

Ridge: a 403 for an honest robot

We could not score Ridge. Our request for its product page came back with HTTP 403, which usually means a firewall or bot-protection layer refused it.

What that tells you is narrow. An unknown automated visitor that identified itself honestly was turned away. We do not know how Ridge's setup treats each AI company's own crawler. Bot protection commonly treats known crawlers differently, and we didn't test as any of them. So Ridge is listed as “not scored,” not ranked last.

The takeaway is for every store owner: open your CDN or firewall's bot settings and see which automated visitors get a 403. A default rule can refuse a new agent without anyone having decided it should.

Bigger pages, harder reading

This audit also found a flaw in our own tool. Until now the check read only the first 1.5 MB of a page. Two of these twelve pages are bigger than that, with the Product JSON-LD near the end. Gymshark's page, for example, is about 1.7 MB of HTML. Our first run stopped reading before it reached the data and reported “no product data.” That was our error, not theirs. We raised the limit to 6 MB and re-ran all twelve stores. Every number here comes from the re-run, and no scored page hit the new limit.

Any reader working to a size or time budget can do what ours did: stop early. We don't know what limits each AI agent applies, but page weight is an agent-readability issue as well as a speed issue, and putting your JSON-LD early in the document, ideally in the <head>, is cheap insurance.

Methodology and limitations

  • The tool. The free readiness check on our home page, unchanged, so you can run it on your own page and compare. It fetches the product page, /robots.txt and /llms.txt, with the User-Agent RecommendedByAgentsCheck/1.0 (+https://www.recommendedbyagents.com/). It reads the HTML as sent and does not run JavaScript.
  • The checks. Seventeen, weighted to 100, as listed in the table above. Eight read the Product schema (60 points). The robots.txt check tests nine AI user agents. A pass earns full points, a partial half, anything else none.
  • Grades. A is 85 and up, B is 70 to 84, C is 50 to 69, D is 30 to 49. A page where no Product data can be read is graded D or F whatever its total. The weights are our judgment, not a standard.
  • The sample. Twelve well-known DTC brands that we chose, across apparel and footwear, beauty, home, food and drink, accessories and travel. It is not random or representative. One product page per store, on September 21, 2026, from one location outside the US. Gymshark's bare-domain URL redirected to a regional checkout subdomain, so we scored the www URL.
  • What it can't see. Product feeds, how a firewall treats specific AI crawlers, what browser agents see after scripts run, and whether any agent recommends anything. Our quarterly Agent Index is the exercise that puts questions to agents, and its methodology is published separately.
  • Corrections. Sites change, and we can be wrong. Any brand named here can ask for a re-run or a correction at hello@recommendedbyagents.com, and we will update this post with the date.

Key takeaways

  • All eleven scored pages passed HTTPS, canonical and AI-agent access in robots.txt.
  • The usual gaps are schema details: ratings (3 of 11 pass), GTINs (3 of 11) and descriptions (5 of 11).
  • Structured data added by JavaScript is invisible to any reader that doesn't run scripts. Print it in the server HTML.
  • A 403 to an unknown bot is worth checking in your firewall settings. It is not proof that AI agents are blocked.
  • Readable is not the same as recommended. This audit measured only the first.

Questions and answers

Does a high score mean AI agents recommend that store?

No. This audit did not ask ChatGPT, Gemini or any other agent a single question. It measures whether one product page is easy for software to read. Readability is a precondition for being recommended, not evidence of it.

Why did a page with complete product data score 36?

Because of where the data lives. Brooklinen's page builds its Product JSON-LD in the browser with JavaScript, so a crawler that runs scripts, such as Googlebot, would see it. Our check reads the served HTML without running scripts, as many AI crawlers and fetchers do.

Does an HTTP 403 mean a store blocks AI agents?

Not necessarily. It means one automated visitor that identified itself honestly was refused. Bot protection often treats known crawlers differently from unknown ones, and we did not test any AI company's crawler. It is a prompt to look at your firewall rules, not a verdict.

Can a brand ask for a correction or a re-run?

Yes. Email hello@recommendedbyagents.com. If a page has changed, or we got something wrong, we will re-run the check and update this post with the date.

Written by the team at Recommended by Agents. Published . Brand and product names are trademarks of their respective owners, used here only to identify the pages tested. Spotted something out of date? Tell us and we will fix it.

One partner makes you findable.

Start with the free check, or book a thirty-minute readiness call.