Agent Conversion Score specification
Every check, weight and cap behind the score, published so that "agent-ready" means one thing. Version 0.5, published 17 Oct 2026. Licensed CC BY 4.0: implement it, cite it, extend it.
Machine-readable: /spec/agent-conversion-score.json
Two sub-scores, one funnel
Agent Choice
Can an agent find, read, trust and recommend you?
Access, Legibility, Offer clarity, Trust
Agent Checkout
Can an agent complete the purchase?
Transactability
Agent Conversion Score = Agent Choice × (0.7 + 0.3 × Agent Checkout / 100), then caps. A funnel rather than an average: a closed checkout limits the score instead of being averaged away, but a site agents can recommend still converts through the human handoff, so it is not zeroed. The checkout share rises in future versions as agent-completed purchases become common.
Scoring method
Each check earns points inside its dimension (pass = full weight, partial = weight × credit, fail = 0; not-applicable checks are excluded from the denominator). A sub-score is the weighted average of its dimensions' percentages. The lowest cap among failed capped checks limits the final score.
- 25 Access
- 25 Legibility
- 15 Offer clarity
- 25 Transactability
- 10 Trust
- A
- 85-100
- B
- 70-84
- C
- 55-69
- D
- 40-54
- F
- 0-39
Caps
When any of these fails, the score cannot exceed the cap, whatever the other checks say. Each one stops a sale outright.
- ACC-10 Product pages return 200 to agent identities (no 403, 429 or challenge) (cap 40)
- LEG-02 Offer with a numeric price in JSON-LD (cap 50)
- TRX-01 Guest checkout is available (cap 60)
When a site refuses claimed agents
Requests are made as a real browser and as named agent identities from the auditor's own address. When the browser is admitted, robots.txt allows the agents, and every claimed agent is refused, the site may be verifying agent identity and admitting real agents. Access checks are then scored at half credit and flagged for verification, never capped, until a live agent check (asking the real assistants to read a product page) confirms access (pass) or refusal (fail, and the cap applies).
Digital products and services
Sites whose products are software or services. These checks are not applicable, and the retail checkout protocols UCP and ACP are optional. Not applicable: LEG-05, LEG-09, OFF-04, OFF-05, TRX-09, TRX-04, TRX-05.
Access
25 points. Can agents reach the site at all?
| Check | Weight | What passes | The fix when it fails |
|---|---|---|---|
| ACC-01 | 1 | robots.txt is present and parseable | Publish a robots.txt at the site root. Agents that find none assume everything is allowed, but Cloudflare and most WAFs use its absence as a weak signal of an unmanaged site. |
| ACC-02 | 0.5 | robots.txt allows GPTBot on product pages | Remove the Disallow rule for GPTBot, or add "User-agent: GPTBot / Allow: /" above any blanket block. GPTBot feeds ChatGPT's product knowledge. |
| ACC-03 | 0.5 | robots.txt allows ChatGPT-User on product pages | ChatGPT-User is the live fetch a shopper triggers when they ask ChatGPT about you. Allow it explicitly. |
| ACC-04 | 0.5 | robots.txt allows OAI-SearchBot | OAI-SearchBot indexes for ChatGPT search results. Allow it. |
| ACC-05 | 0.5 | robots.txt allows PerplexityBot | Allow PerplexityBot so Perplexity can index product pages. |
| ACC-06 | 0.5 | robots.txt allows Perplexity-User | Perplexity-User is the live fetch for a shopper's question. Allow it. |
| ACC-07 | 0.5 | robots.txt allows ClaudeBot | Allow ClaudeBot for Claude's index. |
| ACC-08 | 0.5 | robots.txt allows Claude-User | Claude-User is the live fetch from a Claude conversation. Allow it. |
| ACC-09 | 0.5 | robots.txt allows Google-Extended | Google-Extended governs Gemini's use of your content. Blocking it keeps you out of Gemini's shopping answers. |
| ACC-10cap 40 | 8 | Product pages return 200 to agent identities (no 403, 429 or challenge) | Your WAF or bot protection is refusing AI agents on product pages. In Cloudflare, open Security > Bots > AI Crawl Control and allow the Search and Agent categories; if you block by user-agent, remove GPTBot, ChatGPT-User, PerplexityBot and ClaudeBot from the list. |
| ACC-11 | 3 | Homepage returns 200 to agent identities | Agents start at the homepage. Allow the same agent identities there as on product pages. |
| ACC-12 | 3 | No JavaScript challenge or captcha interstitial served to agents | A "checking your browser" page is a dead end for an agent; it cannot run the challenge. Exempt verified agents (Web Bot Auth) or the agent user-agents from the challenge rule. |
| ACC-13 | 1 | Agent fetch of a product page completes in under 3 seconds | Agents time out faster than people. Cache product HTML at the edge and defer non-critical scripts. |
| ACC-14 | 2 | Product content reaches an agent without a consent or age gate | Serve product name and price in the HTML before any consent banner or gate; the gate can still appear for people. |
Legibility
25 points. Can an agent read the offer without guessing?
| Check | Weight | What passes | The fix when it fails |
|---|---|---|---|
| LEG-01 | 3 | Product JSON-LD present on product pages | Add a schema.org Product block in JSON-LD on every product page. It is the single structure every assistant reads. |
| LEG-02cap 50 | 3 | Offer with a numeric price in JSON-LD | Add an Offer inside the Product with "price" as a number. Without it an agent has to guess the price from the page text it receives, and most will not guess. |
| LEG-03 | 1 | Offer declares priceCurrency | Add "priceCurrency" as an ISO code (GBP, EUR, USD). A price without a currency is ambiguous to a cross-border agent. |
| LEG-04 | 2 | Offer declares availability | Add "availability" as a schema.org URL (InStock, OutOfStock, PreOrder). Agents skip products they cannot confirm are buyable. |
| LEG-05 | 2 | Product identifiers present (gtin, mpn or sku) | Add gtin13 (or gtin, mpn, sku). Agents use identifiers to match your product to the same item elsewhere and compare prices. |
| LEG-06 | 1 | Product declares a brand | Add "brand" with a Brand object. Brand is one of the first filters a shopper's agent applies. |
| LEG-07 | 2 | Organization JSON-LD with sameAs on the homepage | Add an Organization block with name, url, logo and sameAs links to your official profiles. This is how an agent confirms it is talking to the real you. |
| LEG-08 | 3 | Product name and price are in the HTML an agent receives (server-rendered) | Render product name and price on the server. Content that only appears after JavaScript runs is invisible to most agent fetches, even though people see it in a browser. |
| LEG-09 | 2 | Shipping or delivery policy page is discoverable | Link a plain-HTML shipping and delivery page from the footer and product pages, with delivery times and costs in text, not images. |
| LEG-10 | 2 | Returns policy page is discoverable | Link a plain-HTML returns page from the footer and product pages. Agents weigh return terms when choosing between near-identical offers. |
| LEG-11 | 1 | llms.txt present | Publish /llms.txt with a short description of the business and links to catalogue, policies and feeds. Support is uneven but it costs nothing. |
| LEG-12 | 1 | sitemap.xml present and lists product URLs | Publish a sitemap that includes product URLs and reference it from robots.txt. It is how agents enumerate the catalogue. |
| LEG-13 | 1 | Canonical URL set on product pages | Add a rel=canonical link on each product page so variants and tracking URLs resolve to one offer. |
Offer clarity
15 points. Is there one clear, verifiable offer?
| Check | Weight | What passes | The fix when it fails |
|---|---|---|---|
| OFF-01 | 3 | Structured price matches the price in the HTML an agent receives | The JSON-LD price and the price in the page text disagree. Agents treat a mismatch as untrustworthy and move on. Generate both from the same source. |
| OFF-02 | 3 | Price present in what an agent receives (no login, modal or region gate) | Make sure the price is in the HTML an agent receives, for any visitor. Prices drawn in by script, or behind "log in to see price" or a country selector, are invisible to an agent even though people see them. |
| OFF-03 | 2 | Promotions are expressed structurally | Where the page shows a discount, add a priceSpecification (or validThrough and a list price) so the agent can verify the deal rather than read a badge. |
| OFF-04 | 2 | Shipping cost stated in structured data | Add OfferShippingDetails with shippingRate and shippingDestination to the Offer. Delivery cost decides many agent comparisons. |
| OFF-05 | 2 | Delivery time stated on the product page | State the delivery time (as shippingDeliveryTime in schema or plain text on the product page). "Delivered by Friday" is the kind of constraint shoppers give their agents. |
| OFF-06 | 2 | Returns terms in structured data | Add hasMerchantReturnPolicy (MerchantReturnPolicy with returnPolicyCategory and merchantReturnDays) to the Offer. |
| OFF-07 | 1 | Currency is explicit on the page | Show the currency symbol or ISO code next to every price. |
Transactability
25 points. Can an agent get to payment?
| Check | Weight | What passes | The fix when it fails |
|---|---|---|---|
| TRX-01cap 60 | 4 | Guest checkout is available | The checkout redirects to login or offers no guest path. Enable guest checkout; an agent acting for a new customer has no account to log in with. |
| TRX-02 | 3 | Cart is reachable by agent identities | The cart page refuses agent user-agents. Allow the same identities on cart and checkout paths as on product pages. |
| TRX-03 | 2 | No captcha on cart or checkout pages | reCAPTCHA, hCaptcha or Turnstile on cart or checkout stops an agent before payment. Move anti-fraud to the payment step or exempt verified agents. |
| TRX-04 | 4 | /.well-known/ucp business profile present and valid | Publish a UCP business profile at /.well-known/ucp (Shopify and Adobe Commerce do this automatically; others can generate one). It is how Google, Gemini and UCP agents discover your checkout. |
| TRX-05 | 2 | ACP discovery (/.well-known/acp.json) or ACP product feed present | Publish an ACP capabilities document or product feed to be purchasable inside ChatGPT. |
| TRX-06 | 2 | MCP endpoint advertised | Advertise an MCP server (in llms.txt or at /.well-known/mcp.json) exposing catalogue search and offer lookup so agents can call you directly instead of scraping. |
| TRX-07 | 3 | Machine-readable product feed available | Expose a product feed (Shopify /products.json, WooCommerce Store API, a Merchant Center feed URL in llms.txt). Agents enumerate feeds far more reliably than they crawl pages. |
| TRX-08 | 2 | Accepted payment methods declared | Declare payment methods in the Organization or Offer schema (acceptedPaymentMethod) or in the UCP profile's payment handlers. |
| TRX-09 | 2 | Variants expressed structurally | Where a product has sizes or colours, use ProductGroup with hasVariant so an agent can pick the right one without parsing a dropdown. |
| TRX-10 | 4 | An agent can put a product in the basket and reach checkout | Make sure an agent can add one product to an anonymous basket and open the checkout page without logging in or solving a challenge: keep the platform's basket endpoint open to agent traffic, exempt verified agents from bot protection on cart and checkout, and offer guest checkout. |
Trust
10 points. Can an agent verify who it is buying from?
| Check | Weight | What passes | The fix when it fails |
|---|---|---|---|
| TRU-01 | 3 | AggregateRating with a review count on product pages | Add aggregateRating (ratingValue, reviewCount) from your reviews provider. Agents use it as the tie-breaker between similar offers. |
| TRU-02 | 2 | Policy pages linked from product pages | Link returns, shipping and privacy pages from the product page footer so an agent on a product page can verify terms without a search. |
| TRU-03 | 2 | HTTPS with no mixed content | Serve everything over HTTPS and remove http:// asset references. |
| TRU-04 | 2 | Business identity (address, phone or email) is published | Add address, telephone or email to the Organization schema, or a plain contact page. Agents down-rank sellers they cannot identify. |
| TRU-05 | 1 | Business name is consistent across schema, title and og:site_name | Use one business name everywhere. Inconsistent names read as different entities to an agent. |
How the weights were chosen
The weights are a design decision, not a measurement: no published study says how much each factor should count. They follow three rules. Access and transactability carry the most weight because they are binary for an agent: a refused request or a checkout it cannot reach ends the sale regardless of anything else. Checks that mirror what the assistants themselves ask for (server-rendered text, a numeric price, an allow-listed crawler) weigh more than checks whose benefit is plausible but unproven (llms.txt, FAQ markup). Three failures cap the score because they make the rest moot: refusing agents on product pages, a checkout that needs a login, and no machine-readable price.
We recalibrate against our own benchmark runs and the live agent checks, and every change is dated below.
The basket test
Reading a site is not the same as buying from it, so every audit of a physical-goods store now tries the step an agent takes before paying. As ChatGPT's agent, we add one in-stock product, quantity one, to an anonymous basket using the store's own basket mechanism (Shopify's cart API, the WooCommerce Store API, Salesforce Commerce's add-to-cart endpoint, or the add-to-basket form in the page), confirm the basket holds it, and open the checkout page. If the agent is refused, the same test runs as an ordinary browser so we can tell bot protection from a broken basket. We never log in, never enter personal or payment details and never place an order; the abandoned basket expires on its own, as millions do every day.
What the score does not measure
- Whether assistants actually recommend you. The recommendation check reports that separately, because answers vary from one ask to the next; it is a signal, not a score.
- Your prices, range or reputation. The score measures whether an agent can read and act on them, not whether they are competitive.
- The whole site. A run reads the homepage, the discovery files, a sample of product pages (three in the free score, five in the full report) and the cart and checkout entry points.
- What a logged-in shopper sees. Everything is fetched as an anonymous visitor, which is how agents arrive.
Known limits
- Sites that refuse all traffic from cloud data centres cannot be scored automatically; we say so rather than guess, and retry from an ordinary home connection.
- A site that serves an empty page to automated readers is treated as a refusal, not scored as an empty site.
- Agent identities are verified live where possible: when a site refuses our imitation of an agent but admits a real browser, we ask the real assistant to open the page before calling it a block.
- Scores change as sites change. The date on every result is the date of the run.
Changelog
- v0.5 · 20 October 2026. The basket test: TRX-10 now adds one product to an anonymous basket as ChatGPT's agent and opens the checkout page (weight 1 → 4), replacing the checkout-page status check. Nothing is ever submitted. A recommendation check (does the AI name you when a shopper asks?) is reported alongside the score, not inside it.
- v0.4 · 17 October 2026. Two sub-scores (Agent Choice, Agent Checkout) combined through the funnel formula; access verification by live assistants; digital-goods mode; the no-price cap confirmed live before it applies.
- v0.3 · 14 October 2026. 49 checks across five dimensions; three caps; published under CC BY 4.0.
Implementing or citing the score
The specification is published under Creative Commons Attribution 4.0. Cite it as "Agent Conversion Score v0.5, ConversionVector, 2026-10-17". The reference implementation runs each check against a site fetched as a real browser and as the named agent identities; results from other implementations are comparable when the same check list and weights are used. Changes to checks or weights are versioned here.