Shelfglance

What your Shopify store already tells AI shopping agents

There is an endpoint on your store you did not install, cannot see in your admin, and have never been told about. It answers AI shopping agents, it hands them your prices, and it is switched on. This is what it says about you.

Read yours right now

If you would rather not open a terminal, put your domain in here and we will send the request for you and show you what came back.

One request to your store’s own endpoint. No signup, no install, and it works on any Shopify store, not only your own.

Or do it yourself, with two commands. The first asks your store to describe itself; the second asks it for your catalogue, the way a shopping agent would.

curl https://yourstore.com/.well-known/ucp

That returns your merchant profile: the protocol versions you support, your capabilities, and your payment handlers — Shop Pay, Google Pay, card. It also leaks your .myshopify.com address, which is worth knowing if you thought that was private.

curl -X POST https://yourstore.com/api/ucp/mcp   -H "Content-Type: application/json"   -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

That lists the tools an agent can call on you: search_catalog, create_cart, create_checkout, update_checkout, complete_checkout. An agent can go from a shopper’s question to a paid order without ever loading a page of your storefront. Payment still needs the buyer’s approval at the moment it happens — that is a rule in the spec, not a courtesy.

What it hands over

Per product, and we have checked this rather than read it in a document: the title, the full description, the canonical URL, the price as an integer in minor units paired with a currency code, every variant with its SKU, the option names and values, the images, the Shopify taxonomy category, and your tags.

The part worth sitting with: this works on stores with no product structured data at all. We pointed an agent at a store that fails every product-data check we run, and it came back with {"amount":3199,"currency":"USD"}. If you have been told that AI has no way to learn your prices without schema markup, that is now false, and we are saying so on a site that used to say it.

What we found across sixty stores

Measured, not claimed

On 30 August 2026 we called the agent endpoint on 60 Shopify storefronts from our scanned corpus. Fifty-three gave a clean reading and returned 392 products between them. Of those products:

At the store level: 40% had at least one product arriving uncategorised, 9% had none categorised at all, and on 13% not one sampled product carried a SKU.

A note on how we got these, because it changed the answer. Our first pass asked each store generic queries — “gift”, “set”, “new” — and put the categorised share at 72%. That was measured honestly and it was still wrong: a bad query surfaces a store’s odd corners rather than its catalogue, and one store that looked entirely uncategorised under “gift” was entirely categorised under a query taken from its own product titles. These figures come from the second method, which is also the one the scan uses on your store.

The two fields that are actually yours

Almost everything above is filled in for you. Two things are not, and both are set in your Shopify admin rather than in your theme.

Product category. On the product page in your admin, the Category field, which maps to Shopify’s standard taxonomy. It is the only field in the whole response that states what the product is without an agent having to read prose and infer. This is the single most common gap we found and it takes seconds per product.

SKU. Per variant, under inventory. An agent reconciling your item against a price comparison, a reorder, or an order it placed last month uses this. A store with no SKUs is harder to buy from twice.

Neither of these is exotic and neither needs a developer. They are simply fields nobody told you an AI would be reading.

The filter that does not filter

Having found that a fifth of products arrive uncategorised, the obvious next question is what that costs. The protocol has an answer built in: filters.categories is in the published schema for search_catalog, described as “category filters combined with OR logic”. So an agent is plainly meant to be able to narrow a search to a category, and a product with none is plainly meant to fall out of it. We were about to write exactly that. Then we tried it.

Measured, not claimed

Four live stores, 30 August 2026, ten products requested each time. Every cell is the number of products that came back.

StoreNo filterprice max $1price min $1,000 Category that does not exist
furrion.com1001010
eiscolabs.com1001010
elitevetproducts.com100810
goatmilkstuff.com1010100

Read the last column. On three of the four stores, filtering by a category that does not exist returned the entire result set — the filter was ignored. On the fourth it returned nothing, and it returned nothing for every value we sent, including the exact category identifier those products actually carry. We tried four forms on each store: the full taxonomy identifier (gid://shopify/TaxonomyCategory/hb-3-2-1-1), the bare identifier, the category name, and the full breadcrumb path. None of them behaved like a filter.

The price column is the control, and it is why we think this is a real observation rather than a broken request. price.max worked on three of the four stores — same request shape, same envelope, one field different, results changed. price.min moved the count on one store only. So parts of filters are honoured and parts are not, and it differs by store.

We are publishing this because it changed what we tell people. The convenient version of the category finding — an agent filtering by category cannot see you — is a better sentence than the true one and we cannot support it. What we can support is duller: the category is the only field in the response that states what the product is without an agent having to read prose and infer, and on a fifth of products it is blank. That is worth two seconds in your admin. It is not worth a scare.

None of this is a complaint about Shopify. UCP shipped in 2026 and a schema arriving before every part of its behaviour does is ordinary. It is a reason to test what an endpoint does rather than read what it declares — which is the whole reason this page exists.

So does any of this replace being readable?

No, and the distinction is the whole point. This endpoint serves an agent that has already decided to shop your store — it knows your domain and it is asking you directly. It is the buying path, and Shopify has it covered.

It is not what happens when someone asks an assistant which of five brands to choose and the assistant reads pages to answer. That reader gets your HTML, and in your HTML a price is a number in a layout rather than a stated fact. Getting named in that answer is a different problem with a different fix, and it is the one we measure.

Two paths, both real, and the industry has spent a year describing them as one thing. If a page tells you a scan will get you into ChatGPT’s shopping results, it is describing a sales channel setting it has confused for a scan.

Free, no signup. Takes about ten seconds.

Install Shelfglance on my store

Installs on any Shopify store. The free plan needs no card, and the dashboard runs on sample data if you would rather look first. Shopify will note that the app has not been reviewed yet: the App Store listing is still in review, and that governs who can find Shelfglance, not who can install it.