Skip to content
Blog

Why ChatGPT doesn't show your products - and how to fix it

2026-07-31

Visibility

You type your own category into ChatGPT, ask for a recommendation, and get back three competitors and a marketplace listing. Your store, which ranks fine in Google and converts fine on paid traffic, does not come up. The reason why ChatGPT doesn't show your products is almost never taste. It is usually that the store failed a necessary condition somewhere upstream, and was dropped from the candidate set before any judgement about quality was made.

Be clear about what is knowable here. Nobody outside OpenAI knows how the final selection is weighted, and anyone who claims to have the formula is guessing. What is knowable is the set of conditions that have to hold before a store can be considered at all, because those are mechanical: a crawler either reached the page or it did not, a parser either found a product or it did not. Those conditions are all yours to control. The useful move is not to reverse engineer a ranking. It is to remove your own disqualifiers, in the order they bite.

Cause one: the crawler cannot get in

OpenAI runs more than one crawler and they do different jobs. OAI-SearchBot fetches the pages that back ChatGPT search results. GPTBot fetches for browsing and for training. A robots.txt rule that blocks either one removes your store from that pathway entirely, and no amount of schema work downstream will compensate, because the page is never retrieved in the first place.

This takes under a minute to check. Open https://yourstore.com/robots.txt in a browser and read it. You are looking for three things: a Disallow: / under User-agent: *, which is a blanket block; a named block for either OpenAI crawler; and any plugin-added rule you do not recognise. Blocks are frequently added by a default nobody reviewed rather than by decision.

User-agent: OAI-SearchBot
Allow: /

User-agent: GPTBot
Allow: /

Sextant runs these as crawl.oai_searchbot, crawl.gptbot and crawl.blanket_disallow. If you want the full picture of which bots to allow and which to leave blocked deliberately, that is covered in the robots.txt guide for ecommerce.

Cause two: the page has no machine-readable product

A product page can look complete to a person and be empty to a parser. The price is in a styled span, the stock status is a green badge, the variant is a dropdown populated by JavaScript. A human reads all of that instantly. A parser looking for structured data reads a document that never says, in a form it can trust, that this page is a product with this price in this currency.

This is not a rare edge case. WooCommerce core emits no Product schema without a plugin, so a stock WooCommerce store can have a perfectly good catalogue and nothing structured on any of it.

What an assistant can do with an unstructured page is guess from the prose, and guessing is expensive and unreliable. What it can do with a valid Product block is state the price and availability with confidence. Given a choice between a store it has to infer and one that declares itself, the inference costs more and carries more risk of being wrong in public.

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Merino Base Layer",
  "sku": "MBL-204-BLK",
  "gtin13": "5012345678900",
  "offers": {
    "@type": "Offer",
    "price": "89.00",
    "priceCurrency": "GBP",
    "availability": "https://schema.org/InStock"
  }
}

That is product.jsonld and product.offer_price. The fields that actually get read are a shorter list than most schema plugins imply.

Cause three: parseable, but not comparable

The harder failure is the store whose schema is valid and commercially useless. The Product block is there, the price parses, and the product still loses.

An assistant answering "what is the best X under 100" is running a comparison, and a comparison needs handles. Without a GTIN or an MPN, there is no reliable way to establish that your listing and a competitor's listing are the same physical product, so yours cannot be placed on the shelf next to it. Without AggregateRating, there is no evidence of quality in a form that survives the parse, even if the page renders every review in your database as stars. Without MerchantReturnPolicy and OfferShippingDetails, the risk of recommending you is unpriced: the agent cannot tell a buyer what happens if the thing does not fit.

Structured data completeness is one of the inputs shopping agents select on, with those fields specifically in scope. The relevant checks are product.sku, product.gtin, product.aggregate_rating, merchant.return_policy and merchant.shipping_details.

Cause four: nothing points at the catalogue

The last cause is the quietest. Everything above can be correct and still leave an agent with no route into the catalogue, because nothing advertises it. A sitemap that lists only the homepage, the blog and a handful of category pages tells a crawler almost nothing about the products. That is discovery.sitemap versus discovery.sitemap_products, and they fail independently.

Beyond the sitemap, the newer conventions do the same job more explicitly. Shopify has generated llms.txt and agents.md natively since May 2026, and enabled agentic storefronts for eligible merchants in March 2026, which means a large part of the market got this layer without doing anything. Stores on other platforms did not, and the gap is now structural rather than temporary. That shift is the subject of the switch was flipped.

How to tell which one is yours

Run the checks in the order the failures bite, because a failure early makes everything after it moot.

  1. Read your own robots.txt. If OAI-SearchBot or GPTBot is blocked, or there is a blanket disallow, stop here and fix that first.
  2. View source on a real product page and search for "@type": "Product". If it is absent, nothing downstream matters yet.
  3. If it is present, read what is inside it. Check for a non-empty sku, a gtin or mpn, an offers block with price and currency, and aggregateRating. Empty fields are common and count as absent.
  4. Open your sitemap and confirm product URLs are actually in it.
  5. Check your returns and shipping pages for structured policy data, not just prose.

None of this guarantees a citation. It removes the reasons you can be excluded without ever being assessed, which is a different and more tractable problem. What agent readiness means sets out the rest of the picture.

If you would rather see which of these your store fails than work through the list by hand, run a free scan. It reads public pages only and takes about twenty seconds.