ChatGPT Shopping: What Your Shopify Catalogue Actually Shows an Agent
Published September 2, 2026 by Adot Technologies Inc, the team behind Arvio: AI Store Operator. The counts below come from reading 20,659 products across 39 live Shopify storefronts through the same public catalogue endpoint an agent would use, on September 1, 2026.
A shopping agent never sees your theme. It never sees your hero image, your section layout, or the review widget you spent a weekend styling. It gets a list of products with fields on them, filters that list, and writes a sentence or two about each survivor.
Which means the question "how do I show up in ChatGPT shopping" has a boring, checkable answer: are the fields it filters and writes on actually filled in?
One thing this post is not: we did not measure which assistants read these endpoints, how often, or how any of them rank what they find. Nothing here is a claim about placement in anyone's results. It is a measurement of what is there to be read.
We went and counted.
The plumbing is done. What an agent reads is your fields
Blank product types, one-line descriptions — that is what comes back when an assistant asks. Arvio reads your live catalogue, names the gaps, and drafts each one for your approval.
See it yourself, no terminal
Open this in a browser tab, with your own domain in it:
https://yourstore.com/products.json?limit=250
That is the whole thing. No login, no app, no feed — it is public on every live, public Shopify storefront, and it is the same endpoint your store's own agents.md points an agent at. What loads is what an agent gets. (It pages at 250; add &page=2 for the rest.)
If you would rather have the counts than read JSON, this prints every row of the table below for your own catalogue:
curl -s 'https://yourstore.com/products.json?limit=250' \
| python3 -c "
import json,sys
p=json.load(sys.stdin)['products']
bl=lambda x: len(x.get('body_html') or '')
gap=lambda x: bl(x)<=20 or not x.get('images') or not x.get('tags') or not x.get('product_type')
print(len(p),'products')
print(sum(1 for x in p if not x.get('product_type')),'with no product type')
print(sum(1 for x in p if not x.get('tags')),'with no tags')
print(sum(1 for x in p if bl(x)<400),'with under 400 chars of description markup')
print(sum(1 for x in p if gap(x)),'missing at least one of the four')
"
What the agent is pointed at
On August 26 all 43 storefronts we surveyed served a generated agents.md; when we asked again on September 2, 42 of the 43 answered. The closing section of every copy we read recommends the same thing to any agent reading it: install the Shop skill, published at shop.app/SKILL.md. We fetched that document on September 2, 2026 to see what it tells the agent to do.
Three instructions in it decide whether your products can be surfaced at all.
It searches one catalogue, not the web. The skill is explicit: "NEVER fall back to web search unless explicitly requested by the user." Ranking in Google and being findable here are two different problems with two different levers.
It filters on structured attributes, not on your prose. The search command takes --category <id...>, --color, --size, --gender, --condition, --ships-to and --ships-from. The document labels exactly three of them — --color/--size/--gender — as "taxonomy attribute filters"; --ships-to it defines as the buyer's destination, and --category takes ids rather than typed-in text. What is not on that list is your description: nothing the shopper filters by is read out of your prose. A product with nothing in the structured fields is not excluded from the catalogue — it is excluded from every filtered query.
It writes a short blurb per product. The output template gives each product its own message: image, brand, name, price, review count, then "Describe each product in 1–2 sentences", then its options. The agent writes those one or two sentences from the description you supplied. There is no other source.
What 20,659 products looked like
Two columns, because they answer different questions. Pooled is share of all 20,659 products — the view of the catalogue as a whole. Store median is the middle store's percentage for that row, taken independently — the store sitting in the middle on product type is not the store sitting in the middle on tags. So read this column one row at a time: it tells you what a typical store looks like on that one field. It is not a profile of a single store, and the rows do not add up. Large catalogues dominate the pooled column, so where the two diverge, the pooled number is a few big stores talking.
| Field an agent uses | Products missing it | Pooled | Store median |
|---|---|---|---|
| Product type | 7,539 | 36.5% | 9.1% |
| Tags | 4,096 | 19.8% | 7.7% |
| Description markup under 400 characters | 5,865 | 28.4% | 6.2% |
| Description markup under 120 characters | 3,890 | 18.8% | 0.1% |
| No description markup at all | 552 | 2.7% | 0.0% |
| No image | 57 | 0.3% | 0.0% |
| Vendor | 0 | 0.0% | 0.0% |
| At least one field left entirely empty | 8,700 | 42.1% | 58.5% |
That last row is the union of four checks, and here is exactly which four: no product type, no tags, no image, or 20 characters or less of description markup. That threshold catches 567 products, 2.7% pooled. It is tighter than the 400- and 120-character rows above, which are not in the union — and looser than the no-description-markup-at-all row, which is why 567 sits a little above the 552 there. The last line of the snippet above computes it the same way. It is also the only row where the store median runs higher than the pooled figure. Pooled, 42.1% of products have a gap. But at the store sitting in the middle of this row, 58.5% of the catalogue does — and because each row's median is a different store, that 58.5% is not the sum of the rows above it. (In that particular store the whole 58.5% is missing product type.) In this sample the bigger catalogues tend to be the tidier ones — not uniformly, but enough to pull the pooled number down. If you run a normal-sized store, read the second column row by row rather than the pooled one.
Vendor is the one field nobody is missing: 0 products out of 20,659. We do not have an explanation for that one — vendor is not on screen in most themes either, so "merchants fill in what they can see" does not account for it. Treat it as an observation, not as evidence for anything else.
Product type is the biggest single hole
Product type is missing on 36.5% of products pooled — the biggest single gap we counted.
One honest limit before you act on that. --category takes ids, and the public catalogue endpoint hands out product type as typed-in text with no id attached, so we cannot show you from the skill document that filling product type is what feeds --category — the document does not say where those ids come from, and we did not measure it. What we can say is narrower: product type is the one taxonomy-shaped field this endpoint exposes, it is the field most often left empty, and an empty one carries no signal to anything downstream. If you want the claim that it maps to the category filter, we do not have it.
Tags are the next one, missing on 19.8%. Tags carry the attributes that don't fit the taxonomy: material, occasion, fit, compatibility. If you have ever wondered where the "gift for a hiker" query resolves, it resolves against fields like these. We wrote about keeping that layer usable in Shopify tags cleanup.
Neither field shows on your storefront unless your theme was built to display it, which is exactly why both rot quietly. Nothing on the page looks wrong.
Descriptions: the agent has one or two sentences to work with
28.4% of products carried under 400 characters of description markup, and 18.8% under 120.
We counted characters of body_html including the HTML tags, so <p></p> alone is 7 characters. The four thresholds are reported together above for exactly this reason — pick whichever one you think reflects real prose and use that one. Under 120 characters of markup is, realistically, a fragment.
Also: this endpoint returning a thin description does not prove the product page looks thin. A theme can render content from metafields that never appears here. What it does prove is what an agent reading the catalogue gets, and that is the audience this post is about.
The same discipline applies to the copy that Google reads, which we covered in Shopify meta descriptions, and image count is its own question we measured separately in how many product images.
The plumbing is already done
Most advice on this topic starts with an integration step you do not need:
| Check | Result |
|---|---|
Served an agents.md when asked |
42 of 43 |
Served a UCP merchant profile at /.well-known/ucp |
43 of 43 |
| Distinct capability sets across all of them | 1 |
| Capabilities advertised per store | 8 |
| Protocol version | 2026-04-08, all 43 |
Product page carrying Product structured data |
41 of 41 |
Carrying an Offer with it |
40 of 41 |
Carrying a BreadcrumbList |
14 of 41 |
Discovery, catalogue endpoints, protocol version, capability list — all identical across 43 unrelated stores. That is what a platform default looks like, not 43 independent configuration choices. We took that survey apart in what a Shopify store already serves an AI agent.
The single exception is Shop Pay: 35 of the 43 advertise a payment set including it, 8 do not. That one is a setting rather than a default.
So there is no feed to submit and no integration to build before your products are readable. The variable is the data.
You have seen what the agent sees
Closing the gap means going product by product through the fields it reads. Arvio drafts those against your real catalogue and changes nothing until you approve it.
What to do this week
- Open the endpoint above, or run the snippet under it if you want the counts. You want three numbers: products with no type, products with no tags, products under 400 characters of description.
- Fill product type first. Not because we can prove it feeds the category filter — see above, we cannot — but because it is one field, it is the only taxonomy-shaped one this endpoint carries, and it is missing on more products than anything else we counted.
- Then tags, on the attributes a shopper would say out loud but that aren't in the taxonomy.
- Then the short descriptions, worst first. Two sentences that name the thing, who it is for, and one concrete specific beats a paragraph of adjectives — the agent is going to compress it to one or two sentences anyway.
- Check Shop Pay is on, since it was the only agent-facing field that varied between stores.
Steps 2 through 4 are the reason this is hard. None of it is difficult per product; it is that the median store here holds 130 products and the largest holds 3,637, and the fields are invisible on the storefront, so nothing ever reminds you.
That is the job we built Arvio for: an AI store agent that works through the catalogue product by product and writes the missing fields, showing you each edit before it lands. The free Arvio store audit reads a storefront across six stages and prints each finding with the measurement under it — on our own 69-product demo store it returned findings like "19 products with no category at all". It reads the same public endpoint this post reads, with the same limits: no admin, no login, nothing written.
How this was measured
Sampling frame. Merchants who posted their own storefront URL on the Shopify Community "Store Feedback" board — which is to say, merchants who already suspected something about their store needed fixing and went and asked. That is a real direction of bias and it points the same way as our finding — 720 topics read, 474 candidate hostnames, 244 dropped because they no longer serve a catalogue, leaving 230 live storefronts. random.Random(20260826).sample(stores, 60) drew 60 of them. The catalogue counts come from the 43 of those carrying at least 10 products, and within those the 39 we could read in full — two exceeded our read limit, and two served an empty catalogue on the day we read it; the endpoint checks in the second table come from 43 stores under the same frame with a slightly different exclusion. Those are two different denominators on purpose, and they are labelled separately above.
Whether it looks like you. Stores that ask a public board for feedback skew newer and smaller; the median catalogue is 130 products, ranging from 10 to 3,637 — two larger stores were dropped because they hit our 5,000-product read limit, so their real size is unknown. The larger bias is survivorship — more than half the hostnames ever posted to that board no longer answer as a live Shopify catalogue, and this sample is drawn from the ones still standing. Everything here came from endpoints any browser can fetch.
Store names withheld. The counts carry no domains — these merchants asked a public board for design feedback, not to be named in a vendor's post.
What the endpoint gives and doesn't. The public catalogue endpoint returns title, vendor, product type, tags, body HTML, images and variants. It does not return several fields people assume are in it, so nothing in this post is a claim about anything outside that list.
Description length is markup length. body_html character counts include HTML tags. Four thresholds are reported together rather than one, so you can pick the threshold you think reflects real prose.
A thin description here is not a thin product page. A theme can render content that never appears in this endpoint. This measures what an agent reading the catalogue receives.
Dates. Catalogues were read on September 1, 2026. The endpoint and structured-data checks were read on August 26, 2026, and the agents.md requests on September 2, 2026. The Shop skill document was fetched on September 2, 2026 and returned HTTP 200; every phrase quoted from it is verbatim from that response.
Not measured. We did not measure which agents read these endpoints, how often, or how any of them rank what they find. Nothing here is a claim about placement in any specific assistant's results. It is a measurement of what is available to be read.
FAQ
Do I need to submit a product feed to appear in ChatGPT shopping?
Not to be readable. Every storefront we checked already served a catalogue endpoint and a UCP merchant profile, and all but one served an agents.md, without the merchant configuring anything. What varies between stores is the completeness of the product fields, not the presence of the plumbing.
Which product fields matter most to a shopping agent?
The structured ones and the one it quotes from. The skill filters on taxonomy attributes — colour, size and gender by name — and on a category id; product type and tags are the structured fields the public endpoint actually exposes, and the description is where the sentence or two about each product comes from. We cannot show which of those the category filter reads. Vendor was already filled in on every product we read.
How do I see what an agent sees on my store?
Open https://yourstore.com/products.json?limit=250 in a browser. No login, no app. The snippet near the top of this post turns the same response into counts.
Does classic SEO work help here?
Partly, and not directly. The Shop skill is instructed not to fall back to web search unless the user asks for it, so the catalogue is a separate surface with separate rules. Structured product data helps in both places; page-level ranking work does not carry over.
What about Shop Pay?
It was the one agent-facing field that differed between stores: 35 of the 43 advertised a payment set including it, 8 did not.
Arvio: AI Store Operator — install it on the Shopify App Store. It works on the fields an agent reads first.
