In this article
The short answer
- AI shopping agents read a store through its HTML, the names of its buttons and fields, and its structured product data. Anything that exists only as a picture, a colour or a script is invisible or ambiguous to them.
- The obstacles sit at five gates of the purchase path: entry, product, variant, cart and checkout. In this list, the entry and variant gates hold the most, four each.
- Most fixes are small: a real link, a name on a button, a native select field, “out of stock” written in text, Product JSON-LD, guest checkout.
- None of the fixes hurts human shoppers. Most of them are accessibility basics.
How an AI shopping agent reads your store
An AI shopping agent is software that takes a task, such as “running shoes, size 42, under $150”, and tries to complete it in a web browser on its own. Browser agents work in a loop: load the page, read it, choose an action, click or type, and repeat until the task is done or they get stuck.
What they read is not what a person sees. An agent builds its picture of a page from four sources:
- The HTML the server sends: links, product names, prices and button text.
- The accessibility tree: the names and roles of buttons, links and form fields, the same information a screen reader uses.
- Structured data: Product JSON-LD with the price, availability, brand and identifiers.
- Screenshots: many agents also look at the page as an image. Reading text from an image is slower and less certain than reading it from the code.
That is why a store can look perfect to people and still stop an agent. A size shown as a picture of “42”, a close button drawn as an icon, a product tile that is not a link: a person never notices, an agent has nothing to read.
The five gates of a purchase path
Every purchase passes five gates. The agent has to get into the store, find and understand a product, pick the right variant, get from the cart to checkout, and reach the checkout form. One closed gate is enough to lose the sale.
We built each obstacle below into its own copy of the same demo store, next to a control store where everything is done right (S01). Each copy differs from the control store in one thing only, so when an agent fails, the cause is clear. Every obstacle is listed in our obstacle registry with its number.
Entry: can the agent use the store at all?
Entry gate
1. A cookie wall that blocks the page
Why the agent stops
The consent banner covers the whole page and the first screen offers only “Accept all” and “Settings”. A careful agent will not accept every tracker on behalf of a shopper it does not know, and the page behind the banner cannot be used until someone chooses.
The fix
Offer “Only necessary” on the first screen of the banner, next to “Accept all”, and do not lock the page behind it.
See it in reference store S02CIB-001 in the obstacle registry
Entry gate
2. A pop-up that only an icon can close
Why the agent stops
A discount window opens after a moment on every page. The only way out is an “×” icon with no name, so in the accessibility tree it is just a button with no label. The agent cannot tell which button closes the window.
The fix
Give the close button a name and keep discount windows off product and cart pages.
<button type="button" class="modal-close" aria-label="Close">
<svg aria-hidden="true" viewBox="0 0 16 16">…</svg>
</button>See it in reference store S03CIB-002 in the obstacle registry
Entry gate
3. Pages built only in the browser
Why the agent stops
The store builds every page with JavaScript after it loads, so the HTML the server sends is almost empty. An agent or AI assistant that reads the page without running every script finds no product, no price and no button.
The fix
Render store pages on the server (SSR) or generate them statically. A quick check: fetch a product page without a browser and look for the button text.
curl -s https://yourstore.com/products/aero-run-2 | grep -i "add to cart"See it in reference store S11CIB-010 in the obstacle registry
Entry gate
4. Bot protection that stops honest agents
Why the agent stops
The protection lets people in and shows a verification page to every bot that states its name. That stops exactly the agents that are honest about what they are, while a bot that pretends to be a person may get through.
The fix
Let verified bots and signed agents in. Web Bot Auth lets an agent sign its requests, so your firewall can check who it really is. Do not show a verification step on product pages to assistants that fetch a page for a shopper, such as ChatGPT-User, Claude-User and Perplexity-User. Blocking crawlers that collect data to train models is a separate decision.
See it in reference store S13CIB-012 in the obstacle registry
Product: can the agent find and understand it?
Product gate
5. Product tiles that are not links
Why the agent stops
In the category listing, products are blocks that react to a click through JavaScript. The page code has no product addresses, so an agent reading the listing has nowhere to go.
The fix
Wrap every product tile in a plain link to the product page.
<a class="product-tile" href="/products/aero-run-2">
<img src="/img/aero-run-2.jpg" alt="Aero Run 2 running shoe, blue">
<span class="name">Aero Run 2</span>
<span class="price">$139.00</span>
</a>See it in reference store S04CIB-003 in the obstacle registry
Product gate
6. No structured product data
Why the agent stops
The page looks normal, but there is no Product JSON-LD in the code. The agent has to guess the price, currency and availability from the layout, and tools that read only structured data find nothing.
The fix
Add Product JSON-LD with the price, currency, availability, brand and identifiers. Add delivery and returns too (shippingDetails and hasMerchantReturnPolicy). Check the result at validator.schema.org.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Aero Run 2",
"sku": "AR2-BLU-42",
"gtin13": "5901234123457",
"brand": { "@type": "Brand", "name": "NORDLYS" },
"image": "https://yourstore.com/img/aero-run-2.jpg",
"offers": {
"@type": "Offer",
"url": "https://yourstore.com/products/aero-run-2",
"price": "139.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}
</script>See it in reference store S12CIB-011 in the obstacle registry
Variant: can the agent pick the right size and colour?
Variant gate
7. Sizes drawn as pictures
Why the agent stops
Each size is an image of a number, with no text and no name in the code. The agent sees five identical, unnamed buttons and has to read the numbers from a screenshot, if it can at all.
The fix
Give every size real text or a name, and mark unavailable sizes as disabled.
<fieldset>
<legend>Size</legend>
<button type="button" aria-pressed="false">42</button>
<button type="button" aria-pressed="false" aria-label="Size 43">
<img src="/img/size-43.svg" alt="">
</button>
<button type="button" disabled>44 – out of stock</button>
</fieldset>See it in reference store S05CIB-004 in the obstacle registry
Variant gate
8. A decorative dropdown instead of a select field
Why the agent stops
The size is chosen from a list drawn with JavaScript. The real select field is hidden and the list items are not buttons, so neither the code nor the accessibility tree says what can be chosen.
The fix
Keep a visible native select field. If you need a custom list, give it the listbox and option roles.
<label for="size">Size</label>
<select id="size" name="size">
<option value="42">42</option>
<option value="43">43</option>
<option value="44" disabled>44 – out of stock</option>
</select>See it in reference store S06CIB-005 in the obstacle registry
Variant gate
10. Sizes that appear only after a colour is chosen
Why the agent stops
The size buttons appear only after the shopper picks a colour, and the HTML the server sends does not contain them. An agent that reads the page first finds no sizes and may decide the product is unavailable.
The fix
Show the sizes straight away and preselect a default colour.
See it in reference store S08CIB-007 in the obstacle registry
Cart: can the agent get from the cart to checkout?
Cart gate
11. A terms checkbox in the cart
Why the agent stops
The “Proceed to checkout” button only works after the shopper ticks a terms consent in the cart. The agent clicks the button, nothing happens, and it has to work out why.
The fix
Move the terms acceptance to the last step of checkout, next to the order button.
See it in reference store S09CIB-008 in the obstacle registry
Cart gate
12. A pickup point that can only be chosen on a map
Why the agent stops
Before checkout, the cart asks for a parcel locker picked on a map. The points are markers with no names in the code, there is no list and no search, and the checkout button stays locked until a point is chosen.
The fix
Show a list of points next to the map with a postcode search, make each marker a button named after its point, and let the shopper choose the pickup point at checkout instead of blocking the cart.
See it in reference store S14CIB-013 in the obstacle registry
Checkout: can the agent reach the checkout form?
Checkout gate
13. An account required to check out
Why the agent stops
Checkout requires logging in or creating an account, with no guest option. An agent acting for a shopper should not create accounts or type passwords on their behalf, so the path ends here.
The fix
Enable guest checkout. Offer an account after the order, not before it.
See it in reference store S10CIB-009 in the obstacle registry
Check your own store in 10 minutes
You can find most of these obstacles yourself with a browser and its developer tools:
- Fetch a product page without a browser (or turn JavaScript off). The name, price and “Add to cart” are in the HTML.
- Open the accessibility tree in the developer tools. Every size, colour and close button has a name.
- View the page source and find Product JSON-LD with the price, currency and availability. It passes validator.schema.org.
- Open the store in a private window. Every banner and pop-up can be closed with a named button, and the cookie banner offers “Only necessary” on its first screen.
- Unavailable sizes are disabled and say so in text.
- Every product in a listing is a real link to its page.
- Walk to checkout as a guest, without logging in. Every place where you have to guess will stop an agent too.
- Read your /robots.txt rules for OAI-SearchBot, ChatGPT-User, PerplexityBot, Claude-SearchBot and Claude-User.
Questions
What is an AI shopping agent?
Software that completes a shopping task in a web browser for a person: it searches, compares, picks a variant, adds to cart and goes to checkout. CanItBuy’s own test agent always stops before payment.
Do I need a protocol such as ACP or UCP before agents can buy from me?
Protocols help the agents that use them, but browser agents still go through your normal pages. The fixes in this guide help in both cases, and most of them cost little.
Will these fixes hurt sales from human shoppers?
No. Most of them are accessibility basics: named buttons, real links, native form fields, clear stock information and guest checkout. They make the store easier for people too.
Should I block AI agents from my store?
That is your decision. Blocking crawlers that collect data for model training is different from blocking assistants that shop for a person. If you want AI assistants to send you buyers, let them read your product pages and verify signed agents instead of blocking every bot.
How can I test my own store?
Run the free test at canitbuy.com. A real AI agent goes through your store in a real browser, records every step, stops before payment and shows which fixes would help.
Sources
- OpenAI Pulls Back on ChatGPT Instant Checkout, EcomCrew, 9 March 2026
- Ecommerce confronts AI shopping agents ahead of holiday season, Semafor, 16 October 2026
- Has anyone tested whether an AI shopping agent can actually check out on their store?, Shopify Community, September 2026
- Product structured data, Google Search Central
- CanItBuy obstacle registry, every obstacle in this guide, with its reference store
- ACRS method, how CanItBuy scores agent readiness