{"slug": "5-ucp-and-schema-org-failures-blocking-ai-shopping-agents-from-your-store", "title": "5 UCP and Schema.org Failures Blocking AI Shopping Agents from Your Store", "summary": "A developer built Karuma, a free, no-registration scanner that streams a live NDJSON audit of public storefronts against the Universal Commerce Protocol (UCP) specification, checking the /.well-known/ucp manifest, Schema.org Product/Offer JSON-LD, and robots.txt/sitemap accessibility for AI shopping crawlers. After scanning dozens of production stores on Shopify, WooCommerce, PrestaShop and custom stacks, the developer identified five recurring failures, including HTML 404 pages served with 200 status at the UCP manifest path, prices formatted as localized strings instead of plain numbers, and availability values given as custom strings rather than canonical Schema.org URIs.", "body_md": "*What we found scanning real e-commerce sites for Universal Commerce Protocol readiness, and how to fix each one*\n\nAI shopping agents are arriving. Google and Shopify introduced the Universal Commerce Protocol (UCP) at Google I/O. Zalando, DoorDash, and Walmart have announced agent-driven checkout. But when you drop to the technical layer, most stores are invisible to these agents.\n\nI built **Karuma** ([https://karuma.dev/en](https://karuma.dev/en)) to measure exactly that. It is a free, no-registration scanner that streams a live NDJSON audit of any public storefront against the UCP specification. It checks three layers:\n\n`/.well-known/ucp` manifest)`YYYY-MM-DD`, HTTPS, and working transport (` REST`, `MCP`, `A2A`, `Embedded`).` Product` + `Offer` in JSON-LD)`490.00`, not `\"490,00 € Todo incluido\"`), `priceCurrency` in ISO 4217 (`EUR`, `USD`), `availability` as a canonical Schema.org URI (`https://schema.org/InStock`), and global identifiers (` gtin13`/` sku`/` mpn` + `brand`).` robots.txt` without accidental blocks on AI shopping crawlers, accessible `sitemap.xml`, and parity between visible HTML and structured JSON.\nKaruma also renders a side-by-side view (what a human sees vs. what the agent reads in JSON) and emits a shareable report with exact evidence and concrete fix steps.\n\nAfter scanning dozens of production stores across Shopify, WooCommerce, PrestaShop, and custom stacks, five failures repeat constantly. Here they are with real snippets.\n\n`200 OK`\nThe UCP manifest is the front door. If it is absent, the agent assumes no agentic commerce support. Worse: some stacks return a custom 404 page as HTML with status `200`. The parser chokes on `<!DOCTYPE html>` instead of JSON.\n\n**What the agent receives:**\n\n```\nGET /.well-known/ucp\nHTTP/1.1 200 OK\nContent-Type: text/html\n\n<!DOCTYPE html>\n<html><body>Page not found</body></html>\n```\n\n**What it should return:**\n\n```\n{\n  \"version\": \"2026-08-25\",\n  \"capabilities\": [\"catalog.read\", \"checkout.initiate\", \"orders.read\"],\n  \"transports\": [\n    { \"type\": \"REST\", \"endpoint\": \"https://api.store.com/ucp\" },\n    { \"type\": \"MCP\", \"endpoint\": \"https://mcp.store.com\" }\n  ],\n  \"policies\": {\n    \"shipping\": [\"ES\", \"PT\", \"FR\"],\n    \"returns\": \"https://store.com/returns\"\n  }\n}\n```\n\n**Fix:** Add a static file or lightweight endpoint at `/.well-known/ucp` returning valid JSON with `Content-Type: application/json`. Ensure your CDN/WAF does not rewrite 404s to HTML pages.\n\nAgents parse `Offer.price` as a number. They fail on `\"49,99 €\"` or `\"From 49.99\"` or `\"490,00 € Todo incluido\"`. They also require `priceCurrency` as a three-letter ISO 4217 code.\n\n**Broken JSON-LD:**\n\n```\n{\n  \"@type\": \"Offer\",\n  \"price\": \"49,99 €\",\n  \"priceCurrency\": \"EUR\"\n}\n```\n\n**Correct JSON-LD:**\n\n```\n{\n  \"@type\": \"Offer\",\n  \"price\": \"49.99\",\n  \"priceCurrency\": \"EUR\",\n  \"availability\": \"https://schema.org/InStock\"\n}\n```\n\n**Fix:** Emit `price` as a plain number with a dot decimal separator. Keep `priceCurrency` strictly ISO 4217. Strip all formatting, currency symbols, and marketing text from the structured data layer.\n\n`schema.org` URI\nSchema.org defines enumerated values for `availability`. Agents expect the full URI. Custom strings like `\"In Stock\"`, `\"Available\"`, `\"Disponible\"`, or `\"✓ En stock\"` are not machine-readable.\n\n**Broken:**\n\n```\n\"availability\": \"In Stock\"\n```\n\n**Correct:**\n\n```\n\"availability\": \"https://schema.org/InStock\"\n```\n\nOther valid values: `https://schema.org/OutOfStock`, `https://schema.org/PreOrder`, `https://schema.org/LimitedAvailability`.\n\n**Fix:** Map your internal stock states to the exact Schema.org URIs. Do not localise or abbreviate.\n\nAn agent needs to distinguish variants. `Product` without `sku`, `gtin13`, `mpn`, and `brand` is ambiguous. The agent cannot match the item to a catalog entry or verify identity across feeds.\n\n**Minimal viable identity:**\n\n```\n{\n  \"@type\": \"Product\",\n  \"name\": \"Organic Cotton T-Shirt\",\n  \"sku\": \"TSH-ORG-M-BLU\",\n  \"gtin13\": \"8412345678901\",\n  \"brand\": {\n    \"@type\": \"Brand\",\n    \"name\": \"EcoWear\"\n  }\n}\n```\n\n**Fix:** Populate at least one of `gtin13`, `sku`, or `mpn` plus `brand.name` on every `Product`. For variants, each SKU needs its own `Product` node with distinct identifiers.\n\nA manifest that advertises `transports` with endpoints returning 404, 500, or timing out is worse than no manifest. It wastes the agent's budget and signals unreliability.\n\n**Manifest declares:**\n\n```\n\"transports\": [\n  { \"type\": \"MCP\", \"endpoint\": \"https://mcp.store.com\" },\n  { \"type\": \"REST\", \"endpoint\": \"https://api.store.com/ucp\" }\n]\n```\n\n**Reality:**\n\n`https://mcp.store.com` -> DNS resolves, TCP connects, TLS handshake, then HTTP 502`https://api.store.com/ucp` -> 404 Not Found\n**Fix:** Treat the manifest as a contract. Only declare transports that are live, authenticated correctly, and respond within the UCP latency budget. Remove or disable entries for deprecated endpoints.\n\nKaruma's scanner is free, open, and requires no registration. Paste any storefront URL at **[https://karuma.dev/en](https://karuma.dev/en)** and get a streaming audit in seconds. The report shows exact evidence (HTTP status, headers, JSON snippets) and a prioritized technical backlog.\n\nFor store teams that want the missing files generated and verified without writing them from scratch, we also launched the **Karuma GEO & Fix Pack** (**[https://karuma.dev/en/geo-pack](https://karuma.dev/en/geo-pack)**):\n\n`.zip` with `llms.txt`, `llms-full.txt`, `schema-patches.html` with `Organization`/` FAQPage` JSON-LD `@graph`, `robots-ai-patch.txt + ucp.json`, and `rag-landing-rewrites.md`), installable in 45–90 minutes.`[COMPLETAR_DATO_REAL]` rather than invented.\n*Try the live scanner at [karuma.dev/en](https://karuma.dev/en) or check the GEO & Fix Pack at [karuma.dev/en/geo-pack](https://karuma.dev/en/geo-pack) (also in Spanish at [karuma.dev/es](https://karuma.dev/es) and [karuma.dev/es/geo-pack](https://karuma.dev/es/geo-pack)).*", "url": "https://wpnews.pro/news/5-ucp-and-schema-org-failures-blocking-ai-shopping-agents-from-your-store", "canonical_source": "https://dev.to/dimoncelli/5-ucp-and-schemaorg-failures-blocking-ai-shopping-agents-from-your-store-4poc", "published_at": "2026-11-12 08:11:02+00:00", "updated_at": "2026-11-12 08:21:44.361129+00:00", "lang": "en", "topics": ["agent-protocols", "structured-data", "ai-crawlers", "ai-agents", "ai-products"], "entities": ["Karuma", "Google", "Shopify", "Universal Commerce Protocol", "Zalando", "DoorDash", "Walmart", "Schema.org"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/5-ucp-and-schema-org-failures-blocking-ai-shopping-agents-from-your-store", "markdown": "https://wpnews.pro/news/5-ucp-and-schema-org-failures-blocking-ai-shopping-agents-from-your-store.md", "text": "https://wpnews.pro/news/5-ucp-and-schema-org-failures-blocking-ai-shopping-agents-from-your-store.txt", "jsonld": "https://wpnews.pro/news/5-ucp-and-schema-org-failures-blocking-ai-shopping-agents-from-your-store.jsonld"}}