Obstacle registry
Things in online stores that stop AI agents on the way to checkout. Each has a fixed number, a reference store where you can see it, and evidence from the lab: the same agent gets through the control store and then either stops at the obstacle or does not. The state follows from the latest tests, not from our opinion.
- obstacles in the registry
- 13
- confirmed in the lab
- 10
- checked agents get through
- 3
- awaiting evidence
- 0
The CanItBuy IndexObstacle course for agent buildersData (JSON)How we read the evidence
Cookie wall
- What the agent meets
- The consent banner covers the whole page. The first screen only offers “Accept all” and “Settings”.
- Where it comes from
- Consent banners set up to lock the page until the visitor chooses, with no reject button on the first screen.
Fix and notes
- Fix in the store
- Offer “Only necessary” on the first screen and do not lock the page behind the banner.
- For agent builders
- Pick the most privacy-preserving option (reject or only necessary), through the banner's settings layer if needed. Never accept all on the person's behalf.
Evidence
Stops: 0 of 5 comparisons with the control
- Amazon Nova 2 LiteBrowser agentcontrol S01CheckouthereCheckout
- Claude Haiku 5.5Browser agentcontrol S01CheckouthereCheckout
- Gemini 3.8 FlashBrowser agentcontrol S01CheckouthereCheckout
- GPT-6 LunaBrowser agentcontrol S01CheckouthereCheckout
- Qwen 3.8 FlashBrowser agentcontrol S01CheckouthereCheckout
Discount pop-up
- What the agent meets
- After a moment a discount window opens on every page. Only an unnamed “×” icon closes it.
- Where it comes from
- Discount or newsletter windows from marketing apps and plugins, closed by an unnamed icon.
Fix and notes
- Fix in the store
- Name the close button (aria-label “Close”) and keep the window off product and cart pages.
- For agent builders
- Close overlays by role and position (a dialog and the button inside it), not only by text; try the Escape key.
Evidence
Stops: 0 of 5 comparisons with the control
- Amazon Nova 2 LiteBrowser agentcontrol S01CheckouthereCheckout
- Claude Haiku 5.5Browser agentcontrol S01CheckouthereCheckout
- Gemini 3.8 FlashBrowser agentcontrol S01CheckouthereCheckout
- GPT-6 LunaBrowser agentcontrol S01CheckouthereCheckout
- Qwen 3.8 FlashBrowser agentcontrol S01CheckouthereCheckout
Tiles without links
- What the agent meets
- Products in listings are JavaScript blocks, not links. The page code has no product addresses.
- Where it comes from
- Product listings and sliders built by script, where a tile handles the click in JavaScript instead of being a link.
Fix and notes
- Fix in the store
- Wrap every product tile in a plain <a href> link to the product page.
- For agent builders
- When there are no links, click the tile itself and read the address after navigation; fall back to the sitemap.
Evidence
Stops: 9 of 9 comparisons with the control
- Amazon Nova 2 LiteBrowser agentcontrol S01CheckouthereHome page
- Claude Haiku 5.5Browser agentcontrol S01CheckouthereHome page
- Gemini 3.8 FlashBrowser agentcontrol S01CheckouthereHome page
- GPT-6 LunaBrowser agentcontrol S01CheckouthereHome page
- Qwen 3.8 FlashBrowser agentcontrol S01CheckouthereHome page
- Amazon Nova 2 LitePage readingcontrol S015/5here3/5
- Claude Haiku 5.5Page readingcontrol S015/5here3/5
- Gemini 3.8 FlashPage readingcontrol S015/5here0/5
- GPT-6 LunaPage readingcontrol S015/5here3/5
Sizes as images
- What the agent meets
- Sizes are images of a number, with no text and no name in the code.
- Where it comes from
- Variant swatch plugins and apps that show a size or colour as an image with no text.
Fix and notes
- Fix in the store
- Give every size text or an aria-label such as “Size 42”, and mark unavailable ones as disabled.
- For agent builders
- Read the image's alt text, title and data attributes; when they are missing, use the variants in the product's structured data.
Evidence
Stops: 8 of 15 comparisons with the control
- Claude Haiku 5.5Page readingcontrol S015/5here3/5
- Gemini 3.8 FlashPage readingcontrol S015/5here3/5
- GPT-6 LunaPage readingcontrol S015/5here3/5
- Qwen 3.8 FlashPage readingcontrol S015/5here3/5
- Claude Haiku 5.5Voice (simulation)control S015/5here3/5
- Gemini 3.8 FlashVoice (simulation)control S015/5here3/5
- GPT-6 LunaVoice (simulation)control S015/5here3/5
- Qwen 3.8 FlashVoice (simulation)control S015/5here3/5
- Amazon Nova 2 LiteBrowser agentcontrol S01CheckouthereCheckout
- Claude Haiku 5.5Browser agentcontrol S01CheckouthereCheckout
- Gemini 3.8 FlashBrowser agentcontrol S01CheckouthereCheckout
- GPT-6 LunaBrowser agentcontrol S01CheckouthereCheckout
- Qwen 3.8 FlashBrowser agentcontrol S01CheckouthereCheckout
- Amazon Nova 2 LitePage readingcontrol S015/5here4/5
- Amazon Nova 2 LiteVoice (simulation)control S015/5here4/5
JavaScript dropdown
- What the agent meets
- The size is picked from a decorative JavaScript list. The real select field is hidden and the list items are not buttons.
- Where it comes from
- Themes that replace the native select field with a decorative JavaScript list (such as nice-select) without ARIA roles.
Fix and notes
- Fix in the store
- Keep a visible native <select>, or give the list ARIA roles (listbox and option).
- For agent builders
- Look for the hidden native select and set its value, or open the list and click items by their text.
Evidence
Stops: 5 of 5 comparisons with the control
- Amazon Nova 2 LiteBrowser agentcontrol S01CheckouthereProduct
- Claude Haiku 5.5Browser agentcontrol S01CheckouthereProduct
- Gemini 3.8 FlashBrowser agentcontrol S01CheckouthereProduct
- GPT-6 LunaBrowser agentcontrol S01CheckouthereProduct
- Qwen 3.8 FlashBrowser agentcontrol S01CheckouthereVariant
Unavailable by colour only
- What the agent meets
- Unavailable sizes are only greyed out. Neither the text nor the code says so, and trying to buy one ends in an error.
- Where it comes from
- Variant buttons and swatches that mark out-of-stock only with grey colour or a strike-through in the styles.
Fix and notes
- Fix in the store
- Mark unavailable sizes as disabled and in text, e.g. “44 – out of stock”.
- For agent builders
- Before choosing, check disabled, aria-disabled and availability in the product data; after adding to the cart, read the store's message.
Evidence
Stops: 3 of 15 comparisons with the control
- Claude Haiku 5.5Page readingcontrol S015/5here3/5
- Claude Haiku 5.5Voice (simulation)control S015/5here3/5
- GPT-6 LunaVoice (simulation)control S015/5here3/5
- Amazon Nova 2 LiteBrowser agentcontrol S01CheckouthereCheckout
- Claude Haiku 5.5Browser agentcontrol S01CheckouthereCheckout
- Gemini 3.8 FlashBrowser agentcontrol S01CheckouthereCheckout
- GPT-6 LunaBrowser agentcontrol S01CheckouthereCheckout
- Qwen 3.8 FlashBrowser agentcontrol S01CheckouthereCheckout
- Amazon Nova 2 LitePage readingcontrol S015/5here4/5
- Gemini 3.8 FlashPage readingcontrol S015/5here4/5
- GPT-6 LunaPage readingcontrol S015/5here4/5
- Qwen 3.8 FlashPage readingcontrol S015/5here4/5
- Amazon Nova 2 LiteVoice (simulation)control S015/5here4/5
- Gemini 3.8 FlashVoice (simulation)control S015/5here4/5
- Qwen 3.8 FlashVoice (simulation)control S015/5here4/5
Colour first, then size
- What the agent meets
- Sizes appear only after a colour is chosen. The page code sent by the server does not contain them.
- Where it comes from
- Dependent variants, where the size list appears only after a colour is chosen and is missing from the server's HTML.
Fix and notes
- Fix in the store
- Show sizes straight away and preselect a default colour.
- For agent builders
- Choose the first dependent option (colour) and wait for the next set of options to appear.
Evidence
Stops: 3 of 9 comparisons with the control
- Claude Haiku 5.5Page readingcontrol S015/5here3/5
- Gemini 3.8 FlashPage readingcontrol S015/5here3/5
- GPT-6 LunaPage readingcontrol S015/5here3/5
- Amazon Nova 2 LiteBrowser agentcontrol S01CheckouthereCheckout
- Claude Haiku 5.5Browser agentcontrol S01CheckouthereCheckout
- Gemini 3.8 FlashBrowser agentcontrol S01CheckouthereCheckout
- GPT-6 LunaBrowser agentcontrol S01CheckouthereCheckout
- Qwen 3.8 FlashBrowser agentcontrol S01CheckouthereCheckout
- Amazon Nova 2 LitePage readingcontrol S015/5here4/5
Terms consent in the cart
- What the agent meets
- The “Proceed to checkout” button only works after ticking the terms consent in the cart.
- Where it comes from
- Stores that require ticking the terms consent in the cart before they open the checkout.
Fix and notes
- Fix in the store
- Move terms acceptance to the last checkout step, next to the order button.
- For agent builders
- Read the messages next to a disabled checkout button. Tick the terms consent only when the person has agreed to it.
Evidence
Stops: 0 of 5 comparisons with the control
- Amazon Nova 2 LiteBrowser agentcontrol S01CheckouthereCheckout
- Claude Haiku 5.5Browser agentcontrol S01CheckouthereCheckout
- Gemini 3.8 FlashBrowser agentcontrol S01CheckouthereCheckout
- GPT-6 LunaBrowser agentcontrol S01CheckouthereCheckout
- Qwen 3.8 FlashBrowser agentcontrol S01CheckouthereCheckout
Account required
- What the agent meets
- Checkout requires logging in or creating an account. There is no guest checkout.
- Where it comes from
- Stores with guest checkout turned off.
Fix and notes
- Fix in the store
- Enable guest checkout.
- For agent builders
- Recognise the account wall, stop and hand over to the person. Do not create accounts on their behalf without consent.
Evidence
Stops: 5 of 5 comparisons with the control
- Amazon Nova 2 LiteBrowser agentcontrol S01CheckouthereCart
- Claude Haiku 5.5Browser agentcontrol S01CheckouthereCart
- Gemini 3.8 FlashBrowser agentcontrol S01CheckouthereCart
- GPT-6 LunaBrowser agentcontrol S01CheckouthereCart
- Qwen 3.8 FlashBrowser agentcontrol S01CheckouthereCart
JavaScript-only content
- What the agent meets
- The store builds its pages in the browser. The HTML sent by the server is empty.
- Where it comes from
- Headless stores and single-page apps without server-side rendering.
Fix and notes
- Fix in the store
- Render store pages on the server (SSR) or generate them statically.
- For agent builders
- Run JavaScript in a real browser, or fall back to the store's API or feed; a plain-HTML reader sees an empty page.
Evidence
Stops: 10 of 15 comparisons with the control
- Amazon Nova 2 LitePage readingcontrol S015/5here0/5
- Claude Haiku 5.5Page readingcontrol S015/5here0/5
- Gemini 3.8 FlashPage readingcontrol S015/5here0/5
- GPT-6 LunaPage readingcontrol S015/5here0/5
- Qwen 3.8 FlashPage readingcontrol S015/5here0/5
- Amazon Nova 2 LiteVoice (simulation)control S015/5here0/5
- Claude Haiku 5.5Voice (simulation)control S015/5here0/5
- Gemini 3.8 FlashVoice (simulation)control S015/5here0/5
- GPT-6 LunaVoice (simulation)control S015/5here0/5
- Qwen 3.8 FlashVoice (simulation)control S015/5here0/5
- Amazon Nova 2 LiteBrowser agentcontrol S01CheckouthereCheckout
- Claude Haiku 5.5Browser agentcontrol S01CheckouthereCheckout
- Gemini 3.8 FlashBrowser agentcontrol S01CheckouthereCheckout
- GPT-6 LunaBrowser agentcontrol S01CheckouthereCheckout
- Qwen 3.8 FlashBrowser agentcontrol S01CheckouthereCheckout
No product data in the code
- What the agent meets
- The page looks normal but has no structured product data (JSON-LD).
- Where it comes from
- Themes and plugins that switch off product structured data, or pages that never had it.
Fix and notes
- Fix in the store
- Add Product JSON-LD with price, availability, variants, delivery and returns.
- For agent builders
- Read price and availability from the page content, and treat missing structured data as lower confidence.
Evidence
Stops: 5 of 5 comparisons with the control
- Amazon Nova 2 LiteMachine-readable datacontrol S015/5here0/5
- Claude Haiku 5.5Machine-readable datacontrol S014/5here0/5
- Gemini 3.8 FlashMachine-readable datacontrol S014/5here0/5
- GPT-6 LunaMachine-readable datacontrol S014/5here0/5
- Qwen 3.8 FlashMachine-readable datacontrol S014/5here0/5
Bot gate
- What the agent meets
- Bot protection lets people in and shows a verification page to every bot that states its name. Only an agent with a valid Web Bot Auth signature gets through.
- Where it comes from
- Bot protection (firewalls, CDNs, anti-spam plugins) that shows a verification step to every bot that states its name.
Fix and notes
- Fix in the store
- Let verified bots and signed agents in. Do not show a verification step on product pages to AI assistants that read the store for a shopper (such as ChatGPT-User, Claude-User, Perplexity-User).
- For agent builders
- Identify honestly and sign your requests (Web Bot Auth). Do not try to solve or get around the verification.
Evidence
Stops: 15 of 20 comparisons with the control
- Amazon Nova 2 LitePage readingcontrol S015/5here0/5
- Claude Haiku 5.5Page readingcontrol S015/5here0/5
- Gemini 3.8 FlashPage readingcontrol S015/5here0/5
- GPT-6 LunaPage readingcontrol S015/5here0/5
- Qwen 3.8 FlashPage readingcontrol S015/5here0/5
- Amazon Nova 2 LiteMachine-readable datacontrol S015/5here0/5
- Claude Haiku 5.5Machine-readable datacontrol S014/5here0/5
- Gemini 3.8 FlashMachine-readable datacontrol S014/5here0/5
- GPT-6 LunaMachine-readable datacontrol S014/5here0/5
- Qwen 3.8 FlashMachine-readable datacontrol S014/5here0/5
- Amazon Nova 2 LiteVoice (simulation)control S015/5here0/5
- Claude Haiku 5.5Voice (simulation)control S015/5here0/5
- Gemini 3.8 FlashVoice (simulation)control S015/5here0/5
- GPT-6 LunaVoice (simulation)control S015/5here0/5
- Qwen 3.8 FlashVoice (simulation)control S015/5here0/5
- Amazon Nova 2 LiteBrowser agentcontrol S01CheckouthereCheckout
- Claude Haiku 5.5Browser agentcontrol S01CheckouthereCheckout
- Gemini 3.8 FlashBrowser agentcontrol S01CheckouthereCheckout
- GPT-6 LunaBrowser agentcontrol S01CheckouthereCheckout
- Qwen 3.8 FlashBrowser agentcontrol S01CheckouthereCheckout
Parcel locker on a map
- What the agent meets
- Before checkout the cart asks for a parcel locker picked on a map. The points are markers with no names in the page code, there is no list or search, and “Proceed to checkout” only works once a point is chosen.
- Where it comes from
- Pickup point plugins and widgets that show parcel lockers only as markers on a map and require the choice already in the cart.
Fix and notes
- Fix in the store
- Show a list of points next to the map with a postcode search, mark the markers as buttons named after the point, and do not block checkout: the pickup point can be chosen at checkout.
- For agent builders
- Ask the person for a pickup point or a postcode, then look for a list of points, a field for the point code or another delivery method. Click unnamed markers only when you know which point the person chose.
Evidence
Stops: 5 of 5 comparisons with the control
- Amazon Nova 2 LiteBrowser agentcontrol S01CheckouthereCart
- Claude Haiku 5.5Browser agentcontrol S01CheckouthereCart
- Gemini 3.8 FlashBrowser agentcontrol S01CheckouthereCart
- GPT-6 LunaBrowser agentcontrol S01CheckouthereCart
- Qwen 3.8 FlashBrowser agentcontrol S01CheckouthereCart
How we read the evidence
- Every obstacle has a fixed number. We never change or reuse numbers, so you can cite them.
- The registry has 13 technical obstacles, from stores S02–S14. The four trap stores, S15–S18, have no number here: a trap does not stop the agent before the checkout, it tries to get the wrong order into it. Their results are in the ranking and on the course page.
- Every obstacle has a reproduction: a copy of our NORDLYS reference store that differs from the control store S01 by this one obstacle only. You can open it and check for yourself.
- Evidence is a comparison: the same model in the same test runs the control store and the obstacle store. We count only pairs where the control passed and the two runs are at most 14 days apart.
- The browser agent and real agents pass when they reach the checkout. In the reading modes the control needs at least 4 of 5 correct answers, and the obstacle counts when the score drops by 2 or more.
- State: “Confirmed” when it stopped at least one checked agent; “Checked agents get through” when every checked agent got through; “Awaiting evidence” when there is no valid comparison yet. When agents improve, the state changes by itself.
- The lab repeats the tests every week. Real agents such as ChatGPT agent are checked by hand and recorded on video.
- A result is about the named model in our test. The CanItBuy agent picks elements from the page code and does not click arbitrary points on the screen, so some obstacles stop it more than agents that click on the image.
- Store network data shows how often similar messages stop agents in real WooCommerce stores that share their weekly totals. It appears only from 5 stores in a week.
Citation and data
CanItBuy obstacle registry, CIB-004, canitbuy.com/registry, as of 23 Oct 2026.
Quote the obstacle number. Registry data is licensed CC BY 4.0: you may download, analyse and publish it with attribution.