{
  "name": "Agent Conversion Score",
  "version": "0.5",
  "published": "2026-10-17",
  "updated": "2026-10-19",
  "publisher": "ConversionVector",
  "url": "https://conversionvector.com/spec",
  "license": "CC BY 4.0",
  "scoring": {
    "scale": "0-100",
    "subScores": {
      "choice": {
        "name": "Agent Choice",
        "question": "Can an agent find, read, trust and recommend you?",
        "dimensions": [
          "access",
          "legibility",
          "offer",
          "trust"
        ]
      },
      "checkout": {
        "name": "Agent Checkout",
        "question": "Can an agent complete the purchase?",
        "dimensions": [
          "transact"
        ]
      }
    },
    "headline": "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.",
    "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.",
    "grades": {
      "A": "85-100",
      "B": "70-84",
      "C": "55-69",
      "D": "40-54",
      "F": "0-39"
    },
    "caps": [
      {
        "check": "ACC-10",
        "cap": 40,
        "title": "Product pages return 200 to agent identities (no 403, 429 or challenge)"
      },
      {
        "check": "LEG-02",
        "cap": 50,
        "title": "Offer with a numeric price in JSON-LD"
      },
      {
        "check": "TRX-01",
        "cap": 60,
        "title": "Guest checkout is available"
      }
    ],
    "accessVerification": "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).",
    "digitalMode": {
      "description": "Sites whose products are software or services. These checks are not applicable, and the retail checkout protocols UCP and ACP are optional.",
      "notApplicable": [
        "LEG-05",
        "LEG-09",
        "OFF-04",
        "OFF-05",
        "TRX-09",
        "TRX-04",
        "TRX-05"
      ]
    }
  },
  "dimensions": [
    {
      "id": "access",
      "title": "Access",
      "weight": 25,
      "question": "Can agents reach the site at all?",
      "subScore": "choice"
    },
    {
      "id": "legibility",
      "title": "Legibility",
      "weight": 25,
      "question": "Can an agent read the offer without guessing?",
      "subScore": "choice"
    },
    {
      "id": "offer",
      "title": "Offer clarity",
      "weight": 15,
      "question": "Is there one clear, verifiable offer?",
      "subScore": "choice"
    },
    {
      "id": "transact",
      "title": "Transactability",
      "weight": 25,
      "question": "Can an agent get to payment?",
      "subScore": "checkout"
    },
    {
      "id": "trust",
      "title": "Trust",
      "weight": 10,
      "question": "Can an agent verify who it is buying from?",
      "subScore": "choice"
    }
  ],
  "checks": [
    {
      "id": "ACC-01",
      "dimension": "access",
      "weight": 1,
      "title": "robots.txt is present and parseable",
      "fix": "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."
    },
    {
      "id": "ACC-02",
      "dimension": "access",
      "weight": 0.5,
      "title": "robots.txt allows GPTBot on product pages",
      "fix": "Remove the Disallow rule for GPTBot, or add \"User-agent: GPTBot / Allow: /\" above any blanket block. GPTBot feeds ChatGPT's product knowledge."
    },
    {
      "id": "ACC-03",
      "dimension": "access",
      "weight": 0.5,
      "title": "robots.txt allows ChatGPT-User on product pages",
      "fix": "ChatGPT-User is the live fetch a shopper triggers when they ask ChatGPT about you. Allow it explicitly."
    },
    {
      "id": "ACC-04",
      "dimension": "access",
      "weight": 0.5,
      "title": "robots.txt allows OAI-SearchBot",
      "fix": "OAI-SearchBot indexes for ChatGPT search results. Allow it."
    },
    {
      "id": "ACC-05",
      "dimension": "access",
      "weight": 0.5,
      "title": "robots.txt allows PerplexityBot",
      "fix": "Allow PerplexityBot so Perplexity can index product pages."
    },
    {
      "id": "ACC-06",
      "dimension": "access",
      "weight": 0.5,
      "title": "robots.txt allows Perplexity-User",
      "fix": "Perplexity-User is the live fetch for a shopper's question. Allow it."
    },
    {
      "id": "ACC-07",
      "dimension": "access",
      "weight": 0.5,
      "title": "robots.txt allows ClaudeBot",
      "fix": "Allow ClaudeBot for Claude's index."
    },
    {
      "id": "ACC-08",
      "dimension": "access",
      "weight": 0.5,
      "title": "robots.txt allows Claude-User",
      "fix": "Claude-User is the live fetch from a Claude conversation. Allow it."
    },
    {
      "id": "ACC-09",
      "dimension": "access",
      "weight": 0.5,
      "title": "robots.txt allows Google-Extended",
      "fix": "Google-Extended governs Gemini's use of your content. Blocking it keeps you out of Gemini's shopping answers."
    },
    {
      "id": "ACC-10",
      "dimension": "access",
      "weight": 8,
      "cap": 40,
      "title": "Product pages return 200 to agent identities (no 403, 429 or challenge)",
      "fix": "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."
    },
    {
      "id": "ACC-11",
      "dimension": "access",
      "weight": 3,
      "title": "Homepage returns 200 to agent identities",
      "fix": "Agents start at the homepage. Allow the same agent identities there as on product pages."
    },
    {
      "id": "ACC-12",
      "dimension": "access",
      "weight": 3,
      "title": "No JavaScript challenge or captcha interstitial served to agents",
      "fix": "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."
    },
    {
      "id": "ACC-13",
      "dimension": "access",
      "weight": 1,
      "title": "Agent fetch of a product page completes in under 3 seconds",
      "fix": "Agents time out faster than people. Cache product HTML at the edge and defer non-critical scripts."
    },
    {
      "id": "ACC-14",
      "dimension": "access",
      "weight": 2,
      "title": "Product content reaches an agent without a consent or age gate",
      "fix": "Serve product name and price in the HTML before any consent banner or gate; the gate can still appear for people."
    },
    {
      "id": "LEG-01",
      "dimension": "legibility",
      "weight": 3,
      "title": "Product JSON-LD present on product pages",
      "fix": "Add a schema.org Product block in JSON-LD on every product page. It is the single structure every assistant reads."
    },
    {
      "id": "LEG-02",
      "dimension": "legibility",
      "weight": 3,
      "cap": 50,
      "title": "Offer with a numeric price in JSON-LD",
      "fix": "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."
    },
    {
      "id": "LEG-03",
      "dimension": "legibility",
      "weight": 1,
      "title": "Offer declares priceCurrency",
      "fix": "Add \"priceCurrency\" as an ISO code (GBP, EUR, USD). A price without a currency is ambiguous to a cross-border agent."
    },
    {
      "id": "LEG-04",
      "dimension": "legibility",
      "weight": 2,
      "title": "Offer declares availability",
      "fix": "Add \"availability\" as a schema.org URL (InStock, OutOfStock, PreOrder). Agents skip products they cannot confirm are buyable."
    },
    {
      "id": "LEG-05",
      "dimension": "legibility",
      "weight": 2,
      "title": "Product identifiers present (gtin, mpn or sku)",
      "fix": "Add gtin13 (or gtin, mpn, sku). Agents use identifiers to match your product to the same item elsewhere and compare prices."
    },
    {
      "id": "LEG-06",
      "dimension": "legibility",
      "weight": 1,
      "title": "Product declares a brand",
      "fix": "Add \"brand\" with a Brand object. Brand is one of the first filters a shopper's agent applies."
    },
    {
      "id": "LEG-07",
      "dimension": "legibility",
      "weight": 2,
      "title": "Organization JSON-LD with sameAs on the homepage",
      "fix": "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."
    },
    {
      "id": "LEG-08",
      "dimension": "legibility",
      "weight": 3,
      "title": "Product name and price are in the HTML an agent receives (server-rendered)",
      "fix": "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."
    },
    {
      "id": "LEG-09",
      "dimension": "legibility",
      "weight": 2,
      "title": "Shipping or delivery policy page is discoverable",
      "fix": "Link a plain-HTML shipping and delivery page from the footer and product pages, with delivery times and costs in text, not images."
    },
    {
      "id": "LEG-10",
      "dimension": "legibility",
      "weight": 2,
      "title": "Returns policy page is discoverable",
      "fix": "Link a plain-HTML returns page from the footer and product pages. Agents weigh return terms when choosing between near-identical offers."
    },
    {
      "id": "LEG-11",
      "dimension": "legibility",
      "weight": 1,
      "title": "llms.txt present",
      "fix": "Publish /llms.txt with a short description of the business and links to catalogue, policies and feeds. Support is uneven but it costs nothing."
    },
    {
      "id": "LEG-12",
      "dimension": "legibility",
      "weight": 1,
      "title": "sitemap.xml present and lists product URLs",
      "fix": "Publish a sitemap that includes product URLs and reference it from robots.txt. It is how agents enumerate the catalogue."
    },
    {
      "id": "LEG-13",
      "dimension": "legibility",
      "weight": 1,
      "title": "Canonical URL set on product pages",
      "fix": "Add a rel=canonical link on each product page so variants and tracking URLs resolve to one offer."
    },
    {
      "id": "OFF-01",
      "dimension": "offer",
      "weight": 3,
      "title": "Structured price matches the price in the HTML an agent receives",
      "fix": "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."
    },
    {
      "id": "OFF-02",
      "dimension": "offer",
      "weight": 3,
      "title": "Price present in what an agent receives (no login, modal or region gate)",
      "fix": "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."
    },
    {
      "id": "OFF-03",
      "dimension": "offer",
      "weight": 2,
      "title": "Promotions are expressed structurally",
      "fix": "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."
    },
    {
      "id": "OFF-04",
      "dimension": "offer",
      "weight": 2,
      "title": "Shipping cost stated in structured data",
      "fix": "Add OfferShippingDetails with shippingRate and shippingDestination to the Offer. Delivery cost decides many agent comparisons."
    },
    {
      "id": "OFF-05",
      "dimension": "offer",
      "weight": 2,
      "title": "Delivery time stated on the product page",
      "fix": "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."
    },
    {
      "id": "OFF-06",
      "dimension": "offer",
      "weight": 2,
      "title": "Returns terms in structured data",
      "fix": "Add hasMerchantReturnPolicy (MerchantReturnPolicy with returnPolicyCategory and merchantReturnDays) to the Offer."
    },
    {
      "id": "OFF-07",
      "dimension": "offer",
      "weight": 1,
      "title": "Currency is explicit on the page",
      "fix": "Show the currency symbol or ISO code next to every price."
    },
    {
      "id": "TRX-01",
      "dimension": "transact",
      "weight": 4,
      "cap": 60,
      "title": "Guest checkout is available",
      "fix": "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."
    },
    {
      "id": "TRX-02",
      "dimension": "transact",
      "weight": 3,
      "title": "Cart is reachable by agent identities",
      "fix": "The cart page refuses agent user-agents. Allow the same identities on cart and checkout paths as on product pages."
    },
    {
      "id": "TRX-03",
      "dimension": "transact",
      "weight": 2,
      "title": "No captcha on cart or checkout pages",
      "fix": "reCAPTCHA, hCaptcha or Turnstile on cart or checkout stops an agent before payment. Move anti-fraud to the payment step or exempt verified agents."
    },
    {
      "id": "TRX-04",
      "dimension": "transact",
      "weight": 4,
      "title": "/.well-known/ucp business profile present and valid",
      "fix": "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."
    },
    {
      "id": "TRX-05",
      "dimension": "transact",
      "weight": 2,
      "title": "ACP discovery (/.well-known/acp.json) or ACP product feed present",
      "fix": "Publish an ACP capabilities document or product feed to be purchasable inside ChatGPT."
    },
    {
      "id": "TRX-06",
      "dimension": "transact",
      "weight": 2,
      "title": "MCP endpoint advertised",
      "fix": "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."
    },
    {
      "id": "TRX-07",
      "dimension": "transact",
      "weight": 3,
      "title": "Machine-readable product feed available",
      "fix": "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."
    },
    {
      "id": "TRX-08",
      "dimension": "transact",
      "weight": 2,
      "title": "Accepted payment methods declared",
      "fix": "Declare payment methods in the Organization or Offer schema (acceptedPaymentMethod) or in the UCP profile's payment handlers."
    },
    {
      "id": "TRX-09",
      "dimension": "transact",
      "weight": 2,
      "title": "Variants expressed structurally",
      "fix": "Where a product has sizes or colours, use ProductGroup with hasVariant so an agent can pick the right one without parsing a dropdown."
    },
    {
      "id": "TRX-10",
      "dimension": "transact",
      "weight": 4,
      "title": "An agent can put a product in the basket and reach checkout",
      "fix": "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."
    },
    {
      "id": "TRU-01",
      "dimension": "trust",
      "weight": 3,
      "title": "AggregateRating with a review count on product pages",
      "fix": "Add aggregateRating (ratingValue, reviewCount) from your reviews provider. Agents use it as the tie-breaker between similar offers."
    },
    {
      "id": "TRU-02",
      "dimension": "trust",
      "weight": 2,
      "title": "Policy pages linked from product pages",
      "fix": "Link returns, shipping and privacy pages from the product page footer so an agent on a product page can verify terms without a search."
    },
    {
      "id": "TRU-03",
      "dimension": "trust",
      "weight": 2,
      "title": "HTTPS with no mixed content",
      "fix": "Serve everything over HTTPS and remove http:// asset references."
    },
    {
      "id": "TRU-04",
      "dimension": "trust",
      "weight": 2,
      "title": "Business identity (address, phone or email) is published",
      "fix": "Add address, telephone or email to the Organization schema, or a plain contact page. Agents down-rank sellers they cannot identify."
    },
    {
      "id": "TRU-05",
      "dimension": "trust",
      "weight": 1,
      "title": "Business name is consistent across schema, title and og:site_name",
      "fix": "Use one business name everywhere. Inconsistent names read as different entities to an agent."
    }
  ],
  "changelog": [
    {
      "version": "0.4",
      "change": "Two sub-scores (Agent Choice, Agent Checkout) and a funnel headline. Access rebalanced so real reachability outweighs robots.txt statements."
    },
    {
      "version": "0.3",
      "change": "Live agent verification rule; digital mode."
    },
    {
      "version": "0.1",
      "change": "First publication: 49 checks, five dimensions, three caps."
    }
  ]
}