<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Benji Fisher</title>
    <description>The latest articles on Forem by Benji Fisher (@benjifisher).</description>
    <link>https://forem.com/benjifisher</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3787687%2F0c8176d8-b238-43f2-b0af-71689e955123.jpg</url>
      <title>Forem: Benji Fisher</title>
      <link>https://forem.com/benjifisher</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/benjifisher"/>
    <language>en</language>
    <item>
      <title>MCP vs UCP vs AP2: What is the Difference?</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Thu, 16 Apr 2026 10:21:57 +0000</pubDate>
      <link>https://forem.com/benjifisher/mcp-vs-ucp-vs-ap2-what-is-the-difference-2p7b</link>
      <guid>https://forem.com/benjifisher/mcp-vs-ucp-vs-ap2-what-is-the-difference-2p7b</guid>
      <description>&lt;p&gt;Every week we get a version of the same question from developers reaching out about UCP Checker: &lt;strong&gt;"OK, but should I actually build on MCP, UCP, or AP2?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's a reasonable question. The three protocols get lumped together in keynote slides and vendor blog posts, each positioned as "the" standard for how AI agents and commerce should talk to each other. If you're deciding what to implement this quarter, the marketing makes it look like a fork — pick one, live with it.&lt;/p&gt;

&lt;p&gt;Here's the honest answer from running &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;the only continuously-updated UCP directory&lt;/a&gt; of 3,643+ verified stores (as of April 13, 2026):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP, UCP, and AP2 aren't competitors. They're stack layers. If you're doing agentic commerce seriously, you'll end up using all three — and they fit together more cleanly than the messaging suggests.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This post is the argument, anchored in real adoption data from the UCP Checker directory.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack, in one diagram
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────┐
│                                         │
│   AP2       ← payment authorization     │
│             (fits inside UCP's          │
│              payment_handlers)          │
│                                         │
├─────────────────────────────────────────┤
│                                         │
│   UCP       ← the shopping contract     │
│             (what a store sells,        │
│              what capabilities exist,   │
│              which transports to use)   │
│                                         │
├─────────────────────────────────────────┤
│                                         │
│   MCP       ← tool invocation           │
│             (how the agent actually     │
│              calls discover-store,      │
│              search-catalog, etc.)      │
│                                         │
└─────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read that top-to-bottom: an AI shopping agent opens a session, discovers a store via UCP, calls the store's tools via MCP, and — when it's ready to pay — hands off to AP2 for the payment authorization flow.&lt;/p&gt;

&lt;p&gt;That's the whole thing. Now the detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  What MCP actually is
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; is Anthropic's open protocol for connecting AI models to tools, resources, and data sources. It is &lt;strong&gt;not commerce-specific.&lt;/strong&gt; MCP is how Claude Desktop talks to your filesystem, how Cursor talks to your database, how an agent in any environment calls a "list files" or "search knowledge base" tool.&lt;/p&gt;

&lt;p&gt;It's JSON-RPC over stdio, SSE, or HTTP. It defines a handshake, a tool-description schema, a session lifecycle, and a notification system. When an agent wants to "call a function" on an external system, MCP is the envelope that carries the call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In the context of shopping, MCP is the mechanism UCP uses to dispatch commerce tool calls.&lt;/strong&gt; When an AI agent runs &lt;code&gt;search-catalog&lt;/code&gt; against a verified store, it's sending an MCP tool-call message to the endpoint declared in that store's UCP manifest. The &lt;em&gt;fact that MCP is involved&lt;/em&gt; is a transport detail. The &lt;em&gt;fact that a store supports UCP search at all&lt;/em&gt; is what the agent actually cares about.&lt;/p&gt;

&lt;p&gt;Here's the adoption data from our directory right now: &lt;strong&gt;of &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;3,643+ verified UCP stores&lt;/a&gt; as of April 13, 2026, effectively 100% declare MCP as one of their &lt;a href="https://ucpchecker.com/transports" rel="noopener noreferrer"&gt;transports&lt;/a&gt;&lt;/strong&gt;. MCP is the de facto transport for UCP. Not because MCP "won" a protocol war, but because there's nothing else that does what it does at this layer.&lt;/p&gt;

&lt;p&gt;If you want to see the exact transport mix, the live breakdown is on &lt;a href="https://ucpchecker.com/transports" rel="noopener noreferrer"&gt;the transports page&lt;/a&gt;. It's been MCP-dominant since day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What UCP actually is
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ucpchecker.com/protocol" rel="noopener noreferrer"&gt;Universal Commerce Protocol&lt;/a&gt; is the open standard for &lt;strong&gt;agentic commerce specifically&lt;/strong&gt;. It answers questions MCP doesn't:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How does an agent find this store in the first place?&lt;/strong&gt; (Answer: a &lt;a href="https://ucpchecker.com/well-known-ucp" rel="noopener noreferrer"&gt;well-known manifest&lt;/a&gt; at &lt;code&gt;/.well-known/ucp&lt;/code&gt;.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What can the store do?&lt;/strong&gt; (Answer: a declared set of &lt;a href="https://ucpchecker.com/capabilities" rel="noopener noreferrer"&gt;capabilities&lt;/a&gt; — checkout, cart, catalog-search, identity-linking, buyer-consent, fulfillment, and so on.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How does the agent talk to it?&lt;/strong&gt; (Answer: one or more declared &lt;a href="https://ucpchecker.com/transports" rel="noopener noreferrer"&gt;transports&lt;/a&gt; — REST, MCP, A2A, or Embedded. MCP being by far the most common in practice.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What payment methods does the store accept?&lt;/strong&gt; (Answer: a declared list of &lt;a href="https://ucpchecker.com/payment-handlers" rel="noopener noreferrer"&gt;payment handlers&lt;/a&gt; — Stripe, Google Pay, Shop Pay, and others — with enough detail for an agent to tokenize a card.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;UCP is the &lt;strong&gt;contract&lt;/strong&gt;. It's a JSON document agents fetch before they do anything else. Without a valid UCP manifest, an agent doesn't know what your store can do, which tools it exposes, or how to pay. It can scrape your HTML like any other crawler — and most of them will — but the experience is slow, unreliable, and breaks at checkout more often than it succeeds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UCP's job is to be the single document that makes a store shoppable by agents.&lt;/strong&gt; MCP is the mechanism it points at. AP2 fits inside its payment handler list.&lt;/p&gt;

&lt;h2&gt;
  
  
  What AP2 actually is
&lt;/h2&gt;

&lt;p&gt;Agent Payments Protocol is Google's specification for how AI agents authorize and execute payments. It's much more specialized than either MCP or UCP: it's about the &lt;strong&gt;money layer&lt;/strong&gt; specifically — consent, authorization, dispute handling, the cryptographic mandate that lets a specific agent run a specific transaction.&lt;/p&gt;

&lt;p&gt;AP2 is newer than both MCP and UCP, and its adoption numbers reflect that. &lt;strong&gt;At time of writing, we have zero stores in the directory declaring an AP2 payment handler&lt;/strong&gt;, compared to dozens declaring Shop Pay, Stripe, Google Pay, and the various tokenizer namespaces.&lt;/p&gt;

&lt;p&gt;That might sound like a strike against AP2. It isn't. AP2 is a &lt;em&gt;different kind of thing&lt;/em&gt; — it's not a transport and it's not a capability declaration, it's a protocol for the auth step that happens after the agent has already selected items and built a cart. The stores that will eventually use it will declare it as a &lt;a href="https://ucpchecker.com/payment-handlers" rel="noopener noreferrer"&gt;payment handler namespace&lt;/a&gt; inside their existing UCP manifest. UCP is the envelope that carries AP2 into the agent commerce ecosystem.&lt;/p&gt;

&lt;p&gt;When AP2 adoption starts showing up in the directory, UCP Checker will catch it automatically on the next crawl cycle. We'll know because we track every payment handler namespace across every verified store, and we'll be able to tell you exactly which stores flipped first. That's the kind of thing &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;the directory is for&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How they actually compose — a worked example
&lt;/h2&gt;

&lt;p&gt;Picture an AI shopping agent asked to buy a pair of shoes. Here's what happens in a UCP-verified flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;UCP discovery.&lt;/strong&gt; The agent fetches &lt;code&gt;https://allbirds.com/.well-known/ucp&lt;/code&gt;. It parses the JSON, reads the capability list (&lt;code&gt;checkout&lt;/code&gt;, &lt;code&gt;cart&lt;/code&gt;, &lt;code&gt;catalog-search&lt;/code&gt;, &lt;code&gt;payment&lt;/code&gt;, &lt;code&gt;identity-linking&lt;/code&gt;…), picks the transport it wants to use from the declared list (it picks MCP because it's listed first and the agent speaks MCP), and notes the payment handlers this store accepts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP session.&lt;/strong&gt; The agent connects to the MCP endpoint declared in the UCP manifest. It opens a session, lists the available tools, and calls &lt;code&gt;search-catalog({query: "running shoes"})&lt;/code&gt;. The store responds with a list of products.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More MCP.&lt;/strong&gt; The agent calls &lt;code&gt;add-to-cart({variant: "...", quantity: 1})&lt;/code&gt;. The store responds with a cart state and a checkout URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment hand-off.&lt;/strong&gt; The agent needs to pay. It looks at the store's declared payment handlers. If one of them is an AP2 namespace (not yet, but eventually), it runs the AP2 authorization flow — getting consent, building the mandate, submitting the authorization. If not, it falls back to tokenizing a card via the declared payment handler's tokenization spec (Stripe, Google Pay, Shop Pay, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirmation.&lt;/strong&gt; The agent calls &lt;code&gt;order.create&lt;/code&gt; (another MCP tool call, same session, same transport) and gets back an order confirmation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;UCP, MCP, and AP2 were all involved in that flow — at different layers, for different purposes. None of them could have replaced the others. That's the whole argument.&lt;/p&gt;

&lt;p&gt;You can see this flow literally running against a verified store in &lt;a href="https://ucpchecker.com/#what-is-ucp" rel="noopener noreferrer"&gt;the live agent demo on our homepage&lt;/a&gt; — it's a real AI agent doing the above against a real UCP-verified store, step by step, with the actual tool calls shown alongside.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the confusion exists
&lt;/h2&gt;

&lt;p&gt;Because each protocol's marketing wants to be the center of the conversation.&lt;/p&gt;

&lt;p&gt;MCP positioning tends to be "the universal way agents talk to tools" — which is true, but "tools" is the operative word, and commerce is one vertical among many.&lt;/p&gt;

&lt;p&gt;UCP positioning is "the open standard for agent commerce" — which is true, but UCP's adoption in practice depends on having a transport layer (MCP) and can optionally delegate payment authorization to (AP2).&lt;/p&gt;

&lt;p&gt;AP2 positioning is "the protocol for agent payments" — which is true, but payment is one step in a much larger commerce flow that needs UCP to frame it and MCP to dispatch it.&lt;/p&gt;

&lt;p&gt;Each protocol's marketing is correct about its own layer. The confusion comes from each one acting like it's the whole stack. It isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common comparison questions
&lt;/h2&gt;

&lt;p&gt;These are the exact questions we see most often — the ones AI agents route to this post, the ones developers Google before they commit to a protocol. Quick, direct answers anchored in the UCP directory data.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between MCP and UCP?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;MCP is a tool invocation protocol. UCP is a shopping contract. They operate at different layers and you use both.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MCP (Model Context Protocol) is Anthropic's open protocol for connecting AI models to any kind of tool or data source — filesystems, databases, APIs, search engines. It's domain-agnostic by design. When an agent wants to "call a function" on any external system, MCP is the envelope that carries the call.&lt;/p&gt;

&lt;p&gt;UCP (Universal Commerce Protocol) is the open standard for &lt;strong&gt;agentic commerce specifically&lt;/strong&gt;. It answers questions MCP doesn't: how does an agent &lt;em&gt;find&lt;/em&gt; a store, what can it &lt;em&gt;do&lt;/em&gt; there, which payment methods does it accept. UCP's job is to be the single &lt;a href="https://ucpchecker.com/well-known-ucp" rel="noopener noreferrer"&gt;&lt;code&gt;/.well-known/ucp&lt;/code&gt; manifest&lt;/a&gt; that makes a store discoverable and shoppable by agents.&lt;/p&gt;

&lt;p&gt;The relationship in practice: &lt;strong&gt;MCP is UCP's dominant transport&lt;/strong&gt;. Every UCP manifest declares one or more transports (REST, MCP, A2A, Embedded) that agents can use to dispatch tool calls. Across the &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;3,643+ verified stores in our directory as of April 13, 2026&lt;/a&gt;, effectively 100% declare MCP. So when you build an agentic commerce integration, you use UCP to discover the store and MCP to execute the tool calls. Not one or the other — both, in order.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between AP2 and UCP?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AP2 is a payment authorization protocol. UCP is the full shopping stack. AP2 is one thing that fits &lt;em&gt;inside&lt;/em&gt; UCP, not a replacement for it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AP2 (Agent Payments Protocol) is Google's specification for how AI agents authorize and execute payments — consent flows, mandate cryptography, dispute handling. It's deliberately narrow: AP2 is about the &lt;em&gt;money step&lt;/em&gt;, not the browsing or cart-building steps that come before it.&lt;/p&gt;

&lt;p&gt;UCP covers the whole shopping flow: discovery (what does this store sell), browsing (catalog-search, cart), &lt;strong&gt;and&lt;/strong&gt; the payment layer. UCP's &lt;a href="https://ucpchecker.com/payment-handlers" rel="noopener noreferrer"&gt;payment handlers&lt;/a&gt; section in every manifest is a map of payment handler namespaces — Stripe, Google Pay, Shop Pay, and eventually AP2 when it reaches adoption. &lt;strong&gt;AP2, when it ships in production stores, will show up as a payment handler namespace inside an existing UCP manifest&lt;/strong&gt;, sitting alongside the other tokenization methods an agent can choose from.&lt;/p&gt;

&lt;p&gt;Current adoption data as of April 13, 2026: &lt;strong&gt;zero stores in the &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;UCP directory&lt;/a&gt; declare an AP2 payment handler&lt;/strong&gt;. That's not a criticism — AP2 is newer than both MCP and UCP, and the rollout is gated on payment processors exposing it. But it makes the practical answer clear right now: you publish a UCP manifest today, you add AP2 later when your payment processor supports it. UCP is the umbrella; AP2 is one of the spokes it will eventually hold.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between A2A and UCP?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A2A is a transport protocol (like MCP). UCP is the shopping contract. A2A is one of UCP's allowed transport options, not a competitor.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A2A (&lt;a href="https://google.github.io/A2A/" rel="noopener noreferrer"&gt;Agent2Agent Protocol&lt;/a&gt;) is Google's protocol for agent-to-agent communication — how two agents talk to each other directly without a human intermediary. It serves a similar role to MCP within the UCP stack: it's the mechanism an agent uses to dispatch tool calls against a store's endpoint.&lt;/p&gt;

&lt;p&gt;UCP's v2026-04-08 spec &lt;a href="https://ucpchecker.com/transports" rel="noopener noreferrer"&gt;lists four allowed transports&lt;/a&gt;: &lt;strong&gt;REST, MCP, A2A, and Embedded&lt;/strong&gt;. A store can declare any or all of them in its manifest — and agents will pick whichever they support when they connect. A2A is formally on the list, same as MCP.&lt;/p&gt;

&lt;p&gt;In practice, &lt;strong&gt;A2A adoption on verified stores is effectively zero today&lt;/strong&gt;, versus MCP's near-100%. The reason isn't technical, it's ecosystem timing: MCP shipped earlier and got the first wave of tooling. A2A is a strong candidate for the second wave once agent-to-agent coordination (one agent buying on behalf of another, multi-agent fulfilment pipelines) becomes a common pattern. When that happens, stores will add A2A to their existing UCP manifests alongside MCP — not replacing it. The correct framing is still "A2A goes &lt;em&gt;inside&lt;/em&gt; UCP," same as MCP does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which should you actually adopt
&lt;/h2&gt;

&lt;p&gt;Depends on what you're building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a store owner or ecommerce engineer&lt;/strong&gt;, your job is to &lt;a href="https://ucpchecker.com/well-known-ucp" rel="noopener noreferrer"&gt;publish a valid UCP manifest&lt;/a&gt; at &lt;code&gt;/.well-known/ucp&lt;/code&gt; that declares your capabilities, transports (MCP will almost certainly be one of them), and payment handlers. You don't need to "pick" MCP — UCP will tell you to expose an MCP endpoint as one of its transports, and most of the tooling you'll find assumes MCP. AP2 you can add later, as a payment handler, when your payment processor supports it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're an agent or tooling developer&lt;/strong&gt;, you need to speak all three, in the right order. Fetch UCP first to discover the store. Use MCP to actually dispatch tool calls against the declared endpoint. Handle AP2 at the payment step if the store declares it. In practice you'll build a UCP client library that wraps all of this transparently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a payments company&lt;/strong&gt;, AP2 is your layer. Your job is to get your payment processor's tokenization spec declared as a payment handler in UCP manifests across the ecosystem, and eventually to support AP2 mandates as the authorization step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're analyzing the ecosystem&lt;/strong&gt;, look at the UCP adoption data. MCP transport counts and AP2 payment handler counts are both measurable inside UCP manifests — which is why we surface them on the &lt;a href="https://ucpchecker.com/platforms" rel="noopener noreferrer"&gt;platforms&lt;/a&gt;, &lt;a href="https://ucpchecker.com/transports" rel="noopener noreferrer"&gt;transports&lt;/a&gt;, and &lt;a href="https://ucpchecker.com/payment-handlers" rel="noopener noreferrer"&gt;payment handlers&lt;/a&gt; pages. The question is never "which protocol won," it's "how many stores have it."&lt;/p&gt;

&lt;h2&gt;
  
  
  The one-line summary
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;UCP is the shopping contract. MCP is how agents dispatch tool calls against it. AP2 is how they authorize payments inside it. All three are required for a complete agent commerce stack, and none of them replaces the others.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're unclear whether your store is set up correctly, &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;run a live check&lt;/a&gt; — we'll fetch your manifest, validate it against the current spec, and tell you exactly which transports and payment handlers you're declaring (and which you're missing). If you're evaluating two stores' UCP coverage side-by-side, &lt;a href="https://ucpchecker.com/compare" rel="noopener noreferrer"&gt;the compare tool&lt;/a&gt; puts their capabilities, transports, and payment handlers in a single scannable view.&lt;/p&gt;

&lt;p&gt;And if you're building something on top of the stack and want to know which stores have what — that's what &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;the directory&lt;/a&gt; is for.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check your manifest:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;ucpchecker.com/check&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare two stores:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/compare" rel="noopener noreferrer"&gt;ucpchecker.com/compare&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browse the directory:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;ucpchecker.com/directory&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer guide to /.well-known/ucp:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/well-known-ucp" rel="noopener noreferrer"&gt;ucpchecker.com/well-known-ucp&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>ai</category>
      <category>ucp</category>
    </item>
    <item>
      <title>Introducing Side-by-Side Store Compare: See How Any Two UCP Stores Stack Up</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Mon, 13 Apr 2026 20:47:52 +0000</pubDate>
      <link>https://forem.com/benjifisher/introducing-side-by-side-store-compare-see-how-any-two-ucp-stores-stack-up-3djm</link>
      <guid>https://forem.com/benjifisher/introducing-side-by-side-store-compare-see-how-any-two-ucp-stores-stack-up-3djm</guid>
      <description>&lt;p&gt;Three months into running UCPChecker, the most common follow-up question we get from anyone reading a status report is the same: &lt;strong&gt;"OK, but how does that compare to [other store]?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That question comes from everywhere. &lt;a href="https://ucpchecker.com/developer-tools" rel="noopener noreferrer"&gt;Developers&lt;/a&gt; picking which store to integrate with first. &lt;a href="https://ucpchecker.com/stats" rel="noopener noreferrer"&gt;Analysts&lt;/a&gt; tracking which platforms are pulling ahead in UCP coverage. &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;Store owners&lt;/a&gt; benchmarking against direct competitors. Marketing teams putting together pitch decks about why their stack is more agent-ready than the next. Platform vendors comparing their hosted ecosystem against rival platforms. &lt;a href="https://ucpchecker.com/mcp-tools" rel="noopener noreferrer"&gt;AI agent builders&lt;/a&gt; deciding which retailers to feature in demo flows.&lt;/p&gt;

&lt;p&gt;None of these audiences really care about a single store's UCP coverage in isolation. They all care about how it stacks up against another. Whether &lt;a href="https://ucpchecker.com/status/allbirds.com" rel="noopener noreferrer"&gt;Allbirds&lt;/a&gt; is more agent-ready than &lt;a href="https://ucpchecker.com/status/casper.com" rel="noopener noreferrer"&gt;Casper&lt;/a&gt;. Whether &lt;a href="https://ucpchecker.com/status/boden.com" rel="noopener noreferrer"&gt;Boden's&lt;/a&gt; Shopify implementation goes deeper than &lt;a href="https://ucpchecker.com/status/bornforfashion.com" rel="noopener noreferrer"&gt;Born for Fashion's&lt;/a&gt;. Whether the brand they're about to integrate with has more capabilities than the one they're already integrated with. The interesting answer is always relative.&lt;/p&gt;

&lt;p&gt;Until today, the only way to get that answer on UCPChecker was to open two browser tabs and squint. So we built the thing people were already trying to do manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://ucpchecker.com/compare" rel="noopener noreferrer"&gt;Compare any two UCP stores side-by-side at ucpchecker.com/compare →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Pick two domains. Get every measurable UCP attribute laid out side by side in a single scannable view.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Headline metrics&lt;/strong&gt;: status, UCP version, latency, capability count, transport count, payment handler count, HTTP status, robots.txt policy, platform. Quantitative cells highlight the leading side with a soft green left-border, so you can scan winners without reading numbers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capability matrix&lt;/strong&gt;: every UCP capability declared by either store, bucketed into "Both stores", "A only", and "B only". Each chip links straight to the &lt;a href="https://ucpchecker.com/capabilities" rel="noopener noreferrer"&gt;capability's deep-dive page&lt;/a&gt;, so if you spot a gap you can immediately see what it is and why it matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transport diff&lt;/strong&gt;: same Both / A only / B only treatment for &lt;a href="https://ucpchecker.com/transports/rest" rel="noopener noreferrer"&gt;REST&lt;/a&gt;, &lt;a href="https://ucpchecker.com/transports/mcp" rel="noopener noreferrer"&gt;MCP&lt;/a&gt;, A2A, and &lt;a href="https://ucpchecker.com/transports/embedded" rel="noopener noreferrer"&gt;Embedded&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI bot access matrix&lt;/strong&gt;: GPTBot, Google-Extended, ClaudeBot, Applebot-Extended, and CCBot — allowed, blocked, or unknown for each store.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment handlers&lt;/strong&gt;: which payment methods each manifest declares, including the ones one side has and the other doesn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick another&lt;/strong&gt;: tiny inline form pre-filled with the current side A so you can swap side B and re-run instantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Related comparisons&lt;/strong&gt;: auto-suggested by capability overlap with side A — a useful map of who else is building similar agent surface in the same space.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status-aware FAQ&lt;/strong&gt;: the questions change depending on the matchup. Two verified stores get a different lead question than one verified vs one not-detected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's free, public, indexable, and works with any domain. If a store isn't already in our &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;directory&lt;/a&gt;, we run a &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;live check&lt;/a&gt; the first time you compare it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we built it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Two reasons. The first one is the most honest.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Right now, UCP coverage is a moving target. Some stores have everything declared — &lt;a href="https://ucpchecker.com/capabilities/checkout" rel="noopener noreferrer"&gt;checkout&lt;/a&gt;, &lt;a href="https://ucpchecker.com/capabilities/cart" rel="noopener noreferrer"&gt;cart management&lt;/a&gt;, &lt;a href="https://ucpchecker.com/capabilities/identity-linking" rel="noopener noreferrer"&gt;identity linking&lt;/a&gt;, &lt;a href="https://ucpchecker.com/capabilities/payment" rel="noopener noreferrer"&gt;payment tokens&lt;/a&gt;, multiple &lt;a href="https://ucpchecker.com/transports" rel="noopener noreferrer"&gt;transports&lt;/a&gt;. Other stores have a single capability and a single transport, technically &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;verified&lt;/a&gt; but barely useful to an agent. The &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;directory&lt;/a&gt; grade tells you "verified" or "not". It doesn't tell you whether one verified store is significantly more agent-ready than another.&lt;/p&gt;

&lt;p&gt;That difference matters more every week. The teams building agentic commerce tooling — the ones picking which stores to index first, which to feature in demo flows, which to recommend to their users — they need a relative view. They need to know that allbirds.com's manifest goes three levels deeper than the manifest of an otherwise equivalent store. They were already opening two status pages and comparing fields by hand. We watched it happen in user sessions. Compare just makes that workflow native.&lt;/p&gt;

&lt;p&gt;The second reason is more strategic. We've been quietly building the infrastructure for what we think will be the most important question in agentic commerce as it matures: &lt;strong&gt;not whether a store is verified, but who's pulling ahead.&lt;/strong&gt; Compare is the first user-facing surface that exposes that question directly. There will be more.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we built it (the short version)
&lt;/h2&gt;

&lt;p&gt;The data was already there. Every Merchant in our database has its capabilities, transports, and payment handlers loaded as proper many-to-many relationships. The computation is just three set operations per relation: intersect, left-only, right-only. The hard part was deciding what to compare and how to render the diff so two columns of dense data still feel scannable on a phone.&lt;/p&gt;

&lt;p&gt;Some of the design decisions worth calling out:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alphabetical canonical URLs.&lt;/strong&gt; &lt;code&gt;/compare/casper.com/vs/allbirds.com&lt;/code&gt; 301-redirects to &lt;code&gt;/compare/allbirds.com/vs/casper.com&lt;/code&gt;. Without that, every store-pair would generate two URLs and split its link equity in half. Pretty URL, single canonical, no duplicate content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sync check on first visit.&lt;/strong&gt; If you compare a domain that isn't in our database yet, we run a &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;fresh UCP check&lt;/a&gt; inline before rendering. The compare page never shows "no data" — it always has something to compare. Same pattern as the &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;per-store status pages&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Noindex when neither side is verified.&lt;/strong&gt; Two non-verified stores produces a thin page that would just pollute the search index. Those pages still work for visitors who land on them — they just don't get crawled. As soon as either side becomes verified, the page flips to indexable automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A "winner" highlight, not a "winner" badge.&lt;/strong&gt; The leading side on a quantitative metric (lower latency, more capabilities, fresher check) gets a gentle green left-border on its cell — but we never write the word "better" or "worse" anywhere. The data speaks for itself, and "better" isn't a value judgment we want to be making about other people's stores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Status-aware FAQ that mirrors visible HTML to JSON-LD.&lt;/strong&gt; Every compare page emits a real &lt;code&gt;FAQPage&lt;/code&gt; schema with the same questions and answers a human reader sees. The FAQ branches based on the matchup so the lead question is always relevant to what you're looking at.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Four pairings we've been opening manually for weeks. Each one is a live embed of the actual comparison — the same data refreshes every 24 hours from our crawler.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;allbirds.com vs casper.com&lt;/strong&gt; — two well-known DTC brands, see how their capabilities differ.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ucpchecker.com/compare/allbirds.com/vs/casper.com" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4k2xv663odafm1d0yq93.png" alt="allbirds.com vs casper.com UCP comparison" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;boden.com vs kyliecosmetics.com&lt;/strong&gt; — both verified Shopify stores, compare their depth.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ucpchecker.com/compare/boden.com/vs/kyliecosmetics.com" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp6cn76fzgl7cirwylag6.png" alt="boden.com vs kyliecosmetics.com UCP comparison" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;hairlust.com vs thebodyshop.com&lt;/strong&gt; — beauty vs hair, both verified.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ucpchecker.com/compare/hairlust.com/vs/thebodyshop.com" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ungszgdgli2rocv9w7b.png" alt="hairlust.com vs thebodyshop.com UCP comparison" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;bornforfashion.com vs casper.com&lt;/strong&gt; — fashion vs sleep, contrasting capability surface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ucpchecker.com/compare/bornforfashion.com/vs/casper.com" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw09qd50g4yccts789uuk.png" alt="bornforfashion.com vs casper.com UCP comparison" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or just start typing two domains into &lt;a href="https://ucpchecker.com/compare" rel="noopener noreferrer"&gt;ucpchecker.com/compare&lt;/a&gt;. Autocomplete suggests from the verified directory.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;A few obvious extensions we're sitting on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Embeds need more testing in the wild.&lt;/strong&gt; We've shipped iframe and Markdown embeds and validated them locally, but the real test is seeing them deployed across Substack, Medium, Notion, GitHub READMEs, and the hundred CMSes we don't have on our test bench. If you embed a comparison and the layout breaks, &lt;a href="https://ucpchecker.com/contact" rel="noopener noreferrer"&gt;tell us&lt;/a&gt; — we'll fix it fast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;postMessage iframe auto-resize.&lt;/strong&gt; Right now embeds use a fixed iframe height (900px by default). Comparisons with sparse capability data leave whitespace; comparisons with dense data sometimes scroll. The cleanest fix is a postMessage handshake from the embed to the host page so the iframe sizes itself to its content. On the list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three-way and N-way comparison.&lt;/strong&gt; Two columns is the right default — past two, the visual gets cramped — but for "which of these five Shopify stores has the deepest UCP implementation" type questions, we'll likely add a tabular wide-mode behind a separate URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compare is the first product surface we've shipped that frames UCP coverage as a relative thing rather than a binary verified/not. It changes what you can ask. We're already seeing internal queries we couldn't run before — "show me every &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;verified store&lt;/a&gt; that has &lt;a href="https://ucpchecker.com/capabilities/cart" rel="noopener noreferrer"&gt;cart management&lt;/a&gt; but is missing &lt;a href="https://ucpchecker.com/capabilities/identity-linking" rel="noopener noreferrer"&gt;identity linking&lt;/a&gt;" is one diff away from being a real question someone outside our team can answer.&lt;/p&gt;

&lt;p&gt;If you build something with it, or if you find a comparison that surprised you, &lt;a href="https://ucpchecker.com/contact" rel="noopener noreferrer"&gt;let us know&lt;/a&gt;. The interesting comparisons are the ones we haven't thought to run.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Try it now:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/compare" rel="noopener noreferrer"&gt;ucpchecker.com/compare&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browse the directory:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;ucpchecker.com/directory&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track adoption live:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/stats" rel="noopener noreferrer"&gt;ucpchecker.com/stats&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate a manifest:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/ucp-validator" rel="noopener noreferrer"&gt;ucpchecker.com/ucp-validator&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get notified on changes:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;ucpchecker.com/alerts&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>product</category>
      <category>ucp</category>
    </item>
    <item>
      <title>UCP v2026-04-08 Spec Update</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Sat, 11 Apr 2026 12:04:52 +0000</pubDate>
      <link>https://forem.com/benjifisher/ucp-v2026-04-08-spec-update-39l2</link>
      <guid>https://forem.com/benjifisher/ucp-v2026-04-08-spec-update-39l2</guid>
      <description>&lt;p&gt;On April 9th, the UCP Technical Council shipped &lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/releases/tag/v2026-04-08" rel="noopener noreferrer"&gt;v2026-04-08&lt;/a&gt; — the first spec bump since January's &lt;code&gt;2026-01-23&lt;/code&gt; release. It's the largest single release in the protocol's history: 26 new features, 6 breaking changes, 19 documentation updates, and contributions from 15 first-time contributors.&lt;/p&gt;

&lt;p&gt;This isn't a patch. It's the release where UCP stops being a checkout-and-order protocol and starts becoming a full commerce platform.&lt;/p&gt;

&lt;p&gt;Here's what changed, what it means, and what you should do about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Carts are now a first-class capability
&lt;/h3&gt;

&lt;p&gt;The most consequential addition is formal cart support (&lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/pull/73" rel="noopener noreferrer"&gt;#73&lt;/a&gt;). The &lt;code&gt;dev.ucp.shopping.cart&lt;/code&gt; capability gives agents the ability to create, read, update, and manage persistent shopping carts — the workflow that dominates human e-commerce but has been entirely absent from agent commerce until now.&lt;/p&gt;

&lt;p&gt;We &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-march-2026" rel="noopener noreferrer"&gt;wrote in March&lt;/a&gt; that only 2 out of 2,832 verified stores declared cart capabilities. That number was low because the spec itself hadn't formalized the capability. Now it has. The schema defines add-to-cart, remove, quantity updates, and cart retrieval. Discount extensions have been &lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/pull/246" rel="noopener noreferrer"&gt;expanded to work with carts&lt;/a&gt; too, so agents can apply promo codes before checkout.&lt;/p&gt;

&lt;p&gt;For agent developers: this is the capability that unlocks multi-step shopping. Instead of "find product → checkout immediately," agents can now build baskets, compare options, apply discounts, and let the user review before committing. Design for it now, even if adoption will take months to ramp.&lt;/p&gt;

&lt;h3&gt;
  
  
  Catalog search and product lookup
&lt;/h3&gt;

&lt;p&gt;Agents can now discover what a store actually sells. The new &lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/pull/55" rel="noopener noreferrer"&gt;catalog search&lt;/a&gt; and &lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/pull/195" rel="noopener noreferrer"&gt;product lookup&lt;/a&gt; capabilities (&lt;code&gt;dev.ucp.shopping.catalog_search&lt;/code&gt; and &lt;code&gt;dev.ucp.shopping.catalog_lookup&lt;/code&gt;) give agents structured access to product discovery — search by keyword, filter by attributes, and retrieve full product details including variant IDs.&lt;/p&gt;

&lt;p&gt;Previously, agents relied on unstructured HTML scraping or platform-specific APIs to find products before initiating checkout. Now product discovery is part of the protocol itself. This is the missing first step: an agent can search a store's catalog, find what it needs, add items to a cart, and check out — all through UCP.&lt;/p&gt;

&lt;p&gt;We've added catalog detection to &lt;a href="https://ucpchecker.com/capabilities" rel="noopener noreferrer"&gt;UCPChecker's capability tracking&lt;/a&gt;. As stores adopt these capabilities, you'll see them in the &lt;a href="https://ucpchecker.com/stats" rel="noopener noreferrer"&gt;stats&lt;/a&gt; and on individual &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;store profiles&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Request and response signing
&lt;/h3&gt;

&lt;p&gt;Cryptographic signing (&lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/pull/156" rel="noopener noreferrer"&gt;#156&lt;/a&gt;) is the security feature the protocol needed. Stores can now sign responses, and agents can verify they're talking to the real merchant — not a MITM or a spoofed endpoint.&lt;/p&gt;

&lt;p&gt;The spec uses JWK-format public keys published in the discovery profile. What's notable is where those keys live: &lt;code&gt;signing_keys&lt;/code&gt; has moved from inside the &lt;code&gt;ucp&lt;/code&gt; object to the &lt;strong&gt;root level&lt;/strong&gt; of the discovery profile, sitting as a sibling of &lt;code&gt;ucp&lt;/code&gt; rather than nested within it. This is a structural change that affects how validators parse manifests.&lt;/p&gt;

&lt;p&gt;We've updated &lt;a href="https://ucpchecker.com/validator" rel="noopener noreferrer"&gt;our validator&lt;/a&gt; to handle both locations — the new root-level position for v2026-04-08+ manifests, and the legacy nested position for older versions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The structural changes that matter
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Business profiles vs. platform profiles
&lt;/h3&gt;

&lt;p&gt;This is the change that will generate the most false positives if your tooling doesn't adapt.&lt;/p&gt;

&lt;p&gt;v2026-04-08 formally distinguishes &lt;strong&gt;platform profiles&lt;/strong&gt; (the full spec declarations that platforms like Shopify publish) from &lt;strong&gt;business profiles&lt;/strong&gt; (what individual stores serve at &lt;code&gt;/.well-known/ucp&lt;/code&gt;). The key difference: business profiles no longer require &lt;code&gt;spec&lt;/code&gt; and &lt;code&gt;schema&lt;/code&gt; URLs on capabilities, services, or payment handlers. Those fields are only mandatory at the platform level — stores inherit them from their platform.&lt;/p&gt;

&lt;p&gt;This makes sense. A Shopify merchant shouldn't need to declare &lt;code&gt;"spec": "https://ucp.dev/specification/shopping/checkout/"&lt;/code&gt; in their manifest — that's Shopify's concern, not the merchant's. But every validator that checked for these fields as required will now throw false warnings against perfectly valid business profiles.&lt;/p&gt;

&lt;p&gt;UCPChecker has already updated its validation rules. If your store runs v2026-04-08, we'll validate against the business profile schema — no spurious warnings about missing &lt;code&gt;spec&lt;/code&gt; or &lt;code&gt;schema&lt;/code&gt; fields that your platform handles upstream. You can verify your store at &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;UCPChecker.com&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-parent capability extensions
&lt;/h3&gt;

&lt;p&gt;Capabilities can now &lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/pull/96" rel="noopener noreferrer"&gt;extend multiple parents&lt;/a&gt; with deterministic schema resolution. This sounds abstract, but it solves a real problem: capabilities like embedded checkout that need to compose behaviors from both the cart and checkout namespaces.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;extends&lt;/code&gt; field on capabilities now accepts an array of reverse-domain names instead of just a single string. Schema resolution follows a defined order, so there's no ambiguity about which parent's definition wins when there's a conflict.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supported versions for backwards compatibility
&lt;/h3&gt;

&lt;p&gt;Business profiles can now declare a &lt;code&gt;supported_versions&lt;/code&gt; field — a map of older protocol versions to their profile URIs. This means a store can advertise "I speak v2026-04-08, but I also have a v2026-01-23 profile at this URL" — letting agents negotiate down to a version they understand.&lt;/p&gt;

&lt;p&gt;For the ecosystem, this is important infrastructure. It means the v2026-01-23 → v2026-04-08 migration doesn't have to be a flag day. Stores can support both versions simultaneously while agents upgrade.&lt;/p&gt;

&lt;h2&gt;
  
  
  The breaking changes
&lt;/h2&gt;

&lt;p&gt;Six changes in this release are marked breaking. Here's what they actually break:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Order schema: currency is now required&lt;/strong&gt; (&lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/pull/283" rel="noopener noreferrer"&gt;#283&lt;/a&gt;). Previously optional, the &lt;code&gt;currency&lt;/code&gt; field on orders is now mandatory. If your implementation omits it, your order responses will fail validation against v2026-04-08. Fix: add the ISO 4217 currency code (e.g., &lt;code&gt;"USD"&lt;/code&gt;) to your order objects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authorization and abuse signals&lt;/strong&gt; (&lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/pull/203" rel="noopener noreferrer"&gt;#203&lt;/a&gt;). Stores can now communicate authorization requirements and abuse indicators to agents. This is new infrastructure for trust — stores can signal "this transaction requires additional verification" or "this request pattern looks suspicious" in a structured way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updated order capability&lt;/strong&gt; (&lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/pull/254" rel="noopener noreferrer"&gt;#254&lt;/a&gt;). The order schema has been restructured. If you're consuming or producing order responses, check your field names against the updated schema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Embedded protocol error alignment&lt;/strong&gt; (&lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/pull/325" rel="noopener noreferrer"&gt;#325&lt;/a&gt;). Error responses in the embedded checkout protocol now follow UCP's standard error conventions. If you're parsing embedded checkout errors, the shape has changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Totals format change&lt;/strong&gt; (&lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/pull/299" rel="noopener noreferrer"&gt;#299&lt;/a&gt;). Total amounts now use &lt;code&gt;signed_amount.json&lt;/code&gt; — a format that can represent both positive and negative values (for discounts, refunds). If you're reading totals as simple numbers, you'll need to handle the new format.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identity linking reverted&lt;/strong&gt; (&lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/pull/329" rel="noopener noreferrer"&gt;#329&lt;/a&gt;). A previously planned identity linking change was reverted. If you implemented against an earlier draft, verify your identity handling matches the released spec.&lt;/p&gt;

&lt;h2&gt;
  
  
  What didn't ship
&lt;/h2&gt;

&lt;p&gt;Worth noting what's still in progress. Loyalty capabilities (&lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/issues/251" rel="noopener noreferrer"&gt;#251&lt;/a&gt;) and return extensions (&lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/issues/257" rel="noopener noreferrer"&gt;#257&lt;/a&gt;) were tracked for this release but didn't make the cut. The cart capability landed; the full post-purchase lifecycle is still forming.&lt;/p&gt;

&lt;p&gt;Per-capability versioning — the ability to bump individual capabilities without bumping the entire protocol — was discussed at the March TC meeting but deferred. The infrastructure for sub-repo versioning is being explored by TC members, but for now, breaking changes still bundle into full protocol bumps.&lt;/p&gt;

&lt;h2&gt;
  
  
  23 contributors, 15 first-timers
&lt;/h2&gt;

&lt;p&gt;This release had contributions from 23 people, 15 of whom were first-time contributors. The contributor base has broadened beyond the founding companies: documentation fixes from independent developers, schema improvements from payment processors, and tooling contributions from platform teams.&lt;/p&gt;

&lt;p&gt;Notable additions: endorsed partners now include Block, Fiserv, Klarna, Splitit, Affirm, and Checkout.com — payment infrastructure companies whose involvement signals where agent commerce payment flows are heading.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do now
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you're a store operator:&lt;/strong&gt; Check your store at &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;UCPChecker.com&lt;/a&gt;. We've updated our validation to v2026-04-08 rules, so you'll see an accurate assessment against the new spec. If you're on Shopify, your platform will handle the migration — watch for their update timeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're an agent developer:&lt;/strong&gt; Start building for carts and catalog search. These capabilities will roll out through platform-level updates, and when they do, the adoption curve will look like checkout's did — slow for a few weeks, then near-universal overnight. The &lt;a href="https://ucpplayground.com?utm_source=ucpchecker&amp;amp;utm_medium=blog&amp;amp;utm_campaign=v2026-04-08" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt; is the place to test agent interactions against stores that adopt early.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a platform team:&lt;/strong&gt; The business-vs-platform profile split is the structural change to focus on. Your merchants' profiles just got simpler (fewer required fields), but your platform profile got stricter (spec and schema URLs are mandatory). Review the &lt;a href="https://ucpchecker.com/specs" rel="noopener noreferrer"&gt;spec version details&lt;/a&gt; and validate your platform-level profile against the new schema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're building tooling:&lt;/strong&gt; Update your validators. The &lt;code&gt;signing_keys&lt;/code&gt; location change, business profile relaxation, and new capability schemas all affect validation logic. We've open-sourced our approach — check the &lt;a href="https://ucpchecker.com/methodology" rel="noopener noreferrer"&gt;methodology page&lt;/a&gt; for how UCPChecker handles version-aware validation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger picture
&lt;/h2&gt;

&lt;p&gt;v2026-01-23 gave us checkout. v2026-04-08 gives us the rest of the shopping experience: discovery, carts, signing, and the groundwork for trust and authorization. The protocol is filling in the gaps between "an agent can technically buy something" and "an agent can shop the way a human does."&lt;/p&gt;

&lt;p&gt;We &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-february-2026" rel="noopener noreferrer"&gt;reported in March&lt;/a&gt; that the gap between "has a manifest" (87%) and "an agent can actually buy something" (45% checkout rate) is where the real work lives. This spec release addresses the structural reasons for that gap — not by making checkout better, but by giving agents the capabilities they need for the steps &lt;em&gt;before&lt;/em&gt; and &lt;em&gt;after&lt;/em&gt; checkout.&lt;/p&gt;

&lt;p&gt;We're tracking the v2026-04-08 migration wave across all monitored domains. Check the &lt;a href="https://ucpchecker.com/stats" rel="noopener noreferrer"&gt;stats page&lt;/a&gt; for real-time adoption data, and subscribe to the weekly report for ecosystem updates as stores begin the transition.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Analysis based on the &lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/releases/tag/v2026-04-08" rel="noopener noreferrer"&gt;UCP v2026-04-08 release&lt;/a&gt;, published April 9, 2026. UCPChecker validation rules updated same day.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>ucp</category>
      <category>data</category>
    </item>
    <item>
      <title>We Tested 5 AI Models on Expiring Travel Inventory — Here's How They Failed</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Tue, 07 Apr 2026 15:51:50 +0000</pubDate>
      <link>https://forem.com/benjifisher/we-tested-5-ai-models-on-expiring-travel-inventory-heres-how-they-failed-51c6</link>
      <guid>https://forem.com/benjifisher/we-tested-5-ai-models-on-expiring-travel-inventory-heres-how-they-failed-51c6</guid>
      <description>&lt;p&gt;Last week, a conversation started in &lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/discussions/328" rel="noopener noreferrer"&gt;UCP Discussion #328&lt;/a&gt; between contributors from Google, a global travel IT leader, Zolofy, and our team. The topic: UCP can't handle perishable inventory. Flights, hotel rooms, event tickets — any product where the price and availability expire on a timer. The protocol has no standard way for merchants to say “this offer is only valid for 15 minutes.”&lt;/p&gt;

&lt;p&gt;So we built the primitive and tested it. Here's what happened.&lt;/p&gt;

&lt;h2&gt;The problem&lt;/h2&gt;

&lt;p&gt;UCP works well for retail. A pair of shoes doesn't expire while you're deciding. But travel inventory does. An airline seat at $389 right now might be $419 in ten minutes, or gone entirely. Hotel rooms get released. Event tickets get reassigned.&lt;/p&gt;

&lt;p&gt;Haunic, who works at a global leader in IT solutions for the travel industry, put it plainly in the discussion: UCP has no hold/release mechanism, no way for merchants to signal when inventory expires. Revanth from Zolofy raised the related problem of ephemeral SKUs — products that don't exist until the merchant resolves them.&lt;/p&gt;

&lt;p&gt;Both problems reduce to one missing primitive: &lt;strong&gt;temporal validity&lt;/strong&gt;. An offer needs a TTL.&lt;/p&gt;

&lt;h2&gt;What we built&lt;/h2&gt;

&lt;p&gt;We added a travel demo merchant to &lt;a href="https://ucpplayground.com" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt; with 9 MCP tools: &lt;code&gt;search_flights&lt;/code&gt;, &lt;code&gt;search_hotels&lt;/code&gt;, &lt;code&gt;get_offer_details&lt;/code&gt;, &lt;code&gt;hold_offer&lt;/code&gt;, &lt;code&gt;create_booking&lt;/code&gt;, &lt;code&gt;get_booking&lt;/code&gt;, &lt;code&gt;add_ancillary&lt;/code&gt;, &lt;code&gt;complete_booking&lt;/code&gt;, and &lt;code&gt;cancel_booking&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The key addition: every search result includes a &lt;code&gt;validity_window&lt;/code&gt; object.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  "offer_id": "offer_xgusncCfor2G",
  "flight_number": "DL 1053",
  "price": { "total": 38900, "currency": "USD" },
  "validity_window": {
    "valid_until": "2026-04-06T12:15:00Z",
    "ttl_seconds": 30,
    "notice": "This fare expires in 30 seconds. After expiry, re-search for current pricing."
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If an agent tries to book an expired offer, it gets an &lt;code&gt;OFFER_EXPIRED&lt;/code&gt; error with instructions to re-search. Prices shift on every re-query (configurable volatility, default ±15%) to simulate real market conditions. TTLs are configurable via environment variables — production is set to &lt;strong&gt;30 seconds for flights&lt;/strong&gt; and &lt;strong&gt;10 seconds for hotels&lt;/strong&gt;, making expiry observable in real time.&lt;/p&gt;

&lt;p&gt;We also included &lt;code&gt;hold_offer&lt;/code&gt; — an explicit hold mechanism that extends an offer's validity by 5 minutes. This is the digital equivalent of an airline GDS ticket time limit: the inventory is reserved but not yet purchased.&lt;/p&gt;

&lt;h3&gt;Available inventory&lt;/h3&gt;

&lt;p&gt;The demo server includes 6 flights (SFO→JFK, LAX→BOS, ORD→LHR, ORD→FRA across United, Delta, American, JetBlue, and Lufthansa), 5 hotels (New York, Boston, London, Frankfurt), and 4 ancillary services (travel insurance, priority boarding, extra legroom, airport lounge). All prices are in cents with configurable volatility.&lt;/p&gt;

&lt;h3&gt;Production configuration&lt;/h3&gt;

&lt;p&gt;The live Playground server runs with these environment variables, and anyone can reproduce these tests against the same configuration:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;TRAVEL_FLIGHT_TTL=30      # Flight offers valid for 30 seconds
TRAVEL_HOTEL_TTL=10       # Hotel offers valid for 10 seconds
TRAVEL_PRICE_VOLATILITY=15  # ±15% price shift on re-search&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This creates natural test conditions: hotel offers frequently expire during model thinking time (10s &amp;lt; typical model round-trip), flight offers survive for fast models but expire between turns, and price changes are noticeable on every re-search.&lt;/p&gt;

&lt;h2&gt;Test methodology&lt;/h2&gt;

&lt;p&gt;We ran 5 frontier models through 6 test scenarios, all reproduced on the production &lt;a href="https://ucpplayground.com/help/teams/headless-api" rel="noopener noreferrer"&gt;Playground Headless API&lt;/a&gt;. Every session is linkable and replayable. Exact prompts and API calls below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Models tested:&lt;/strong&gt; Claude Opus 4.6, Claude Sonnet 4.5, GPT-5.2, Gemini 3.1 Pro, and Grok 4 (all via OpenRouter).&lt;/p&gt;

&lt;h3&gt;Test 1: Happy path&lt;/h3&gt;

&lt;p&gt;Single-shot: can the model search and complete a booking before the 30-second flight TTL expires?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl -X POST https://ucpplayground.com/api/v1/chat \\
  -H "Authorization: Bearer YOUR_TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{
    "model": "claude-sonnet-4-5",
    "domain": "demo-travel.ucpplayground.com",
    "message": "Search flights from SFO to JFK and book the cheapest nonstop for me immediately. My name is Alex Rivera, alex@example.com. Payment token: tok_demo. Do not ask for confirmation, just search and book."
  }'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Swap &lt;code&gt;model&lt;/code&gt; for each provider. The prompt is intentionally directive — we want to test the tool-calling loop, not the model's conversational hesitation.&lt;/p&gt;

&lt;h3&gt;Test 2: Competing TTLs (flight=30s, hotel=10s)&lt;/h3&gt;

&lt;p&gt;Same single-shot approach, but asking for both flight and hotel. The hotel's 10-second TTL often expires during the model's thinking time, while the flight's 30-second TTL survives. Tests whether agents can handle partial expiry.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl -X POST https://ucpplayground.com/api/v1/chat \\
  -H "Authorization: Bearer YOUR_TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{
    "model": "claude-sonnet-4-5",
    "domain": "demo-travel.ucpplayground.com",
    "message": "Search flights from SFO to JFK and hotels near JFK for 3 nights. Then book the cheapest nonstop flight and most affordable hotel together. My name is Alex Rivera, alex@example.com. Payment token: tok_demo. Do not ask for confirmation."
  }'&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Test 3: Stale offer recovery (real expiry across turns)&lt;/h3&gt;

&lt;p&gt;Two-step test with a wait between turns. Step 1 — search:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl -X POST https://ucpplayground.com/api/v1/chat \\
  -H "Authorization: Bearer YOUR_TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{
    "model": "claude-sonnet-4-5",
    "domain": "demo-travel.ucpplayground.com",
    "message": "Search flights from SFO to JFK and hotels near JFK for 3 nights. Show me the options with their offer IDs and validity windows."
  }'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Save the &lt;code&gt;session_id&lt;/code&gt; from the response. &lt;strong&gt;Wait 35 seconds&lt;/strong&gt; for the 30-second flight TTL to expire. Then Step 2 — book with stale offer IDs:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl -X POST https://ucpplayground.com/api/v1/chat \\
  -H "Authorization: Bearer YOUR_TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{
    "model": "claude-sonnet-4-5",
    "domain": "demo-travel.ucpplayground.com",
    "session_id": "SESSION_ID_FROM_STEP_1",
    "message": "Go ahead and book the cheapest nonstop flight and the most affordable hotel from what you just found. My name is Alex Rivera, alex@example.com. Payment token: tok_demo."
  }'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The model's conversation history contains the original search results with offer IDs that no longer exist. It will attempt to book, receive &lt;code&gt;OFFER_EXPIRED&lt;/code&gt;, and must decide how to recover.&lt;/p&gt;

&lt;h3&gt;Test 4: TTL awareness&lt;/h3&gt;

&lt;p&gt;Does the model read and reason about the &lt;code&gt;validity_window&lt;/code&gt; field?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl -X POST https://ucpplayground.com/api/v1/chat \\
  -H "Authorization: Bearer YOUR_TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{
    "model": "claude-sonnet-4-5",
    "domain": "demo-travel.ucpplayground.com",
    "message": "Search flights from SFO to JFK. Before you try to book anything, examine the validity_window field in the results. Tell me: how long are these offers valid? What happens if they expire? Should you hold them first?"
  }'&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Test 5: Price change awareness (explicit ask)&lt;/h3&gt;

&lt;p&gt;Uses the Test 3 flow (stale offer recovery) but with an explicit instruction to flag price changes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"message": "Book the Delta DL 1053 nonstop. My name is Alex Rivera, alex@example.com. Payment token: tok_demo. IMPORTANT: If the price has changed from what you showed me earlier, tell me the old and new price before proceeding."&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Response fields to check&lt;/h3&gt;

&lt;p&gt;Each response includes structured data for analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;outcome&lt;/code&gt; — &lt;code&gt;"checkout_reached"&lt;/code&gt;, &lt;code&gt;"search_only"&lt;/code&gt;, or &lt;code&gt;"failed"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tool_calls[]&lt;/code&gt; — each tool called, with &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;arguments&lt;/code&gt;, &lt;code&gt;result&lt;/code&gt;, &lt;code&gt;duration_ms&lt;/code&gt;, and &lt;code&gt;error&lt;/code&gt; (if any)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;turn_count&lt;/code&gt; — how many model round-trips were needed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;duration_ms&lt;/code&gt; — total wall-clock time&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tokens.total&lt;/code&gt; — total tokens consumed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;steps_completed[]&lt;/code&gt; — which funnel steps the agent reached&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;session_id&lt;/code&gt; — for continuing the conversation in a follow-up call&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To check if a model re-searched after expiry, count occurrences of &lt;code&gt;search_flights&lt;/code&gt; in &lt;code&gt;tool_calls&lt;/code&gt;. To check if it flagged price changes, read the final assistant message in &lt;code&gt;messages[]&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Results&lt;/h2&gt;

&lt;h3&gt;Test 1: Happy path&lt;/h3&gt;

&lt;p&gt;All 5 models with 30-second flight TTL, 10-second hotel TTL.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;Turns&lt;/th&gt;
&lt;th&gt;Duration&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;th&gt;Session&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Booked&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;15.6s&lt;/td&gt;
&lt;td&gt;17,726&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHDRHQ9AC324EWKNPK09HVV" rel="noopener noreferrer"&gt;K09HVV&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Booked&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;12.0s&lt;/td&gt;
&lt;td&gt;13,057&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHDRXPBY0YE2V05DTSEBHN6" rel="noopener noreferrer"&gt;EBHN6&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.1 Pro&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Booked&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;29.2s&lt;/td&gt;
&lt;td&gt;12,801&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHDSTGK5AMWP2F2F2A4CN4G" rel="noopener noreferrer"&gt;4CN4G&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grok 4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Booked&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;38.5s&lt;/td&gt;
&lt;td&gt;20,268&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHDV0BW690JG3DKH17BR5QX" rel="noopener noreferrer"&gt;BR5QX&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Booked&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;20.9s&lt;/td&gt;
&lt;td&gt;23,071&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHDVNEG1QBPZ2R5YS4RGDRD" rel="noopener noreferrer"&gt;GDRD&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Test 1: Five frontier models booking flights with 30-second offer TTL&lt;/p&gt;

&lt;p&gt;All 5 models completed booking. Flight-only searches succeed within the 30-second window, though Grok 4 cut it close at 38.5 seconds (it likely booked just before or after expiry and the re-search was transparent).&lt;/p&gt;

&lt;h3&gt;Test 2: Competing TTLs (flight=30s, hotel=10s)&lt;/h3&gt;

&lt;p&gt;Flight + hotel combined booking. Hotel offers (10s TTL) frequently expire during model thinking.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Hotel Re-searches&lt;/th&gt;
&lt;th&gt;Session&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Booked&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hotel re-searched once, booked both&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHE2MV6J36830QF3CW04QMG" rel="noopener noreferrer"&gt;04QMG&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;search_only&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stuck trying hold_offer on expired offers, ran out of turns&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHE3SPWFGDEJPC4KAKZ0J1E" rel="noopener noreferrer"&gt;Z0J1E&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.1 Pro&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Booked&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Booking failed (hotel expired), re-searched hotels, booked both&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHE5R8E7DA6CH979WNMBZ9Z" rel="noopener noreferrer"&gt;MBZ9Z&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Booked&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hotel re-searched twice, booked both&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHE6J4RYT6TN83ESV149E97" rel="noopener noreferrer"&gt;49E97&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Test 2: Competing TTLs — hotel offers expire at 10s while flight offers survive at 30s&lt;/p&gt;

&lt;p&gt;3/4 models completed successfully. &lt;strong&gt;GPT-5.2 got stuck&lt;/strong&gt; — it kept trying &lt;code&gt;hold_offer&lt;/code&gt; on expired offers instead of re-searching, consuming all its turns. Gemini handled it cleanly: detected the hotel-specific failure and re-searched only hotels. Claude Opus recovered with hotel re-searches.&lt;/p&gt;

&lt;h3&gt;Test 3: Stale offer recovery (35-second wait)&lt;/h3&gt;

&lt;p&gt;Searched for flights and hotels, waited 35 seconds for the 30-second flight TTL to expire, then asked each model to book from the earlier results.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;Recovery Strategy&lt;/th&gt;
&lt;th&gt;Re-searches&lt;/th&gt;
&lt;th&gt;Price Flagged?&lt;/th&gt;
&lt;th&gt;Session&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Booked&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tried stale offer, got OFFER_EXPIRED, re-searched both, booked fresh&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHEDFG6HQW81VTEF3ZGW5AE" rel="noopener noreferrer"&gt;W5AE&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Booked&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tried hold_offer (expired x2), re-searched both, booked fresh&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHEE19R1090QE3VA8CD89KV" rel="noopener noreferrer"&gt;D89KV&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.1 Pro&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Booked&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tried stale offer, got OFFER_EXPIRED, re-searched both, booked fresh&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHEEZMZSFAEBNG8SEY7A8WV" rel="noopener noreferrer"&gt;Y7A8WV&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Booked&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Re-searched both proactively, booked fresh&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHEFFMV6KM2N0S8BZ2NT7GY" rel="noopener noreferrer"&gt;NT7GY&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Test 3: Stale offer recovery — models attempt booking with expired offer IDs after 35-second wait&lt;/p&gt;

&lt;p&gt;All 4 models recovered and completed booking. No model hallucinated a workaround or fabricated new offer IDs. &lt;strong&gt;Zero models flagged the price change&lt;/strong&gt; that occurred due to the 15% volatility — every model silently booked at the new price.&lt;/p&gt;

&lt;h3&gt;Test 4: TTL awareness&lt;/h3&gt;

&lt;p&gt;All 4 models correctly identified when explicitly asked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The 30-second flight TTL and 10-second hotel TTL&lt;/li&gt;
&lt;li&gt;Expiry consequences (“fare no longer guaranteed,” “must re-search”)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hold_offer&lt;/code&gt; as a mitigation strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;But no model proactively checked TTL before attempting to book in any of the other 5 tests.&lt;/strong&gt; This is the key disconnect: models can reason about temporal validity, they just don't do it unless prompted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session replays:&lt;/strong&gt; &lt;a href="https://ucpplayground.com/sessions/01KNHEFV4J9AD7XS5RXDZFJ7YH" rel="noopener noreferrer"&gt;Claude Sonnet 4.5&lt;/a&gt; · &lt;a href="https://ucpplayground.com/sessions/01KNHEG4SFTY7H5MXG9NRKRNMV" rel="noopener noreferrer"&gt;GPT-5.2&lt;/a&gt; · &lt;a href="https://ucpplayground.com/sessions/01KNHEGY955YY0FZXNZPH78FYF" rel="noopener noreferrer"&gt;Gemini 3.1 Pro&lt;/a&gt; · &lt;a href="https://ucpplayground.com/sessions/01KNHEHFMMVABCQVKYDF1MN663" rel="noopener noreferrer"&gt;Claude Opus 4.6&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Test 5: Price change awareness (explicit ask)&lt;/h3&gt;

&lt;p&gt;Same stale-offer flow as Test 3, but with an explicit instruction to flag price changes. Searched, waited 35 seconds, then asked to book with the price comparison prompt.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Flagged Change?&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;th&gt;Session&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Old $424.55 → new $392.42, “You save $32.13!”&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHEQP0D5CZMSHX5D5AYGJSG" rel="noopener noreferrer"&gt;YGJSG&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Old $437.47 → new $378.19, asked for confirmation&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHER0XJZ2XZF7PAEP10X7AC" rel="noopener noreferrer"&gt;0X7AC&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.1 Pro&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Re-searched but just showed new results without comparing&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHER7PFCZAN4DH8QHN0VMDH" rel="noopener noreferrer"&gt;0VMDH&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Old $380.36 → new $396.08, “+$15.72”, offered alternatives&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/sessions/01KNHERK0D4EGHQXWB0Y8TB21V" rel="noopener noreferrer"&gt;B21V&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Test 5: Price change awareness — models asked to flag price differences after offer expiry&lt;/p&gt;

&lt;p&gt;3 out of 4 models correctly flagged price changes when instructed. Compare this to Test 3 where the same scenario without the instruction produced &lt;strong&gt;zero price change notifications&lt;/strong&gt;. The capability exists — the default behavior doesn't use it.&lt;/p&gt;

&lt;h3&gt;Bonus: 3-second TTL stress test (local)&lt;/h3&gt;

&lt;p&gt;We also ran a local stress test with &lt;code&gt;TRAVEL_FLIGHT_TTL=3&lt;/code&gt; and &lt;code&gt;TRAVEL_HOTEL_TTL=3&lt;/code&gt; — shorter than any model's response time. This was run as an additional local stress test to reveal how models behave when offers expire &lt;em&gt;during&lt;/em&gt; their thinking time.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;Searches&lt;/th&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPT-5.2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Booked&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Re-searched, booked immediately in same tool call batch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Failed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Re-searched 3x, tried hold_offer, never fast enough&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.1 Pro&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Failed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Re-searched 4x, tried hold + direct book, never fast enough&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Failed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Re-searched 4x, tried hold_offer twice, never fast enough&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grok 4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Failed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Searched once, never attempted booking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GPT-5.2 was the only model to complete a booking at 3-second TTL — it was fast enough to search and book in the same turn before the window closed. All other models correctly understood the error and re-searched, but their thinking time exceeded the TTL on every cycle. Grok 4 showed the worst behavior: it searched once and stopped, never even attempting to book.&lt;/p&gt;

&lt;p&gt;To reproduce this stress test on your own deployment, set &lt;code&gt;TRAVEL_FLIGHT_TTL=3&lt;/code&gt; and &lt;code&gt;TRAVEL_HOTEL_TTL=3&lt;/code&gt; in your own deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protocol implication:&lt;/strong&gt; The spec should recommend minimum TTLs. A validity window shorter than typical agent round-trip time (~5–10 seconds) is effectively a denial of service. We'd suggest 60 seconds as a floor, with 15–30 minutes as the recommended range for travel.&lt;/p&gt;

&lt;h2&gt;Protocol implications&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Agents treat TTL as error-handling, not planning.&lt;/strong&gt; No model reads &lt;code&gt;validity_window.valid_until&lt;/code&gt; and proactively acts on it. They all try, fail, recover. This means the server MUST reject expired offers rather than relying on agent self-policing.&lt;/li&gt;

&lt;li&gt;
&lt;strong&gt;The &lt;code&gt;OFFER_EXPIRED&lt;/code&gt; error message is sufficient for recovery.&lt;/strong&gt; Every model understood “search again” and did so. The current error format works — no new error primitives needed.&lt;/li&gt;

&lt;li&gt;
&lt;strong&gt;Price change blindness is a real problem.&lt;/strong&gt; Agents silently book at different prices unless explicitly told to compare. The protocol should either include &lt;code&gt;previous_price&lt;/code&gt; in re-search results, or require a &lt;code&gt;price_change_acknowledgment&lt;/code&gt; field in &lt;code&gt;create_booking&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;
&lt;strong&gt;&lt;code&gt;hold_offer&lt;/code&gt; is used by smart agents.&lt;/strong&gt; GPT-5.2 proactively used &lt;code&gt;hold_offer&lt;/code&gt; in multiple tests. This validates the hold/release mechanism haunic proposed — though it can also backfire (GPT-5.2 got stuck holding expired offers in Test 2 instead of re-searching).&lt;/li&gt;

&lt;li&gt;
&lt;strong&gt;Asymmetric TTLs break some agents.&lt;/strong&gt; When flight and hotel TTLs differ significantly, some models get stuck in retry loops instead of adopting a different strategy. The protocol should recommend minimum TTLs (60s floor) or allow agents to request extended holds.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
Models understand temporal validity when asked about it. They don't act on it unprompted. The server must enforce expiry, not rely on agent self-policing. And price changes must be surfaced at the protocol level — agents won't compare prices on their own.
&lt;/blockquote&gt;

&lt;h2&gt;Reproduce it yourself&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ucpplayground.com" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt; is an open testing environment for AI agent commerce — it runs shopping sessions against real and demo merchants across frontier models, recording every tool call, error, and recovery. Everything described here is live and testable on the production API. The sessions linked above are real — open any replay to see the full tool call sequence.&lt;/p&gt;

&lt;h3&gt;1. Get an API token&lt;/h3&gt;

&lt;p&gt;Sign in to &lt;a href="https://ucpplayground.com" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt;, go to &lt;strong&gt;Settings → API Tokens&lt;/strong&gt;, and create a token. See the &lt;a href="https://ucpplayground.com/help/teams/headless-api" rel="noopener noreferrer"&gt;Headless API docs&lt;/a&gt; for details.&lt;/p&gt;

&lt;h3&gt;2. List available models&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;curl https://ucpplayground.com/api/v1/models \\
  -H "Authorization: Bearer YOUR_TOKEN"&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;3. Run any test&lt;/h3&gt;

&lt;p&gt;Use the curl commands from the Test Methodology section above, replacing &lt;code&gt;YOUR_TOKEN&lt;/code&gt; with your API token and &lt;code&gt;model&lt;/code&gt; with any model ID from the list.&lt;/p&gt;

&lt;h3&gt;4. Compare across models&lt;/h3&gt;

&lt;p&gt;Run the same prompt with different &lt;code&gt;model&lt;/code&gt; values: &lt;code&gt;claude-opus-4-6&lt;/code&gt;, &lt;code&gt;claude-sonnet-4-5&lt;/code&gt;, &lt;code&gt;gpt-5-2&lt;/code&gt;, &lt;code&gt;gemini-3-1-pro&lt;/code&gt;, &lt;code&gt;grok-4&lt;/code&gt;, &lt;code&gt;gemini-2-5-flash&lt;/code&gt;, etc. The response format is identical across models, making side-by-side comparison straightforward.&lt;/p&gt;

&lt;h3&gt;Available routes&lt;/h3&gt;

&lt;p&gt;Flights: SFO↔JFK, LAX↔BOS, ORD↔LHR, ORD↔FRA. Hotels near: JFK (New York ×2), BOS (Boston), LHR (London), FRA (Frankfurt). Try multi-leg trips: &lt;em&gt;“I need a flight from Chicago to London and a hotel in London for 5 nights.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you're working on UCP protocol extensions or building agent infrastructure for travel, &lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/discussions/328" rel="noopener noreferrer"&gt;join the discussion&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>ai</category>
      <category>ucp</category>
    </item>
    <item>
      <title>The Developer's Guide to UCP Tools in 2026</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Tue, 07 Apr 2026 15:49:21 +0000</pubDate>
      <link>https://forem.com/benjifisher/the-developers-guide-to-ucp-tools-in-2026-h49</link>
      <guid>https://forem.com/benjifisher/the-developers-guide-to-ucp-tools-in-2026-h49</guid>
      <description>&lt;p&gt;If you're implementing UCP for the first time — or maintaining an existing deployment — the tooling landscape has matured fast. The spec launched in January 2026 and within three months the ecosystem went from zero tooling to dedicated validators, continuous monitoring, live agent testing environments, and an open dataset of 3,000+ verified merchants.&lt;/p&gt;

&lt;p&gt;This guide covers everything available in 2026: what each tool does, where it's strong, where it falls short, and how they fit together. We'll be fair about the competition — we built UCP Checker, so we're biased, but we'll tell you where other tools are the better choice too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two categories of UCP tools
&lt;/h2&gt;

&lt;p&gt;Before diving into individual tools, it's worth understanding a fundamental split in how UCP tools work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validators&lt;/strong&gt; check your manifest at a single point in time. You paste a URL, get a result, fix what's broken, move on. They're excellent for initial implementation and pre-launch checks. Think of them as unit tests for your UCP manifest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitors&lt;/strong&gt; track your manifest over time. They run checks on a schedule, maintain history, detect regressions, and alert you when something changes. They're built for production operations — the thing that pages you at 3am when a deploy breaks your UCP endpoint.&lt;/p&gt;

&lt;p&gt;Most developers need both. A validator during development, a monitor in production. The mistake is assuming one tool covers both cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  UCPtools.dev
&lt;/h2&gt;

&lt;p&gt;UCPtools.dev offers multi-level validation with profile generation and platform-specific artifact generation for Magento, Shopify, and others.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it's strong:&lt;/strong&gt; Guided implementation workflows and platform-specific tooling for initial setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it falls short:&lt;/strong&gt; Point-in-time validation only. No monitoring, no historical tracking, no alerting. You'd need to manually re-run checks to catch regressions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nextwaves UCP Tester
&lt;/h2&gt;

&lt;p&gt;Nextwaves runs 40+ checks against your manifest and produces an A–F grade with fix recommendations for each failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it's strong:&lt;/strong&gt; Graded scoring with actionable remediation guidance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it falls short:&lt;/strong&gt; Point-in-time validation only, no monitoring or alerting. Operated as a feature within an agency, so updates are less frequent than purpose-built tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google's official validation
&lt;/h2&gt;

&lt;p&gt;Google provides UCP validation through Search Console and its structured data tooling. If you're a merchant who cares primarily about Google's agentic commerce features, this is the canonical authority — Google's validator tells you exactly what Google's agents expect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it's strong:&lt;/strong&gt; Authoritative for Google's ecosystem. If your UCP manifest satisfies Google's validator, Google's shopping agents will interact with it correctly. No guesswork about what the platform wants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it falls short:&lt;/strong&gt; Narrow scope. Google validates for Google. The UCP spec supports features and capabilities that Google doesn't currently use, and their validator won't check those. If you're building for multi-agent support — Claude, Gemini, custom agents — you need broader validation.&lt;/p&gt;

&lt;h2&gt;
  
  
  UCP Checker
&lt;/h2&gt;

&lt;p&gt;This is our tool, so take the appropriate grain of salt. UCP Checker started as a validator and evolved into a &lt;a href="https://ucpchecker.com/methodology" rel="noopener noreferrer"&gt;monitoring platform&lt;/a&gt;. The core differentiator is continuous checking: we run scheduled validations against every merchant in our database and maintain a longitudinal record of every check result.&lt;/p&gt;

&lt;p&gt;Today the system monitors 3,400+ merchant domains in the &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;public directory&lt;/a&gt;. Each domain has a historical timeline showing when it was first checked, when its status changed, what &lt;a href="https://ucpchecker.com/specs" rel="noopener noreferrer"&gt;version of the spec&lt;/a&gt; it's running, and which &lt;a href="https://ucpchecker.com/capabilities" rel="noopener noreferrer"&gt;capabilities&lt;/a&gt; it declares. When a merchant's UCP endpoint breaks — or when they upgrade their implementation — we have the data to show exactly when and how.&lt;/p&gt;

&lt;p&gt;Beyond monitoring, we provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ucpchecker.com/developer-tools" rel="noopener noreferrer"&gt;Public REST API&lt;/a&gt;&lt;/strong&gt; for programmatic validation at &lt;code&gt;/api/validator&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ucpchecker.com/developer-tools" rel="noopener noreferrer"&gt;MCP server&lt;/a&gt;&lt;/strong&gt; at &lt;code&gt;ucpchecker.com/mcp&lt;/code&gt; — AI agents can validate stores in real time during sessions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;Email alerts&lt;/a&gt;&lt;/strong&gt; for status changes on domains you're watching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://huggingface.co/datasets/UCPChecker/ucp-merchants" rel="noopener noreferrer"&gt;Open dataset on Hugging Face&lt;/a&gt;&lt;/strong&gt; (CC-BY 4.0) with the full merchant database, updated monthly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ucpchecker.com/extension" rel="noopener noreferrer"&gt;Chrome extension&lt;/a&gt;&lt;/strong&gt; for instant validation while browsing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where it's strong:&lt;/strong&gt; Continuous monitoring, historical data, production alerting, the open dataset, API/MCP access for agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it falls short:&lt;/strong&gt; We don't generate implementation artifacts or guide you through initial setup. UCP Checker is built for production operations — validation, monitoring, and agent testing — not scaffolding a manifest from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond validators: the full toolchain
&lt;/h2&gt;

&lt;p&gt;Validation is only one part of working with UCP. If you're building agents — or building infrastructure for agents — the toolchain extends further.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://ucpplayground.com/?utm_source=ucpchecker&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blog-dev-tools-guide" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt; (ucpplayground.com)
&lt;/h3&gt;

&lt;p&gt;The Playground is a live testing environment where you watch AI agents interact with real UCP stores in real time. Pick a store, pick a model (Claude, Gemini, and others), and watch the full JSON-RPC message flow: every tool call, every response, every error. Sessions are recorded and shareable — you can send a replay link to a colleague or include it in a bug report.&lt;/p&gt;

&lt;p&gt;This is the tool you use when validation passes but agent sessions still fail. The manifest is valid, the endpoints respond, but something in the interaction flow doesn't work. The Playground shows you exactly where the conversation breaks down — which MCP tool call returns unexpected data, which response format the agent can't parse.&lt;/p&gt;

&lt;p&gt;It also &lt;a href="https://ucpchecker.com/leaderboard" rel="noopener noreferrer"&gt;grades each store A through F&lt;/a&gt; on latency, data quality, and capability coverage, so you can benchmark your store's agent experience against the &lt;a href="https://ucpchecker.com/stats" rel="noopener noreferrer"&gt;ecosystem average&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://ucprails.com/?utm_source=ucpchecker&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blog-dev-tools-guide" rel="noopener noreferrer"&gt;UCP Rails&lt;/a&gt; (ucprails.com)
&lt;/h3&gt;

&lt;p&gt;If you're building a production agent that transacts with UCP stores, you don't want to handle discovery, memory, guardrails, and multi-channel routing yourself. UCP Rails is the MCP control plane — the infrastructure layer between your agent and the stores it shops at.&lt;/p&gt;

&lt;p&gt;Connect once to &lt;code&gt;ucprails.com/mcp&lt;/code&gt; and your agent gets: merchant discovery (find stores that sell what you need), persistent agent memory (remember preferences across sessions), configurable guardrails (spending limits, blocked categories), composable skills and extensions, and integrations for WhatsApp, Slack, SMS, and more.&lt;/p&gt;

&lt;p&gt;UCP Rails also manages hooks and loops — automated workflows that trigger when specific conditions are met. An agent can set up a price watch that fires when a product drops below a threshold, or a restock alert that triggers a purchase when inventory appears.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://ucpregistry.com/?utm_source=ucpchecker&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blog-dev-tools-guide" rel="noopener noreferrer"&gt;UCP Registry&lt;/a&gt; (ucpregistry.com)
&lt;/h3&gt;

&lt;p&gt;The registry is the directory layer. It maintains verified merchant profiles, agent registrations, and the public extensions/skills registry that UCP Rails uses. If you want to know which merchants support UCP, what capabilities they declare, and what their trust scores look like — the Registry API is the source of truth.&lt;/p&gt;

&lt;p&gt;Developers also use the Registry to publish and discover extensions. Built a custom skill for handling returns? Publish it to the Registry and other agents can install it via UCP Rails.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://ucpplayground.com/evals?utm_source=ucpchecker&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blog-dev-tools-guide" rel="noopener noreferrer"&gt;Evals and benchmarking&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;If you're building agents that shop, you need to measure how well they shop. The &lt;a href="https://ucpplayground.com/evals?utm_source=ucpchecker&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blog-dev-tools-guide" rel="noopener noreferrer"&gt;Playground evals&lt;/a&gt; expose a headless API for automated testing — run your agent through a suite of stores, collect latency and success metrics, and track performance over time. Combine that with the UCP Checker dataset (3,400+ real merchant profiles on Hugging Face) and you can build evals that cover the real ecosystem, not just synthetic test fixtures.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the pieces fit together
&lt;/h2&gt;

&lt;p&gt;Here's a practical workflow for a team implementing and maintaining UCP:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;During development:&lt;/strong&gt; Use the &lt;a href="https://ucpchecker.com/ucp-validator" rel="noopener noreferrer"&gt;UCP Validator&lt;/a&gt; to check your initial implementation. Paste your manifest JSON and get instant validation against the current spec. Use &lt;a href="https://ucpchecker.com/bulk-check" rel="noopener noreferrer"&gt;bulk check&lt;/a&gt; if you have multiple domains.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before launch:&lt;/strong&gt; Run your store through the &lt;a href="https://ucpplayground.com/?utm_source=ucpchecker&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blog-dev-tools-guide" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt;. Validation tells you the manifest is correct; the Playground tells you an actual AI agent can successfully interact with it. These are different questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In production:&lt;/strong&gt; Add your domain to &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;UCP Checker&lt;/a&gt; for continuous monitoring and alerts. When something breaks in a deploy, you'll know within the check interval — not when a customer's agent fails silently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For agent developers:&lt;/strong&gt; Use UCP Rails as your control plane, the Registry for merchant discovery, and the Playground + Hugging Face dataset for evals. Build your CI pipeline around the headless Playground API to catch regressions before they reach production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to go deeper
&lt;/h2&gt;

&lt;p&gt;The UCP specification is maintained at &lt;a href="https://ucp.dev" rel="noopener noreferrer"&gt;ucp.dev&lt;/a&gt; — that's the canonical reference for capability schemas, transport definitions, and the manifest format itself. If you're implementing UCP from scratch, start there.&lt;/p&gt;

&lt;p&gt;For protocol-level documentation on how capabilities, &lt;a href="https://ucpchecker.com/transports" rel="noopener noreferrer"&gt;transports&lt;/a&gt;, and &lt;a href="https://ucpchecker.com/payment-handlers" rel="noopener noreferrer"&gt;payment handlers&lt;/a&gt; fit together, see the &lt;a href="https://ucpchecker.com/protocol" rel="noopener noreferrer"&gt;UCP Protocol overview&lt;/a&gt; on UCP Checker. The &lt;a href="https://ucpchecker.com/capabilities" rel="noopener noreferrer"&gt;capabilities page&lt;/a&gt; tracks which capabilities are declared across the ecosystem, and the &lt;a href="https://ucpchecker.com/mcp-tools" rel="noopener noreferrer"&gt;MCP tools page&lt;/a&gt; shows which tool operations stores actually expose.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://ucpchecker.com/developer-tools" rel="noopener noreferrer"&gt;UCP Checker developer tools page&lt;/a&gt; consolidates links to every API, dataset, and integration point across UCP Checker, UCP Playground, UCP Registry, and UCP Rails — including the &lt;a href="https://huggingface.co/datasets/UCPChecker/ucp-merchants" rel="noopener noreferrer"&gt;open merchant dataset on Hugging Face&lt;/a&gt; (CC-BY 4.0, updated monthly).&lt;/p&gt;

&lt;p&gt;For a side-by-side feature comparison of all the tools covered in this guide, see the &lt;a href="https://ucpchecker.com/tools" rel="noopener noreferrer"&gt;UCP Tools Compared&lt;/a&gt; page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing the right tools
&lt;/h2&gt;

&lt;p&gt;If you take one thing from this guide: no single tool does everything. Validators and monitors serve different purposes, and agent testing is a third dimension entirely. The best setups use multiple tools for different stages of the lifecycle.&lt;/p&gt;

&lt;p&gt;Start with validation, move to monitoring, and layer in agent testing as your implementation matures. The tools are mostly free or have generous free tiers, so the barrier isn't cost — it's knowing they exist.&lt;/p&gt;

&lt;p&gt;For the full feature-by-feature comparison, see our &lt;a href="https://ucpchecker.com/tools" rel="noopener noreferrer"&gt;tools comparison page&lt;/a&gt;. For the complete developer toolchain including APIs, SDKs, and integrations, see &lt;a href="https://ucpchecker.com/developer-tools" rel="noopener noreferrer"&gt;developer tools&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>ucp</category>
    </item>
    <item>
      <title>The First Fully Autonomous AI Agent Purchase Through UCP</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Sat, 04 Apr 2026 10:47:23 +0000</pubDate>
      <link>https://forem.com/benjifisher/the-first-fully-autonomous-ai-agent-purchase-through-ucp-blj</link>
      <guid>https://forem.com/benjifisher/the-first-fully-autonomous-ai-agent-purchase-through-ucp-blj</guid>
      <description>&lt;p&gt;An AI agent searched a store, picked a product, linked a customer identity, selected wallet payment, set shipping, and completed checkout — creating a real WooCommerce order. No browser. No card network. No human after “proceed.”&lt;/p&gt;

&lt;p&gt;On March 25, 2026, session &lt;code&gt;01KMJ26KVH7ZZ78DWMHZ5BRK32&lt;/code&gt; on &lt;a href="https://ucpplayground.com" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt; became the first fully autonomous AI agent purchase completed through the Universal Commerce Protocol. Here’s what happened, what broke along the way, and why it matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you’re looking at
&lt;/h2&gt;

&lt;p&gt;The session replay shows Claude Sonnet 4.5 shopping at &lt;a href="https://ucpchecker.com/status/houseofparfum.nl" rel="noopener noreferrer"&gt;houseofparfum.nl&lt;/a&gt; — a real Dutch perfume store running WooCommerce with the &lt;a href="https://zologic.nl/ucpready/" rel="noopener noreferrer"&gt;UCPReady plugin by Zologic&lt;/a&gt;. The user said:&lt;/p&gt;

&lt;p&gt;“Buy me a perfume under 30 euro, pay with my wallet”&lt;/p&gt;

&lt;p&gt;Eight turns and 43 seconds later, WooCommerce order #82251 was created. €30.13 debited from the customer’s store wallet. Confirmation email sent. No redirect. No payment form. No human touched it after the initial confirmation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://ucpplayground.com/s/01KMJ26KVH7ZZ78DWMHZ5BRK32" rel="noopener noreferrer"&gt;Replay the full session →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The full tool call sequence
&lt;/h2&gt;

&lt;p&gt;Every step of the purchase is visible in the session recording. Here’s what the agent executed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ucp_list_products&lt;/code&gt; — searched perfumes under €30, found Emanuel Ungaro Intense For Him (€18.95)&lt;/li&gt;
&lt;li&gt;User confirms: “yes”&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;create_checkout&lt;/code&gt; — line items added, buyer pre-populated from linked identity (resolved to WooCommerce customer #1), status: &lt;code&gt;requires_escalation&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;update_checkout&lt;/code&gt; — &lt;code&gt;selected_instrument_id: terrawallet-1&lt;/code&gt; rejected (missing fulfillment)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;update_checkout&lt;/code&gt; — shipping method &lt;code&gt;flat_rate1&lt;/code&gt; set, payment still missing&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;update_checkout&lt;/code&gt; — wallet instrument with &lt;code&gt;handler_id: com.terrawallet.store_credit&lt;/code&gt; accepted, status: &lt;code&gt;ready_for_complete&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;complete_checkout&lt;/code&gt; — status: &lt;code&gt;completed&lt;/code&gt;, order #82251, wallet balance: €467.32&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every call carried an OAuth bearer token from the &lt;a href="https://ucpchecker.com/blog/ucp-identity-linking-agentic-commerce" rel="noopener noreferrer"&gt;linked identity&lt;/a&gt;. The merchant resolved it to WooCommerce customer #1, pre-populated name, email, phone, and address. The &lt;code&gt;com.terrawallet.store_credit&lt;/code&gt; payment handler surfaced a €490.25 wallet balance with &lt;code&gt;coverage: full&lt;/code&gt; — enough to cover the order without any card network involvement.&lt;/p&gt;

&lt;h2&gt;
  
  
  What had to work
&lt;/h2&gt;

&lt;p&gt;This wasn’t a demo against a mock API. It was a real store with a real product catalogue, real pricing, real tax calculation, and a real wallet debit. For it to complete, every layer of the stack had to function.&lt;/p&gt;

&lt;h3&gt;
  
  
  Protocol layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.well-known/ucp&lt;/code&gt; manifest with MCP endpoint, capabilities, and payment handlers&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/list&lt;/code&gt; returning all 11 tools (search, product details, cart CRUD, checkout lifecycle, complete, cancel)&lt;/li&gt;
&lt;li&gt;Structured validation messages (&lt;code&gt;requires_buyer_input&lt;/code&gt;) that the agent could read and act on&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Identity linking
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;OIDC discovery from issuer URL (RFC 8414 — UCPReady uses &lt;code&gt;/.well-known/oauth-authorization-server&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Dynamic client registration via the discovered &lt;code&gt;registration_endpoint&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;OAuth consent flow with PKCE&lt;/li&gt;
&lt;li&gt;Bearer token injected on every MCP request&lt;/li&gt;
&lt;li&gt;Merchant resolving the token to &lt;code&gt;identity_customer_id: 1&lt;/code&gt; with pre-populated buyer data&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Agent orchestration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;System prompt with checkout completion instructions&lt;/li&gt;
&lt;li&gt;Auto-nudge when the model stopped after seeing validation errors&lt;/li&gt;
&lt;li&gt;Auto-injection of &lt;code&gt;meta.idempotency-key&lt;/code&gt; (UUID) on &lt;code&gt;complete_checkout&lt;/code&gt; — models consistently fail to format this correctly&lt;/li&gt;
&lt;li&gt;Payment handler IDs passed from manifest to system prompt&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Payment processing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;TerraWallet store credit — entirely server-side, no browser interaction needed&lt;/li&gt;
&lt;li&gt;Wallet debit atomic with order creation on &lt;code&gt;complete_checkout&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Balance surfaced in checkout response so the agent knows coverage&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What broke along the way
&lt;/h2&gt;

&lt;p&gt;We’d love to say this worked first try. It didn’t. Over 24hrs of debugging with Almin from &lt;a href="https://zologic.nl/ucpready/" rel="noopener noreferrer"&gt;Zologic&lt;/a&gt;, we hit and fixed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wrong MCP endpoint&lt;/strong&gt; — our Shopify storefront probe was overriding the manifest endpoint, so OAuth tokens were stored against &lt;code&gt;/api/mcp&lt;/code&gt; but MCP calls went to &lt;code&gt;/wp-json/ucpready/v1/mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stale OAuth sessions&lt;/strong&gt; — merchant-side revocation wasn’t detected; we had to add token validation on connect and auto-clear on 401&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model stringifying meta&lt;/strong&gt; — Claude kept sending &lt;code&gt;meta: "{\\"idempotency-key\\": \\"...\\"}"&lt;/code&gt; instead of a proper object. We fixed it by auto-injecting the key at the orchestrator level&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wallet instrument format&lt;/strong&gt; — the merchant’s validator checked for dots in handler names; &lt;code&gt;terrawallet-1&lt;/code&gt; (the instrument ID) failed the check while &lt;code&gt;com.terrawallet.store_credit&lt;/code&gt; (the handler name) passed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these was a real bug that blocked a real purchase attempt. The session data captured every failure, which is exactly what &lt;a href="https://ucpchecker.com/blog/why-we-built-ucp-playground" rel="noopener noreferrer"&gt;UCP Playground is built for&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why protocol matters
&lt;/h2&gt;

&lt;p&gt;Everything we built is protocol-level, not store-specific:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OIDC discovery works for any merchant declaring an issuer&lt;/li&gt;
&lt;li&gt;Bearer token injection works for any MCP endpoint with OAuth tokens&lt;/li&gt;
&lt;li&gt;Checkout nudge fires for any store returning &lt;code&gt;requires_buyer_input&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Payment handler passthrough works for any instrument the merchant advertises&lt;/li&gt;
&lt;li&gt;Idempotency key injection works for any &lt;code&gt;complete_checkout&lt;/code&gt; / &lt;code&gt;cancel_checkout&lt;/code&gt; call&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same Playground code that completed this WooCommerce wallet checkout handles Shopify’s &lt;code&gt;update_cart&lt;/code&gt;, classified listings, and B2B procurement flows. The protocol is the abstraction — the store plugs in whatever it supports.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s next
&lt;/h2&gt;

&lt;p&gt;This was a single-item purchase with a pre-funded wallet and a known merchant. The conditions were controlled — one product, one payment method, one confirmation. The next milestone is multi-item cart in fully autonomous mode: multiple products, multiple decisions, no human in the loop.&lt;/p&gt;

&lt;p&gt;That’s where orchestration, spend limits, and merchant trust become non-optional. An agent selecting three items across two stores, choosing between wallet and saved card, applying a shipping preference — every one of those decisions needs a policy layer that doesn’t exist yet.&lt;/p&gt;

&lt;p&gt;The protocol works. Now it needs guardrails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Replay the session:&lt;/strong&gt; &lt;a href="https://ucpplayground.com/s/01KMJ26KVH7ZZ78DWMHZ5BRK32" rel="noopener noreferrer"&gt;ucpplayground.com/s/01KMJ26KVH7ZZ78DWMHZ5BRK32&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run your own:&lt;/strong&gt; &lt;a href="https://ucpplayground.com/agent" rel="noopener noreferrer"&gt;ucpplayground.com/agent&lt;/a&gt; — connect to any UCP-compatible store&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check your store:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;ucpchecker.com/check&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate your manifest:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/ucp-validator" rel="noopener noreferrer"&gt;UCP Validator&lt;/a&gt; — paste your JSON and check spec compliance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor your store:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;UCP Alerts&lt;/a&gt; — get notified when your manifest changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browse verified merchants:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;Directory&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read Almin’s perspective:&lt;/strong&gt; &lt;a href="https://dev.to/zologic/woocommerce-just-did-what-shopify-did-hours-later-open-protocol-full-autonomous-purchase-58ef"&gt;WooCommerce Just Did What Shopify Did — Hours Later&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://ucpplayground.com/s/01KMJ26KVH7ZZ78DWMHZ5BRK32" rel="noopener noreferrer"&gt;Session replay: 01KMJ26KVH7ZZ78DWMHZ5BRK32&lt;/a&gt; — UCP Playground&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://zologic.nl/ucpready/" rel="noopener noreferrer"&gt;UCPReady Plugin for WooCommerce&lt;/a&gt; — Zologic&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/ucp-identity-linking-agentic-commerce" rel="noopener noreferrer"&gt;UCP Now Supports Identity Linking&lt;/a&gt; — UCP Checker Blog&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/why-we-built-ucp-playground" rel="noopener noreferrer"&gt;Why We Built UCP Playground&lt;/a&gt; — UCP Checker Blog&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-march-2026" rel="noopener noreferrer"&gt;State of Agentic Commerce — March 2026&lt;/a&gt; — UCP Checker Blog&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucp.dev/" rel="noopener noreferrer"&gt;UCP Specification&lt;/a&gt; — ucp.dev&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/zologic/woocommerce-just-did-what-shopify-did-hours-later-open-protocol-full-autonomous-purchase-58ef"&gt;WooCommerce Just Did What Shopify Did — Hours Later&lt;/a&gt; — Almin Zolotic, dev.to&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ucpplayground.com/changelog" rel="noopener noreferrer"&gt;UCP Playground Changelog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built with &lt;a href="https://ucpplayground.com" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt;. Session data captured, replayed, and shared — because observability is the foundation of trust in agent commerce.&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>ai</category>
      <category>ucp</category>
    </item>
    <item>
      <title>3,000 UCP Stores, Open Data: Why We're Publishing Our Dataset on Hugging Face</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Fri, 03 Apr 2026 12:54:26 +0000</pubDate>
      <link>https://forem.com/benjifisher/3000-ucp-stores-open-data-why-were-publishing-our-dataset-on-hugging-face-45gl</link>
      <guid>https://forem.com/benjifisher/3000-ucp-stores-open-data-why-were-publishing-our-dataset-on-hugging-face-45gl</guid>
      <description>&lt;p&gt;We've been crawling UCP manifests since January. For the first few months, the data lived in our own database — feeding the directory, powering the grades, tracking adoption week by week. We published summaries in our monthly state-of-the-ecosystem posts, but the raw dataset stayed internal. There wasn't much to share when the corpus was a few hundred stores.&lt;br&gt;
That changed. We crossed 3,000 verified UCP merchants this week. And when you're sitting on a dataset that didn't exist six months ago, that no one else has, and that the people building agentic commerce tools would genuinely benefit from — it's time to share it.&lt;br&gt;
Today we're publishing the &lt;a href="https://huggingface.co/datasets/UCPChecker/ucp-merchants" rel="noopener noreferrer"&gt;UCPChecker merchant dataset on Hugging Face&lt;/a&gt;. Monthly snapshots, CC-BY 4.0 licensed, free to download, free to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in the dataset
&lt;/h2&gt;

&lt;p&gt;Every row is a verified UCP merchant — a domain where we've confirmed a valid UCP manifest exists at &lt;code&gt;/.well-known/ucp&lt;/code&gt;, the manifest passes spec validation, and the store has at minimum a working search capability.&lt;br&gt;
For each merchant you get the domain, verification status, UCP endpoint URL, HTTP status, the spec version the store is advertising, five boolean capability flags (checkout, cart management, identity linking, order, payment token), a capability count, the AI bot policies the store declares, the transports it supports (MCP, REST, embedded), and two timestamps: when we last checked it and when we last got a successful response.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fucpchecker.s3.eu-west-1.amazonaws.com%2Fblog%2Fhugging-face%2F01-dataset-columns.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fucpchecker.s3.eu-west-1.amazonaws.com%2Fblog%2Fhugging-face%2F01-dataset-columns.webp" alt="UCPChecker Dataset Schema — 15 columns grouped by category: Identity, Protocol, Capabilities, Ecosystem, and Timestamps" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;span&gt;Dataset Schema — 15 columns — &lt;a href="https://ucpchecker.com/blog/3000-ucp-stores-open-data-hugging-face-dataset" rel="noopener noreferrer"&gt;UCP Checker&lt;/a&gt;&lt;/span&gt;
&lt;span&gt;
&lt;a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fucpchecker.com%2Fblog%2F3000-ucp-stores-open-data-hugging-face-dataset&amp;amp;text=Dataset+Schema+%E2%80%94+15+columns+via+%40ucpchecker" rel="noopener noreferrer"&gt;Share&lt;/a&gt;
&lt;a&gt;Embed&lt;/a&gt;
&lt;/span&gt;




&lt;p&gt;That last column matters more than it looks. &lt;strong&gt;"First seen" is when this store became agent-ready.&lt;/strong&gt; It's a timestamp on a real industry transition.&lt;br&gt;
The snapshot releasing alongside this post covers the full corpus — 3,000+ stores across every platform we've indexed, from the Shopify majority to the handful of independent WooCommerce and Magento implementations that have been painstakingly hand-configured.&lt;/p&gt;

&lt;p&gt;This is the directory layer — the foundation. &lt;strong&gt;If you need more&lt;/strong&gt; — deeper analytics, operational data, or enterprise-level insight — &lt;a href="https://ucpchecker.com/contact" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt;. We work with teams building on top of the ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a merchant&lt;/strong&gt; and your store isn't in the dataset, check whether your &lt;code&gt;/.well-known/ucp&lt;/code&gt; manifest is live and valid at &lt;a href="https://ucpchecker.com" rel="noopener noreferrer"&gt;ucpchecker.com&lt;/a&gt;. Once you're verified, you'll appear in the next monthly snapshot automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can build with it
&lt;/h2&gt;

&lt;p&gt;The obvious use case is research. If you're writing about agentic commerce — for a conference talk, an analyst report, a blog post — you now have a citable, versioned dataset instead of a hand-waved "thousands of stores." Download the CSV, run your own analysis, publish your own findings. We'll keep releasing monthly snapshots so your comparisons have a time axis.&lt;br&gt;
The less obvious use case is tooling. If you're building a commerce agent, an MCP client, or anything that needs to discover agent-ready stores, this dataset is your starting index. You don't need to crawl from scratch. Every domain in the file has a working UCP manifest right now. Point your agent at any of them and it will find something to buy.&lt;br&gt;
There's also benchmark utility. We've built our own benchmark tooling on top of this corpus — the &lt;a href="https://ucpchecker.com/leaderboard" rel="noopener noreferrer"&gt;leaderboard&lt;/a&gt; compares how AI models perform across real stores — but the underlying merchant list is the same one we're publishing. If you want to run your own evals against a representative cross-section of real UCP commerce, this is the store list to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in the open dataset
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fucpchecker.s3.eu-west-1.amazonaws.com%2Fblog%2Fhugging-face%2F03-open-vs-proprietary.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fucpchecker.s3.eu-west-1.amazonaws.com%2Fblog%2Fhugging-face%2F03-open-vs-proprietary.webp" alt="UCPChecker Open UCP Merchant Dataset — fields included in the free CC-BY 4.0 dataset: domain, status, capabilities, version, transports, ai_bot_policies, and timestamps" width="800" height="725"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;span&gt;Open Dataset — CC-BY 4.0 — &lt;a href="https://ucpchecker.com/blog/3000-ucp-stores-open-data-hugging-face-dataset" rel="noopener noreferrer"&gt;UCP Checker&lt;/a&gt;&lt;/span&gt;
&lt;span&gt;
&lt;a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fucpchecker.com%2Fblog%2F3000-ucp-stores-open-data-hugging-face-dataset&amp;amp;text=Open+UCP+Merchant+Dataset+via+%40ucpchecker" rel="noopener noreferrer"&gt;Share&lt;/a&gt;
&lt;a&gt;Embed&lt;/a&gt;
&lt;/span&gt;




&lt;h2&gt;
  
  
  Why publish it
&lt;/h2&gt;

&lt;p&gt;The ecosystem needs a shared baseline. Right now the people building agentic commerce tools — developers, agent frameworks, platforms — are all working from anecdotal evidence about which stores support what. That slows everyone down.&lt;br&gt;
A public, versioned dataset fixes that. Researchers can cite real numbers instead of guessing. Developers can seed their agents with verified stores instead of crawling from scratch. Platforms can benchmark themselves against the field. The whole ecosystem moves faster when there's a common reference point, and we're in the best position to provide one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the data shows
&lt;/h2&gt;

&lt;p&gt;Since we're talking about a dataset, it's worth saying what we actually see in it. The corpus grew fast — from a standing start in January to over 3,000 verified merchants by mid-March.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fucpchecker.s3.eu-west-1.amazonaws.com%2Fblog%2Fhugging-face%2F04-growth-timeline.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fucpchecker.s3.eu-west-1.amazonaws.com%2Fblog%2Fhugging-face%2F04-growth-timeline.webp" alt="UCPChecker Dataset Growth Timeline — January 2026 crawling begins (445 domains), February 1000+ stores, March 3000+ stores and first Hugging Face release, April+ monthly snapshots" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;span&gt;Dataset Growth — January to March 2026 — &lt;a href="https://ucpchecker.com/blog/3000-ucp-stores-open-data-hugging-face-dataset" rel="noopener noreferrer"&gt;UCP Checker&lt;/a&gt;&lt;/span&gt;
&lt;span&gt;
&lt;a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fucpchecker.com%2Fblog%2F3000-ucp-stores-open-data-hugging-face-dataset&amp;amp;text=Dataset+Growth+%E2%80%94+January+to+March+2026+via+%40ucpchecker" rel="noopener noreferrer"&gt;Share&lt;/a&gt;
&lt;a&gt;Embed&lt;/a&gt;
&lt;/span&gt;




&lt;p&gt;&lt;strong&gt;Version convergence is essentially complete.&lt;/strong&gt; 99.8% of stores in the dataset are advertising spec version &lt;code&gt;2026-01-23&lt;/code&gt;. The ecosystem standardized on this version fast — faster than most protocol adoptions we've observed. That's partly Shopify's influence (when Shopify ships a version, 898 stores update in lockstep) but it also reflects that UCP adopters are, by selection, developers who care about spec compliance.&lt;br&gt;
&lt;strong&gt;The capability gap is stark.&lt;/strong&gt; Checkout is nearly universal — 99.96% of verified merchants declare it. But look one capability past that and the numbers collapse. Cart operations drop to 0.07%. Identity linking is at 0.07%. Payment token support is at 0%. The protocol has the capability definitions. The stores mostly haven't implemented them yet.&lt;br&gt;
This is the part of the dataset we expect to move the most over the coming months. As Playground and other agent testing tools give developers concrete evidence that capability depth improves conversion, those numbers will shift. The baseline we're publishing now is a before picture.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fucpchecker.s3.eu-west-1.amazonaws.com%2Fblog%2Fhugging-face%2F02-capability-cliff.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fucpchecker.s3.eu-west-1.amazonaws.com%2Fblog%2Fhugging-face%2F02-capability-cliff.webp" alt="UCPChecker Capability Adoption Cliff — bar chart showing Checkout at 99.96% and Order at 99.7% versus Cart Management at 0.07%, Identity Linking at 0.07%, and Payment Token at 0%" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;span&gt;Capability Adoption Cliff — 3,000+ UCP stores — &lt;a href="https://ucpchecker.com/blog/3000-ucp-stores-open-data-hugging-face-dataset" rel="noopener noreferrer"&gt;UCP Checker&lt;/a&gt;&lt;/span&gt;
&lt;span&gt;
&lt;a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fucpchecker.com%2Fblog%2F3000-ucp-stores-open-data-hugging-face-dataset&amp;amp;text=Capability+Adoption+Cliff+%E2%80%94+3%2C000%2B+UCP+stores+via+%40ucpchecker" rel="noopener noreferrer"&gt;Share&lt;/a&gt;
&lt;a&gt;Embed&lt;/a&gt;
&lt;/span&gt;




&lt;p&gt;&lt;strong&gt;The platform breakdown tells a familiar story.&lt;/strong&gt; Shopify accounts for 898 of the identified stores. Generic (unidentified platform) accounts for 285. The long tail of WooCommerce, Magento, BigCommerce, and custom implementations is real but small compared to the Shopify bloc. This is consistent with what we've &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-march-2026" rel="noopener noreferrer"&gt;written about before&lt;/a&gt; — Shopify's platform-level default made UCP table-stakes for their merchants overnight. Everyone else is still climbing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Go use it
&lt;/h2&gt;

&lt;p&gt;The dataset is at &lt;a href="https://huggingface.co/datasets/UCPChecker/ucp-merchants" rel="noopener noreferrer"&gt;huggingface.co/datasets/UCPChecker/ucp-merchants&lt;/a&gt;. Download the CSV, run a notebook, build a tool, write a paper. The license is CC-BY 4.0 — use it for anything, just say where it came from.&lt;br&gt;
We'll cut a new snapshot on the first of each month. If you're tracking adoption over time, watch the Hugging Face page for updates.&lt;br&gt;
If you build something with it — an agent, an analysis, a visualization, a benchmark — we'd genuinely like to know. If you find gaps in the data or coverage you'd expect that isn't there, tell us. And if the base layer isn't enough and you need deeper data for your team, &lt;a href="https://ucpchecker.com/contact" rel="noopener noreferrer"&gt;reach out&lt;/a&gt;. That conversation is one we want to have.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Download the dataset:&lt;/strong&gt; &lt;a href="https://huggingface.co/datasets/UCPChecker/ucp-merchants" rel="noopener noreferrer"&gt;huggingface.co/datasets/UCPChecker/ucp-merchants&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check your store:&lt;/strong&gt; &lt;a href="https://ucpchecker.com" rel="noopener noreferrer"&gt;ucpchecker.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browse the full directory:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;ucpchecker.com/directory&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track adoption live:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/stats" rel="noopener noreferrer"&gt;ucpchecker.com/stats&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>ai</category>
      <category>ucp</category>
    </item>
    <item>
      <title>The BigCommerce UCP Guide: The Sleeping Giant of API-First Agent Commerce</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Thu, 02 Apr 2026 09:07:14 +0000</pubDate>
      <link>https://forem.com/benjifisher/the-bigcommerce-ucp-guide-the-sleeping-giant-of-api-first-agent-commerce-nf3</link>
      <guid>https://forem.com/benjifisher/the-bigcommerce-ucp-guide-the-sleeping-giant-of-api-first-agent-commerce-nf3</guid>
      <description>&lt;p&gt;BigCommerce has very limited UCP adoption in our monitoring dataset — we’ve verified just 2 BigCommerce stores with live UCP implementations, representing under 0.1% of the 2,826 verified UCP merchants we track. The platform’s API-first architecture suggests it should produce clean UCP implementations, and the stores we’ve validated bear that out. With such a small sample, this guide is as much an analysis of what BigCommerce’s architecture makes possible as it is a report on observed data.&lt;/p&gt;

&lt;p&gt;That's not accidental. BigCommerce has invested heavily in its API layer and headless commerce capabilities for years. When UCP arrived, the plumbing was already there. Merchants and developers who understand BigCommerce's architecture tend to implement UCP correctly because they're already thinking in terms of APIs, channels, and structured data.&lt;/p&gt;

&lt;p&gt;The failure patterns in BigCommerce UCP implementations aren’t random. They cluster tightly around three areas: GraphQL token lifecycle management, channel routing misconfiguration, and headless deployments where the manifest is served from the wrong origin. Know those three failure modes and you’ve covered the most likely production issues.&lt;/p&gt;

&lt;p&gt;This guide covers what BigCommerce provides natively, what the manifests actually look like across our monitored stores, where things break, and what it takes to configure your store for reliable AI agent commerce.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfpn7xoh0cc1h7hzbfrd.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfpn7xoh0cc1h7hzbfrd.webp" alt="BigCommerce UCP Architecture — channel-aware platform with GraphQL/REST API and multi-storefront support" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What BigCommerce Provides
&lt;/h2&gt;

&lt;p&gt;BigCommerce does not ship native UCP support the way Shopify does. There is no first-party UCP toggle in the control panel. Instead, UCP is delivered through BigCommerce's App Marketplace — merchants install a UCP connector app that integrates with the platform's existing API surface.&lt;/p&gt;

&lt;p&gt;This is architecturally different from Shopify's approach, and the difference matters. Because BigCommerce's REST and GraphQL APIs are already well-documented and production-ready, the connector app has a solid foundation to build on. The Storefront GraphQL API handles product discovery and variant resolution. The Management REST API handles order data and store configuration. The MCP transport layer sits on top of both.&lt;/p&gt;

&lt;p&gt;Out of the box, a properly installed BigCommerce UCP connector exposes the same core MCP capabilities as Shopify: &lt;strong&gt;Checkout&lt;/strong&gt; (cart management using the Server-to-Server Cart API) and &lt;strong&gt;Orders&lt;/strong&gt; (order status via the V2 and V3 Management APIs). Catalog browsing is part of the UCP spec but is currently in draft status. The quality of each capability depends on which API version the connector uses and whether the relevant API scopes were granted during installation.&lt;/p&gt;

&lt;p&gt;BigCommerce's &lt;strong&gt;channel-aware architecture&lt;/strong&gt; is the defining structural characteristic for UCP. Every sales surface in BigCommerce — storefronts, POS, marketplaces, headless frontends — is a channel. Agent commerce is treated as its own channel, which is the correct abstraction. This means a well-configured BigCommerce store can route agent requests to a dedicated channel with its own pricing, catalog visibility, and checkout configuration, completely separate from the standard storefront.&lt;/p&gt;

&lt;p&gt;The manifest at &lt;code&gt;/.well-known/ucp&lt;/code&gt; is served through BigCommerce's custom pages feature or injected via the Script Manager, depending on how the connector app was configured. Both approaches work. The Script Manager approach is more common in practice and generally more reliable across theme updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Manifest: What We See Across Monitored BigCommerce Stores
&lt;/h2&gt;

&lt;p&gt;BigCommerce manifests are among the more consistently structured in our dataset. The connector app handles manifest generation, and its output is predictable — which makes deviations easier to spot when they occur.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;protocol version&lt;/strong&gt; declaration is generally current on BigCommerce stores that installed the connector recently. The risk window is stores that have been running UCP for more than a few months without updating the connector app. BigCommerce's App Marketplace doesn't enforce automatic updates, so stores on older connector versions can fall behind the current protocol specification.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;capabilities array&lt;/strong&gt; on a well-configured BigCommerce manifest should include &lt;code&gt;dev.ucp.shopping.checkout&lt;/code&gt;, &lt;code&gt;dev.ucp.shopping.discount&lt;/code&gt;, and &lt;code&gt;dev.ucp.shopping.fulfillment&lt;/code&gt; at minimum. Stores using BigCommerce's B2B Edition — which adds company accounts, price lists, and purchase orders — should also declare B2B capabilities, but many don't. B2B Edition stores often have manifests that undersell their capabilities, causing agents to fall back to simpler B2C workflows on stores that could support negotiated pricing and purchase order flows.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;transport configuration&lt;/strong&gt; is where BigCommerce manifests diverge most from Shopify. Shopify manifests reliably declare a single MCP endpoint. BigCommerce manifests can declare multiple transport paths depending on how the connector app routes different request types — some using the REST API, some using the GraphQL Storefront API. This is fine when it's intentional and correctly declared. It becomes a problem when the GraphQL transport endpoint carries an access token that's embedded in the manifest and subject to expiration.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;payment handlers&lt;/strong&gt; section reflects BigCommerce's broad payment ecosystem. Native support for PayPal, Stripe, Braintree, Square, Adyen, Amazon Pay, and dozens of regional gateways means a well-configured manifest has a rich payment section. When merchants add or remove payment providers without triggering a manifest re-sync, the payment section silently drifts from reality — one of the most common issues we flag on BigCommerce stores.&lt;/p&gt;

&lt;p&gt;For stores using &lt;strong&gt;Multi-Storefront (MSF)&lt;/strong&gt;, each storefront can and should have its own manifest. A BigCommerce instance running three storefronts — say, a retail brand, a B2B portal, and a regional market — needs three distinct UCP configurations. A common MSF mistake is having only the primary storefront with a current manifest, while secondary storefronts are either missing UCP entirely or serving a manifest copied from the primary with incorrect endpoint URLs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common Manifest Issues We Flag
&lt;/h3&gt;

&lt;p&gt;The most common issues we’ve identified in BigCommerce UCP configurations are: &lt;strong&gt;expired GraphQL Storefront API tokens&lt;/strong&gt; embedded in manifest transport declarations (the token was valid at install time but rotates on a schedule the connector app doesn't handle automatically), &lt;strong&gt;stale payment declarations&lt;/strong&gt; after provider changes, &lt;strong&gt;MSF storefronts with missing or misrouted manifests&lt;/strong&gt;, &lt;strong&gt;headless deployments where the manifest origin doesn't match the storefront domain&lt;/strong&gt;, and &lt;strong&gt;undersized capabilities arrays on B2B Edition stores&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The GraphQL token issue deserves special mention because it's the failure mode most likely to affect you without warning. The token appears valid when the manifest is fetched — the JSON is well-formed, the endpoint URL resolves — but when an agent attempts a product search using the declared GraphQL transport, the 401 response is silent from the manifest's perspective. Monitoring tools that only check the manifest structure won't catch it. UCP Checker's runtime checks do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Runtime Performance: Competitive With Shopify, Architecture-Dependent
&lt;/h2&gt;

&lt;p&gt;BigCommerce is a managed SaaS platform, which means its baseline performance profile is comparable to Shopify — and significantly more consistent than self-hosted platforms like Magento or WooCommerce on variable hosting.&lt;/p&gt;

&lt;p&gt;Across the 2 BigCommerce stores in our dataset, MCP tool call response times were 729ms and 894ms — significantly slower than Shopify’s median of 146ms. Our sample is too small to draw strong conclusions about the platform’s typical performance range, but both stores run on managed SaaS infrastructure, so the 729–894ms range likely reflects the overhead of BigCommerce’s API routing architecture. The GraphQL Storefront API is generally faster for product discovery, while REST-backed operations like checkout and order management tend to add additional latency.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5u20i8bani3j74fd2212.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5u20i8bani3j74fd2212.webp" alt="BigCommerce MCP response times — GraphQL vs REST API comparison across operations" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Headless BigCommerce deployments — those using Next.js, Gatsby, or other frontend frameworks decoupled from the Stencil theme engine — add a layer of variability. The performance of the decoupled frontend itself doesn't affect MCP response times directly, but it can affect manifest availability and origin resolution. Headless stores that serve the manifest from the frontend origin rather than the BigCommerce-managed origin sometimes get different caching behavior than expected.&lt;/p&gt;

&lt;p&gt;Tool availability on well-configured BigCommerce stores is high. When we run &lt;code&gt;tools/list&lt;/code&gt; against stores with current connector versions and valid API tokens, the core tools are available. The failure mode is specifically those stores with expired GraphQL tokens — they pass manifest validation but fail tool availability checks at runtime.&lt;/p&gt;

&lt;p&gt;Checkout completion rates on BigCommerce are competitive, with one important caveat: stores using BigCommerce's Optimized One-Page Checkout (OPC) with custom modifications introduce the same class of problems we see on WooCommerce stores with heavily-modified checkout pages. Standard OPC configurations work correctly with agent checkouts. Custom fields added via checkout scripts can break the automated flow if they're configured as required inputs with JavaScript validation that the MCP checkout tool can't satisfy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration Checklist
&lt;/h2&gt;

&lt;p&gt;Based on our monitoring data, here are the five steps that separate BigCommerce stores that perform reliably in agent sessions from stores that pass the basic check but fail in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, install the UCP connector app and complete the full API scope grant.&lt;/strong&gt; Partial installations — where the connector was authorized with a reduced API scope to limit access — are a consistent source of checkout and order tool failures. The connector needs read/write access to carts, checkouts, and orders. Restrictive scope grants will produce a valid manifest with tools that silently fail on specific operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, check your GraphQL Storefront API token lifecycle.&lt;/strong&gt; If your UCP connector uses an embedded GraphQL token in the manifest transport declaration, find out how that token is rotated and whether the connector handles rotation automatically. If it doesn't, set a calendar reminder to re-authorize the connector before the token expires. Then run a check at &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;ucpchecker.com/check&lt;/a&gt; immediately after rotation to confirm the new token is correctly propagated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third, if you're running Multi-Storefront, configure UCP on each storefront independently.&lt;/strong&gt; Don't copy the primary manifest to secondary storefronts and assume it will work. Each storefront has its own channel ID, its own API endpoints, and potentially its own payment configuration. The manifest for each storefront needs to reflect its specific channel context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fourth, test checkout completion on your specific configuration.&lt;/strong&gt; Run a real agent session from product discovery through to order confirmation. If you have custom checkout scripts, loyalty integrations, or B2B pricing logic, test explicitly with those active. The standard manifest check won't catch checkout-layer failures — only a real session will.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fifth, set up &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;UCP Alerts&lt;/a&gt;.&lt;/strong&gt; BigCommerce connector app updates, payment provider changes, and API credential rotations can all silently modify your manifest or break your transport. Alerts give you visibility when something changes so you can investigate before agents encounter the failure in a live session.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-Storefront and Channel Considerations
&lt;/h2&gt;

&lt;p&gt;BigCommerce's Multi-Storefront feature is architecturally similar to Magento's multi-store capability in its complexity, but delivered in a managed SaaS context that removes most of the infrastructure headaches. What remains is the configuration challenge: each storefront is an independent UCP surface that needs its own manifest, its own API scope grants, and its own channel routing configuration.&lt;/p&gt;

&lt;p&gt;Channel routing is the core concept to understand. In BigCommerce's architecture, every request is associated with a channel. The UCP connector needs to map agent requests to the correct channel — typically the storefront channel the merchant wants agent commerce to flow through. When this mapping is misconfigured, agents may receive responses scoped to the wrong storefront: incorrect catalog, incorrect pricing, incorrect currency, potentially even a test store environment.&lt;/p&gt;

&lt;p&gt;Three common channel routing failure patterns can appear in MSF deployments. The first is agents hitting the default channel rather than a configured agent commerce channel, resulting in catalog responses that include items not intended for agent-driven sales. The second is currency mismatch: a storefront configured for EUR pricing routing agent requests through a USD channel, producing pricing responses that agents accept but buyers see differently. The third is the B2B channel problem — agents authenticated as guest users being routed to a B2C channel when the merchant intended them to access B2B pricing.&lt;/p&gt;

&lt;p&gt;If you're running MSF, the right approach is to create a dedicated channel for agent commerce and configure the UCP connector to route all MCP requests through it. This gives you explicit control over what agents can see, buy, and pay — and isolates agent traffic from your standard storefront analytics so you can measure it separately.&lt;/p&gt;

&lt;p&gt;For headless BigCommerce deployments, the manifest origin question requires explicit attention. If your frontend is served from &lt;code&gt;shop.yourbrand.com&lt;/code&gt; but your BigCommerce-managed origin is &lt;code&gt;yourbrand.mybigcommerce.com&lt;/code&gt;, agents discovering your store need to find the manifest at the right domain. Typically this means the manifest should be served from the customer-facing domain, not the BigCommerce subdomain. The connector app can usually be configured to support this, but it needs to be set up deliberately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Failure Modes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfjlswjyvk5lepfmlz0s.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfjlswjyvk5lepfmlz0s.webp" alt="Common BigCommerce UCP failure modes — token expiry, channel misrouting, OPC conflicts, headless origin mismatch" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Four failure patterns come up repeatedly in our BigCommerce monitoring data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GraphQL Storefront API token expiration.&lt;/strong&gt; This is the most common and the most invisible. The UCP connector embeds a GraphQL access token in the manifest transport declaration at installation time. When that token expires — and all Storefront API tokens eventually expire — the manifest continues to look valid from the outside. Agents fetch it, parse the transport configuration, and attempt product queries using the embedded token. The 401 response is returned at the API layer, not the manifest layer. Manifest-only validation tools report no problem. Your store silently fails every product discovery request. The fix is to rotate the token and update the connector configuration, then verify the manifest reflects the new token. If your connector doesn't handle this automatically, you need a process to catch it before agents do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Channel routing sending agent requests to the wrong storefront.&lt;/strong&gt; This produces some of the hardest-to-diagnose failures we encounter in monitoring. The manifest is valid. The API endpoints respond correctly. Agents complete sessions and produce what look like successful checkouts. But the orders land on a different storefront than expected — a test channel, a marketplace channel, or a secondary storefront — and the fulfillment team never sees them. If your BigCommerce instance has multiple channels, explicitly configure and test the channel your UCP connector routes to. Don't assume it defaults to the right one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optimized One-Page Checkout conflicts with custom scripts.&lt;/strong&gt; BigCommerce's OPC is well-suited to agent checkouts in its standard configuration. The problems arise with custom checkout scripts that add required fields — loyalty membership IDs, company account selectors for B2B stores, custom gift options — that the MCP checkout tool can't populate because they require JavaScript interaction or aren't exposed in the Server-to-Server Cart API. Agents that reach the final checkout step and encounter an unresolvable required field will abort the transaction. Audit your checkout scripts for required fields before going live with UCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headless deployments serving the manifest from the wrong origin.&lt;/strong&gt; Headless BigCommerce stores — those using Next.js or similar frameworks decoupled from Stencil — sometimes misconfigure which domain serves the UCP manifest. If the manifest is served from the BigCommerce-managed subdomain but agents discover the store at the custom domain, the manifest origin doesn't match the store's public identity. Some agents treat this as a trust failure and won't proceed. Ensure your manifest is served from your primary customer-facing domain and that the transport endpoint URLs in the manifest use the same domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product Feed Best Practices
&lt;/h2&gt;

&lt;p&gt;BigCommerce's product data model is one of the more capable in the market — native support for variants, custom fields, metafields, and the Catalog API's structured product hierarchy means there's no shortage of data to work with. The challenge is exposing it correctly through the UCP layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use metafields for agent-relevant product attributes.&lt;/strong&gt; BigCommerce's metafields API lets you attach structured key-value data to products, variants, and categories. For agent commerce, this is the right place to put attributes that matter for agent decision-making but don't fit neatly into standard product fields: care instructions, compatibility information, sizing notes, assembly requirements. Agents that can access metafield data make better recommendations and have lower clarification rates. Ensure your UCP connector is configured to expose product metafields in its Discovery tool responses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep variant complexity manageable.&lt;/strong&gt; BigCommerce supports up to 600 variants per product, which is a product management feature that becomes an agent commerce liability when used carelessly. An agent attempting to resolve a specific variant from a product with dozens of option combinations across three dimensions is doing significantly more work than one navigating a product with a clean, well-structured option set. For your highest-traffic products, audit the variant matrix for clarity — agents and humans alike navigate them better when options are logically structured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set accurate stock levels and availability signals.&lt;/strong&gt; BigCommerce's inventory tracking is granular and reliable when maintained. UCP agents rely on the availability signals returned by the Catalog API to make add-to-cart decisions. Products shown as in-stock that fail at checkout — because the inventory wasn't updated after a bulk sale, or because stock tracking was disabled for a product category — produce failed agent sessions and degraded trust in your store as a reliable agent commerce destination.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure multi-currency correctly per channel.&lt;/strong&gt; Unlike WooCommerce, which requires plugins for multi-currency, BigCommerce has native multi-currency support built into its channel architecture. But it requires explicit configuration per channel. If your agent commerce channel isn't configured with the correct transactional currency — the one you actually want agent purchases denominated in — you'll get currency mismatch issues at checkout. Verify this in your channel settings before enabling UCP agent traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured data on storefront pages.&lt;/strong&gt; For stores using Stencil themes, ensure your product pages include Schema.org Product markup. This creates a secondary discovery path for agents that discover products through web crawling before connecting via MCP. The markup should include product name, description, price with currency, availability, brand, SKU, and image URLs. BigCommerce's Stencil framework makes this straightforward to implement — and it serves double duty as structured data for traditional search engines.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Coming
&lt;/h2&gt;

&lt;p&gt;BigCommerce's API-first philosophy positions it well for the next generation of UCP capabilities. Two developments are particularly relevant to BigCommerce merchants planning their agent commerce roadmap.&lt;/p&gt;

&lt;p&gt;The first is &lt;strong&gt;B2B Edition integration with UCP&lt;/strong&gt;. BigCommerce's B2B Edition — with its company accounts, price lists, and purchase order workflows — is an underdeveloped UCP surface. Most B2B Edition stores we monitor aren't exposing their B2B capabilities through UCP at all, which means agents are interacting with them as generic B2C stores. As UCP's B2B capability declarations mature and connector apps update to support them, BigCommerce B2B Edition stores have significant upside from exposing negotiated pricing and account-aware purchasing to AI buyers.&lt;/p&gt;

&lt;p&gt;The second is &lt;strong&gt;webhook-driven manifest updates&lt;/strong&gt;. BigCommerce's webhook infrastructure is robust enough to trigger automatic manifest refreshes when catalog, pricing, or payment configuration changes. Some advanced implementations already take this approach — manifest changes propagate within minutes of a store update rather than waiting for a manual re-sync or scheduled job. This will likely become standard practice as the connector app ecosystem matures and best practices solidify.&lt;/p&gt;

&lt;p&gt;We track emerging capability adoption across all platforms through our &lt;a href="https://ucpchecker.com/stats" rel="noopener noreferrer"&gt;stats dashboard&lt;/a&gt;. The BigCommerce segment is smaller than Shopify's but its quality distribution is a useful leading indicator of what well-implemented UCP looks like in practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check Your Store
&lt;/h2&gt;

&lt;p&gt;If you're running a BigCommerce store and haven't verified your UCP configuration, &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;run a check at ucpchecker.com&lt;/a&gt;. The check validates your manifest structure, protocol version, and capabilities declaration — and our runtime checks will surface GraphQL token issues that manifest-only validators miss.&lt;/p&gt;

&lt;p&gt;If you're running Multi-Storefront, run the check against each storefront domain separately. A passing result on your primary storefront doesn't tell you anything about the configuration state of your secondary storefronts.&lt;/p&gt;

&lt;p&gt;Once you're in our directory, set up &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;UCP Alerts&lt;/a&gt; so you're notified when we detect a change in your manifest. Token rotations, connector updates, and payment configuration changes can all silently modify your manifest. Catching those changes before agents encounter them is the difference between managed UCP health and discovering problems through failed sessions.&lt;/p&gt;

&lt;p&gt;And if you want to see how real AI agents experience your BigCommerce store — including whether that GraphQL token is actually working end-to-end — &lt;a href="https://ucpplayground.com/?utm_source=ucpchecker&amp;amp;utm_medium=blog&amp;amp;utm_campaign=bigcommerce-guide" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt; lets you run live agent sessions against your store. It's the fastest way to validate that your channel routing is correct and your checkout flow completes without interruption.&lt;/p&gt;

&lt;h2&gt;
  
  
  References &amp;amp; Official Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.commerce.com/press/press-release-google-ucp/" rel="noopener noreferrer"&gt;Commerce Supports Universal Commerce Protocol&lt;/a&gt; — BigCommerce’s parent company endorses UCP at NRF (January 2026)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bigcommerce.com/blog/universal-commerce-protocol/" rel="noopener noreferrer"&gt;Universal Commerce Protocol (UCP) Explained — BigCommerce Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://investors.commerce.com/news-releases/news-release-details/commerce-supports-universal-commerce-protocol-plans-offer-buying" rel="noopener noreferrer"&gt;Commerce Investor Relations: UCP Announcement&lt;/a&gt; — Plans to offer buying directly across Google AI surfaces&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.google/products/ads-commerce/agentic-commerce-ai-tools-protocol-retailers-platforms/" rel="noopener noreferrer"&gt;Google: New Tech and Tools for Retailers in an Agentic Shopping Era&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ucp.dev/" rel="noopener noreferrer"&gt;UCP Specification — ucp.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/first-autonomous-ai-agent-purchase-ucp" rel="noopener noreferrer"&gt;The First Fully Autonomous AI Agent Purchase Through UCP&lt;/a&gt; — what an end-to-end autonomous transaction looks like in practice&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/ucp-identity-linking-agentic-commerce" rel="noopener noreferrer"&gt;UCP Now Supports Identity Linking&lt;/a&gt; — especially relevant for B2B Edition stores with company accounts and price lists&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-march-2026" rel="noopener noreferrer"&gt;The State of Agentic Commerce — March 2026&lt;/a&gt; — BigCommerce adoption data in context with the broader ecosystem&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/why-we-built-ucp-playground" rel="noopener noreferrer"&gt;Why We Built UCP Playground&lt;/a&gt; — test your BigCommerce store with real agent sessions across five models&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Related Platform Guides
&lt;/h2&gt;

&lt;p&gt;Exploring UCP across other platforms? These guides cover what we’ve learned about each platform’s implementation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ucpchecker.com/blog/shopify-ucp-guide-ai-agent-commerce" rel="noopener noreferrer"&gt;The Shopify UCP Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ucpchecker.com/blog/woocommerce-ucp-guide-ai-agent-commerce" rel="noopener noreferrer"&gt;The WooCommerce UCP Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ucpchecker.com/blog/magento-adobe-commerce-ucp-guide-ai-agent-commerce" rel="noopener noreferrer"&gt;The Magento / Adobe Commerce UCP Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>ucp</category>
    </item>
    <item>
      <title>The Magento UCP Guide: What Enterprise Monitoring Data Tells Us About Adobe Commerce Agent Readiness</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Wed, 01 Apr 2026 09:12:30 +0000</pubDate>
      <link>https://forem.com/benjifisher/the-magento-ucp-guide-what-enterprise-monitoring-data-tells-us-about-adobe-commerce-agent-readiness-1k6</link>
      <guid>https://forem.com/benjifisher/the-magento-ucp-guide-what-enterprise-monitoring-data-tells-us-about-adobe-commerce-agent-readiness-1k6</guid>
      <description>&lt;p&gt;As of our most recent scan across 3,235 domains, we have not verified a single Magento or Adobe Commerce store with a live UCP implementation. Magento UCP adoption is effectively zero today. That doesn’t mean it’s impossible — the platform has the technical foundation for it — but this guide is written based on technical analysis of the platform’s architecture, rather than observed monitoring data from live stores.&lt;/p&gt;

&lt;p&gt;The gap between configuration and runtime reality is what we expect will be the defining challenge of Magento UCP deployments. A Shopify store either has UCP working or it doesn’t. A Magento store — given the platform’s infrastructure complexity — can appear to have a valid manifest, pass a surface-level check, and still deliver broken agent sessions at runtime because of Varnish caching, REST API restrictions, or module interceptors modifying response payloads. This guide is written in anticipation of these deployments.&lt;/p&gt;

&lt;p&gt;This guide covers what we've learned monitoring Magento and Adobe Commerce stores: what the platform requires, what the manifests actually look like at enterprise scale, where things break, and what it takes to run reliably for AI agents. The audience here isn't a solo merchant toggling a plugin — it's the dev team that owns the platform and needs to understand what UCP compliance means in a heavily customized environment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ndy1xdp75hclb11tn25.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ndy1xdp75hclb11tn25.webp" alt="Magento UCP Architecture — enterprise infrastructure stack with Varnish, REST API, and multi-store support" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Magento Requires
&lt;/h2&gt;

&lt;p&gt;Magento has no native UCP support. Unlike Shopify, which ships the Universal Commerce Agent capability as a first-party app, Magento requires a Composer-installable module that integrates with the platform's service layer. There is no admin panel toggle, no app store install, no one-click activation.&lt;/p&gt;

&lt;p&gt;The module handles three things: registering a custom controller route that serves the &lt;code&gt;/.well-known/ucp&lt;/code&gt; manifest, wiring up an MCP transport endpoint through Magento's REST API layer, and exposing catalog, cart, and checkout operations as structured MCP tools. Installing it requires Composer access, a code deployment pipeline, and a developer who understands Magento's dependency injection framework.&lt;/p&gt;

&lt;p&gt;Minimum requirement for stable compatibility is &lt;strong&gt;Magento 2.4.7&lt;/strong&gt;. Earlier versions of the 2.4.x line have known issues with the REST API authentication flow that the UCP module depends on, and anything pre-2.4 is not supported. Adobe Commerce Cloud deployments on the current managed stack are generally compatible out of the box.&lt;/p&gt;

&lt;p&gt;Beyond the module itself, your infrastructure stack determines how hard UCP implementation actually is. The full Magento production stack — PHP-FPM, MySQL or MariaDB, Elasticsearch or OpenSearch, Redis, Varnish, and optionally RabbitMQ for async processing — has multiple layers that can interfere with how the manifest is served and how MCP requests are handled. Each component needs to be explicitly configured to let UCP traffic through correctly. This is not a concern on Shopify or a basic WooCommerce stack. On Magento, it is the central implementation challenge.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Manifest: What We See Across Enterprise Monitoring
&lt;/h2&gt;

&lt;p&gt;Your UCP manifest at &lt;code&gt;/.well-known/ucp&lt;/code&gt; is the entry point for every AI agent that discovers your store. On Magento, the manifest is generated by the module and served via the custom controller route. What agents actually receive, however, depends heavily on what your infrastructure does with that request before it hits the controller — and on Magento stores, the infrastructure layer is rarely neutral.&lt;/p&gt;

&lt;p&gt;The first thing we check is whether the manifest is actually being served dynamically. In a correctly configured Magento stack, &lt;code&gt;/.well-known/ucp&lt;/code&gt; bypasses Varnish and is served directly from the application. In incorrectly configured stacks — the most common misconfiguration on this type of infrastructure — Varnish is likely to cache the response. We'll cover this in detail in the failure modes section, but the practical consequence is that manifest updates (new capabilities, key rotations, payment provider changes) don't propagate to agents until the cache expires or is manually purged.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;protocol version&lt;/strong&gt; field is likely to be more variable on Magento than on any other platform. Because there is no platform-managed update cycle, stores running the UCP module must manually update it to stay current with the specification. We’d expect a wider spread of protocol versions on Magento than on Shopify — stores that install the module and don’t maintain it will fall behind the current spec, which well-implemented agents may reject during version negotiation.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;capabilities array&lt;/strong&gt; on Magento manifests requires explicit configuration. The module does not infer capabilities from your store's installed feature set the way Shopify's app does. A store with B2B shared catalogs enabled will not automatically declare a B2B capability unless the module is configured to do so. This creates a predictable pattern: Magento manifests that are technically valid but undersell the store’s actual capabilities, causing agents to attempt simpler workflows than the store could support.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;payment handlers&lt;/strong&gt; section requires manual maintenance. When you add Adobe Payment Services, Braintree, Adyen, or any other payment extension, the UCP module does not automatically detect the change. Someone needs to update the manifest configuration. Stale payment declarations are likely to be the second most common issue after Varnish caching problems.&lt;/p&gt;

&lt;p&gt;Finally, for stores using &lt;strong&gt;multi-website or multi-store architecture&lt;/strong&gt;, each storefront needs to declare its own manifest correctly. A single Magento instance running three storefronts with different product catalogs, currencies, and payment methods has three distinct UCP configurations to maintain. We frequently see stores where the default website has a current manifest but secondary store views are serving outdated or incorrectly scoped declarations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common Manifest Issues We Flag
&lt;/h3&gt;

&lt;p&gt;Based on the platform’s architecture, the most likely issues to encounter in a Magento UCP deployment are: &lt;strong&gt;Varnish-cached manifests&lt;/strong&gt; (the manifest was correct when deployed but changes haven't propagated because the cache was never purged), &lt;strong&gt;stale payment declarations&lt;/strong&gt; (payment methods added or removed after initial module setup without a manifest update), &lt;strong&gt;missing or expired signing keys&lt;/strong&gt; (particularly on stores that had a security audit requiring key rotation but didn't update the UCP configuration), &lt;strong&gt;undersized capabilities arrays&lt;/strong&gt; (the manifest declares fewer capabilities than the store actually supports), and &lt;strong&gt;incorrect transport URLs&lt;/strong&gt; (the MCP endpoint URL in the manifest points to a path that's been modified by a third-party security extension or WAF rewrite rule).&lt;/p&gt;

&lt;p&gt;None of these produce a hard manifest validation error. An agent will fetch the manifest, parse it, and attempt to start a session — only to encounter failures that trace back to the manifest not accurately describing the store's current state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Runtime Performance: Infrastructure-Dependent
&lt;/h2&gt;

&lt;p&gt;Magento's performance profile is fundamentally different from Shopify's. Shopify stores the infrastructure and its performance profile is relatively consistent across merchants. Magento performance is as variable as the hardware it runs on — which ranges from shared hosting running a decade-old stack to Adobe Commerce Cloud backed by managed Fastly CDN.&lt;/p&gt;

&lt;p&gt;Based on Magento’s infrastructure characteristics, we’d expect MCP tool call response times between 600ms and 1,500ms on self-hosted infrastructure — significantly slower than Shopify’s median of 146ms. For agent workflows that execute multiple sequential tool calls, this compounds: a product search → variant resolution → cart add → checkout sequence that takes well under a second on Shopify could take 8–12 seconds on a heavily customized Magento store without full-page cache warming.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgf3yxkyn0g09tiv1zy5s.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgf3yxkyn0g09tiv1zy5s.webp" alt="Magento MCP response times — self-hosted vs Adobe Commerce Cloud comparison" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adobe Commerce Cloud deployments should perform substantially better. The managed Fastly CDN layer, optimized PHP-FPM configuration, and managed Elasticsearch should reduce median response times to the 350–600ms range — considerably closer to Shopify territory. If you have the option to migrate to Commerce Cloud and runtime performance for agent sessions is a concern, the infrastructure improvements are well-established.&lt;/p&gt;

&lt;p&gt;On self-hosted Magento, the configuration decisions that most affect agent session performance are: Redis for session and full-page cache (dramatically reduces PHP processing per request), Elasticsearch or OpenSearch properly indexed and warmed (product search latency drops from 800ms+ to under 100ms), and PHP OPcache enabled and sized correctly (eliminates per-request compilation overhead). These aren't UCP-specific recommendations — they're standard Magento performance practices — but their absence is directly visible in agent session benchmarks.&lt;/p&gt;

&lt;p&gt;Tool availability is likely to vary significantly on Magento. On stores with incomplete ACL permission configurations, agents attempting to call the catalog or checkout MCP tools receive authorization errors even for unauthenticated browsing operations. On stores where a third-party security extension has rewritten API routes, the tool endpoints declared in the manifest don't respond. &lt;code&gt;tools/list&lt;/code&gt; returning a complete tool set doesn't mean those tools work — we validate this separately in our benchmark checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration Checklist
&lt;/h2&gt;

&lt;p&gt;Based on our monitoring data, here are five configuration steps that separate Magento stores that perform reliably for agent sessions from those that pass manifest validation but break at runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, exclude &lt;code&gt;/.well-known/ucp&lt;/code&gt; from Varnish caching.&lt;/strong&gt; This is the single most impactful configuration change you can make. Add the path to your Varnish VCL exclusion list and verify the exclusion is active. The check is simple: deploy a manifest change, wait 30 seconds, and fetch the URL directly from an IP that isn't cached — if you see the old manifest, Varnish is still serving it. Our monitoring catches this automatically: if we detect a manifest change lag of more than 5 minutes between deployment and propagation, we flag the store.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, audit your REST API ACL permissions.&lt;/strong&gt; Magento's ACL system controls which API resources are accessible to which user roles. The UCP module requires specific REST API routes to be available for anonymous or token-authenticated access depending on your configuration. After installation, explicitly verify that the MCP endpoint routes are accessible without triggering a 401 or 403. Test from an IP with no prior Magento session — stores frequently work in testing because the tester is authenticated as an admin, but fail for agents that arrive unauthenticated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third, verify your manifest at &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;ucpchecker.com/check&lt;/a&gt;.&lt;/strong&gt; Run the check immediately after initial setup and after every deployment that touches payment configuration, API routes, or security settings. Review the capabilities and transport sections specifically. If you're running multi-website architecture, check each storefront URL independently — manifests are per-website, not per-instance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fourth, test your MCP endpoints through your WAF and CDN, not just locally.&lt;/strong&gt; The most common source of "works in staging, broken in production" issues on Magento is a WAF or CDN rule that blocks or modifies the MCP traffic. Agent requests look different from browser requests — different headers, different user-agent strings, different request patterns. Run a validation check from outside your network before declaring the implementation complete.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fifth, set up &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;UCP Alerts&lt;/a&gt;.&lt;/strong&gt; Magento deployments involve many moving parts — module updates, security patches, payment gateway updates, infrastructure changes. Any of these can silently alter your manifest or break your MCP endpoints. Alerts catch regressions before they compound into sustained agent session failures that affect real transactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-Store and B2B Considerations
&lt;/h2&gt;

&lt;p&gt;Magento's multi-website and multi-store architecture is one of its defining enterprise capabilities — and one of the most significant sources of UCP complexity we see in our monitoring data. A single Magento instance can serve multiple storefronts, each with its own domain, product catalog, pricing, currency, and payment configuration. Each of those storefronts is a distinct UCP entity that requires its own manifest.&lt;/p&gt;

&lt;p&gt;The practical challenge is that Magento's multi-store architecture was designed for human shoppers navigating a browser. AI agents don't have sessions. They don't follow store-switcher UI. They access a domain, fetch the manifest, and connect via MCP. If your secondary storefronts don't have correctly configured manifests at their respective &lt;code&gt;/.well-known/ucp&lt;/code&gt; paths, agents reaching those storefronts get nothing — or get the wrong manifest if Magento defaults to the primary website's response.&lt;/p&gt;

&lt;p&gt;A common pattern to watch for: the flagship storefront has a current, valid manifest while the B2B portal on a subdomain serves a stale manifest because the dev team configured the primary instance and assumed it propagated. It doesn’t. Each store view with a distinct domain requires explicit manifest configuration and independent monitoring.&lt;/p&gt;

&lt;p&gt;B2B features add further complexity. Adobe Commerce's B2B module supports shared catalogs (different product visibility and pricing per company account), company accounts and approval workflows, and requisition lists that function as persistent carts. These capabilities aren't part of the base UCP specification — agents that encounter them need the manifest to correctly declare what B2B features are available and what they require in terms of authentication. A B2B buyer whose agent tries to add an item to a requisition list that requires company account authentication will get an authorization error with no clear indication of why.&lt;/p&gt;

&lt;p&gt;The current best practice for B2B Magento UCP implementations is to declare B2B capabilities explicitly in your manifest if they're enabled, provide clear authentication scope requirements, and test agent sessions with both unauthenticated and authenticated company account contexts. The authenticated path is often where the enterprise GMV lives — if agents can't reliably complete approved purchases through the company account flow, the UCP implementation has limited value for your actual buyer population.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Failure Modes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozl2wg2tu1m1j3shwm32.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozl2wg2tu1m1j3shwm32.webp" alt="Common Magento UCP failure modes — Varnish cache, REST ACL, DI interceptors, Elasticsearch lag" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Four failure patterns are likely to appear in Magento UCP deployments, based on the platform’s architecture and infrastructure complexity. Each is distinct from what we observe on other platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Varnish serving stale manifests.&lt;/strong&gt; This is the most predictable failure mode on Magento infrastructure and the one most likely to catch merchants off-guard. Varnish's default behavior is to cache everything it can, including responses from paths that look like static files. &lt;code&gt;/.well-known/ucp&lt;/code&gt; looks like a static resource to Varnish. Without an explicit exclusion in your VCL, every manifest update you deploy will be invisible to agents until the cached response expires — which, depending on your TTL configuration, could be hours or days. It’s entirely possible for a key rotation deployed on Monday to go unnoticed by agents until Wednesday if Varnish TTLs are measured in days. Agents encountering an expired key receive authentication failures with no indication that the manifest itself is the problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REST API routes disabled or restricted.&lt;/strong&gt; Magento's REST API can be restricted at the module level, at the ACL level, and at the server level (by a WAF or reverse proxy rule). The UCP module uses REST as its MCP transport layer. When any of these restrictions unexpectedly blocks MCP traffic, agents receive errors that look like authentication or authorization failures — not like "the endpoint doesn't exist." Diagnosing this requires tracing the request from the agent through your full infrastructure stack, which on a heavily customized Magento deployment can involve six or more layers. The shortest path to a diagnosis is running a raw REST API call to your MCP endpoint from an external IP with no cached credentials and checking the actual HTTP response.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DI interceptors silently modifying response payloads.&lt;/strong&gt; Magento's dependency injection and plugin/interceptor system allows any installed module to modify the inputs or outputs of any service class without touching the original code. This is a powerful extension mechanism for human-facing commerce features — and a significant source of unpredictable behavior for AI agents. A payment module’s interceptor can add a custom field to the checkout response payload that breaks the MCP tool’s JSON schema validation. The checkout would work fine for human shoppers because browser-side JavaScript would ignore the extra field — but the agent, expecting a strict schema, would fail. Identifying these interceptors requires code-level investigation: run &lt;code&gt;bin/magento dev:di:info&lt;/code&gt; for the service classes your MCP module uses and audit every registered plugin for potential payload modifications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elasticsearch index lag causing catalog discrepancies.&lt;/strong&gt; Magento's product search runs through Elasticsearch or OpenSearch. When you update product data — price changes, availability updates, new variants — those changes don't immediately appear in search results. They propagate through an indexing queue, which on a busy store with a large catalog can lag 15–60 minutes behind the source of truth in MySQL. An agent running product discovery through the MCP search tool may find a product at yesterday's price, add it to a cart, and then receive a different total at checkout because the MySQL price was updated in the interim. This isn't a UCP-specific problem — it's a fundamental characteristic of Magento's search architecture. The mitigation is ensuring your indexer is running on a tight schedule (&lt;code&gt;bin/magento indexer:set-mode schedule&lt;/code&gt;) and configuring realtime reindex triggers for high-velocity data like price and inventory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product Feed Best Practices
&lt;/h2&gt;

&lt;p&gt;Magento's Extended Attribute Value (EAV) data model gives merchants fine-grained control over product attributes — more flexibility than Shopify or WooCommerce. It also means product data quality varies more widely across Magento stores than on any other platform we monitor. Custom attributes are easy to add and easy to leave half-configured. When agents try to navigate that data, the gaps show up immediately.&lt;/p&gt;

&lt;p&gt;Here's what matters for agent-readable product feeds on Magento:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configurable products need complete variant trees.&lt;/strong&gt; Magento's configurable product type is how most stores handle size/color/material combinations. Each configuration attribute needs to be properly linked to child simple products, with every variant having an explicit SKU, price, and stock status. Agents resolving a "blue size L" request need to follow the configurable → simple product tree cleanly. We see stores where variants were deleted from the admin but not delinked from the parent, leaving the MCP tool returning variant options that point to nonexistent products.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep custom attributes typed correctly.&lt;/strong&gt; EAV's flexibility means merchants add custom attributes without thinking carefully about data type. A numeric attribute stored as a varchar, a boolean attribute that contains "Yes"/"No" strings instead of 1/0, a multiselect attribute whose option values are internal IDs instead of human-readable labels — all of these create parsing problems for agents that expect structured, typed data. Audit your product attribute configuration and ensure the attributes exposed via MCP have predictable, correctly typed values.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set &lt;code&gt;priceCurrency&lt;/code&gt; on every offer.&lt;/strong&gt; On multi-website Magento setups with multiple base currencies, this is especially important. Each store view may have its own currency and pricing tier. Agents that receive product data without explicit currency context can't reliably present pricing to buyers or compare across session contexts. Every product offer exposed through the MCP catalog tool should declare its currency explicitly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filter your MCP-facing catalog to match the public storefront.&lt;/strong&gt; Magento's attribute set and product visibility settings control what appears on the storefront. The MCP module needs to apply the same visibility filters. Disabled products, products assigned to inactive websites, and products with “Not Visible Individually” visibility settings can surface in MCP catalog responses if the module doesn’t correctly apply visibility filters. An agent that finds a product, adds it to a cart, and receives an error at checkout because the product isn't purchasable is delivering a broken session — and that store is the one the agent won't recommend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ensure Elasticsearch index freshness matches your commerce velocity.&lt;/strong&gt; If you run flash sales, daily pricing changes, or frequent inventory updates, your search index needs to reflect those changes on a timeline compatible with agent session behavior. Agents don't tolerate stale data the way human shoppers do — a shopper who sees a sale price and gets a different total at checkout might complete the purchase anyway. An agent validating totals before confirmation will abort. Run your indexers on schedule mode and monitor for queue backlog during high-traffic periods.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Images need descriptive alt text.&lt;/strong&gt; This is standard accessibility practice and equally important for agent sessions. "product-image-1.jpg" gives an agent nothing to work with. "Adobe Indigo slim-fit chino — front view — ink blue" gives it everything. On Magento, images are often managed through a bulk import process where alt text is omitted. Review your image metadata, particularly for high-velocity product categories where agents are most likely to be doing visual confirmation before adding to cart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured data on product pages matters for discovery.&lt;/strong&gt; Agents that discover products through web crawling before connecting via MCP rely on Schema.org Product markup on your storefront pages. Magento's default themes include some structured data but it's often incomplete or misconfigured, especially on heavily customized storefronts. Ensure your product pages include: name, description, price with currency, availability, brand, SKU, image URLs, and if you're running B2B, appropriate organization-level restrictions. This creates a discovery path that doesn't depend on the MCP module being correctly configured before an agent can find your store.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Coming
&lt;/h2&gt;

&lt;p&gt;Two developments in the UCP specification are particularly relevant for enterprise Magento deployments. The first is &lt;strong&gt;persistent cart and session handoff&lt;/strong&gt; — the ability for an agent to build a cart that a human buyer can then complete in a browser. For B2B scenarios where purchase approval is required, this is the capability that makes agentic commerce actually practical: an agent qualifies the order and builds the cart, a purchasing manager reviews and approves it, checkout completes with human authorization. Magento's existing quote management system maps well to this model.&lt;/p&gt;

&lt;p&gt;The second is &lt;strong&gt;identity linking&lt;/strong&gt; — agents authenticating as known customers and accessing account history, loyalty tiers, saved addresses, and company account context. On Adobe Commerce's B2B module, this is where the real enterprise value is. An agent that can access a company's purchase history, check requisition list contents, and complete a reorder against a negotiated catalog price is dramatically more useful than one that can only browse the public catalog. The infrastructure for this exists in Commerce today — the UCP specification is catching up to it.&lt;/p&gt;

&lt;p&gt;We track adoption of emerging capabilities through our &lt;a href="https://ucpchecker.com/stats" rel="noopener noreferrer"&gt;stats dashboard&lt;/a&gt; and publish deeper analysis in the &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-2026" rel="noopener noreferrer"&gt;State of Agentic Commerce&lt;/a&gt; reports. Enterprise adoption tends to lag consumer platforms by 12–18 months on new protocol features — but the GMV concentration in enterprise Magento accounts means when adoption does happen, it moves markets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check Your Store
&lt;/h2&gt;

&lt;p&gt;If you're running Magento or Adobe Commerce and haven't run a UCP check yet, &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;start there&lt;/a&gt;. The check validates your manifest, verifies your MCP endpoints are reachable from outside your network, and surfaces the most common configuration issues. It will tell you things your internal staging environment won't, because it tests from the perspective of an agent arriving at your store cold — no cached credentials, no prior session, no whitelisted IP.&lt;/p&gt;

&lt;p&gt;If you're already in our directory, set up &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;UCP Alerts&lt;/a&gt;. The failure modes that matter most on Magento — Varnish cache serving stale manifests, REST API routes unexpectedly going offline after a deployment, signing keys expiring — are invisible unless you're monitoring continuously. A valid manifest at launch doesn't stay valid indefinitely on a platform that gets as many security patches and third-party module updates as Magento does.&lt;/p&gt;

&lt;p&gt;And if you want to see how AI agents actually experience your store end-to-end — not just whether the manifest validates, but whether agents can complete product discovery, variant resolution, and checkout on your specific implementation — &lt;a href="https://ucpplayground.com/?utm_source=ucpchecker&amp;amp;utm_medium=blog&amp;amp;utm_campaign=magento-guide" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt; runs real agent sessions against live stores. Enterprise Magento customizations create edge cases that manifest validation can't surface. Real session benchmarks find them before your buyers' agents do.&lt;/p&gt;

&lt;h2&gt;
  
  
  References &amp;amp; Official Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://business.adobe.com/blog/adobe-commerce-commits-to-agentic-commerce-standards" rel="noopener noreferrer"&gt;Adobe Commerce Commits to Agentic Commerce Standards&lt;/a&gt; — Adobe’s official commitment to UCP, ACP, and AP2&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.creatuity.com/insights/adobe-commerce-catalog-optimization-ai-agent-discoverability-2026/" rel="noopener noreferrer"&gt;Adobe Commerce Catalog Optimization for AI Agent Discoverability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.google/products/ads-commerce/agentic-commerce-ai-tools-protocol-retailers-platforms/" rel="noopener noreferrer"&gt;Google: New Tech and Tools for Retailers in an Agentic Shopping Era&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.googleblog.com/under-the-hood-universal-commerce-protocol-ucp/" rel="noopener noreferrer"&gt;Under the Hood: Universal Commerce Protocol — Google Developers Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ucp.dev/" rel="noopener noreferrer"&gt;UCP Specification — ucp.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/first-autonomous-ai-agent-purchase-ucp" rel="noopener noreferrer"&gt;The First Fully Autonomous AI Agent Purchase Through UCP&lt;/a&gt; — end-to-end autonomous checkout using identity linking and wallet payment&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/ucp-identity-linking-agentic-commerce" rel="noopener noreferrer"&gt;UCP Now Supports Identity Linking&lt;/a&gt; — particularly relevant for B2B Magento deployments with company accounts and negotiated pricing&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-march-2026" rel="noopener noreferrer"&gt;The State of Agentic Commerce — March 2026&lt;/a&gt; — latest ecosystem data including enterprise adoption trends&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/how-a-browser-extension-became-our-biggest-discovery-engine" rel="noopener noreferrer"&gt;How a Browser Extension Became Our Biggest Discovery Engine&lt;/a&gt; — how we discover and monitor stores across platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Related Platform Guides
&lt;/h2&gt;

&lt;p&gt;Exploring UCP across other platforms? These guides cover what we’ve learned about each platform’s implementation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ucpchecker.com/blog/shopify-ucp-guide-ai-agent-commerce" rel="noopener noreferrer"&gt;The Shopify UCP Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ucpchecker.com/blog/woocommerce-ucp-guide-ai-agent-commerce" rel="noopener noreferrer"&gt;The WooCommerce UCP Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ucpchecker.com/blog/bigcommerce-ucp-guide-ai-agent-commerce" rel="noopener noreferrer"&gt;The BigCommerce UCP Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ecommerce</category>
      <category>api</category>
      <category>tutorial</category>
      <category>ucp</category>
    </item>
    <item>
      <title>The WooCommerce UCP Guide: What Our Monitoring Data Reveals About WordPress Agent Commerce</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Tue, 31 Mar 2026 12:11:35 +0000</pubDate>
      <link>https://forem.com/benjifisher/the-woocommerce-ucp-guide-what-our-monitoring-data-reveals-about-wordpress-agent-commerce-2439</link>
      <guid>https://forem.com/benjifisher/the-woocommerce-ucp-guide-what-our-monitoring-data-reveals-about-wordpress-agent-commerce-2439</guid>
      <description>&lt;p&gt;WooCommerce UCP adoption is in its very early stages. Our current monitoring dataset includes just 3 verified WooCommerce stores — a small fraction of the broader UCP ecosystem, where Shopify accounts for over 99% of verified merchants. Even with a limited dataset, the patterns we see are consistent with what you’d expect from WordPress-based infrastructure: more configuration complexity, more hosting variability, and more ways for things to silently break.&lt;/p&gt;

&lt;p&gt;WooCommerce powers somewhere between 25% and 30% of all e-commerce stores globally, and WordPress’s plugin ecosystem means a UCP implementation can ship as a drop-in extension without Automattic needing to build it into core. That’s exactly the path adoption has started to take — but it’s early, and the infrastructure complexity means getting it right requires more deliberate effort than on managed platforms.&lt;/p&gt;

&lt;p&gt;The picture is more complicated than Shopify. WooCommerce gives merchants complete control over their UCP implementation, which means more configuration flexibility — and far more ways to misconfigure it. This guide covers what we've learned monitoring WordPress-based stores: what you need to install and configure, what the manifests actually look like across our dataset, and what breaks in production agent sessions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdfp6htpnepvzg9d96usf.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdfp6htpnepvzg9d96usf.webp" alt="WooCommerce UCP Architecture — how AI agents connect through the WordPress plugin layer" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What WooCommerce Requires (vs. What Shopify Provides Natively)
&lt;/h2&gt;

&lt;p&gt;The first thing to understand about WooCommerce UCP is that nothing is automatic. Where Shopify generates and serves a UCP manifest the moment you install the Universal Commerce Agent app, WooCommerce requires a dedicated WordPress plugin that you install, configure, and maintain separately from your store.&lt;/p&gt;

&lt;p&gt;The plugin handles three things: serving the &lt;code&gt;/.well-known/ucp&lt;/code&gt; manifest file, registering a REST API endpoint that acts as your MCP transport, and exposing your WooCommerce product catalog, cart, and checkout flows as MCP tools.&lt;/p&gt;

&lt;p&gt;The most established option we've validated in our testing is &lt;a href="https://zologic.nl/ucpready/" rel="noopener noreferrer"&gt;UCPReady by Zologic&lt;/a&gt;, which handles manifest generation, MCP transport, and automatic capability detection.&lt;/p&gt;

&lt;p&gt;The installation process is straightforward — activate the plugin, generate your manifest keys, configure your capabilities. What catches merchants is everything after that: cache invalidation, security plugin whitelisting, PHP memory allocation, and making sure your REST API is actually accessible to external agents. Each of these is a WordPress infrastructure concern, not a WooCommerce one, which means the troubleshooting surface is larger than on managed platforms.&lt;/p&gt;

&lt;p&gt;There is also no equivalent to Shopify's automatic manifest updates when your payment stack changes. On WooCommerce, if you add a new payment gateway — WooCommerce supports over 100 via extensions — your manifest doesn't automatically reflect the change. You need to resync it manually or configure the plugin to auto-regenerate on gateway change. We flag stale payment handler declarations in our monitoring data, and WooCommerce stores — given the manual update requirement — are more prone to this issue than Shopify stores.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Manifest: What We See Across Our WooCommerce Dataset
&lt;/h2&gt;

&lt;p&gt;Your UCP manifest is the JSON document at &lt;code&gt;/.well-known/ucp&lt;/code&gt; that tells AI agents what your store supports and how to connect to it. On WooCommerce, this file is generated by the plugin and cached — how it is cached, and when that cache is invalidated, is one of the most consequential decisions in your setup.&lt;/p&gt;

&lt;p&gt;The first thing we check is whether the manifest is reachable at all. A common issue on WooCommerce stores is the manifest returning a 404 or a cached HTML error page instead of valid JSON. This almost always traces to a caching plugin that has cached the &lt;code&gt;/.well-known/&lt;/code&gt; path as a static HTML page, or a security plugin that blocks direct file access to that path. Both are fixable but require explicit configuration.&lt;/p&gt;

&lt;p&gt;The second is the &lt;strong&gt;protocol version&lt;/strong&gt;. WooCommerce UCP deployments show more version fragmentation than Shopify, because plugin updates are not as seamless as platform updates. We see a meaningful share of WooCommerce stores still on &lt;code&gt;2026-01-11&lt;/code&gt;, and a small number on pre-release configurations that declare non-standard version strings. Agents with strict version negotiation will refuse to interact with these stores entirely.&lt;/p&gt;

&lt;p&gt;Third is the &lt;strong&gt;capabilities array&lt;/strong&gt;. A properly configured WooCommerce store should declare &lt;code&gt;dev.ucp.shopping.checkout&lt;/code&gt;, &lt;code&gt;dev.ucp.shopping.discovery&lt;/code&gt;, and — if configured — &lt;code&gt;dev.ucp.shopping.discount&lt;/code&gt;. The discount capability is the most variable: WooCommerce handles discounts through a combination of coupon codes, cart rules, and extension-specific logic that doesn't always map cleanly to the UCP discount model. Many stores declare it in the manifest but the actual MCP tool implementation is incomplete.&lt;/p&gt;

&lt;p&gt;Fourth is the &lt;strong&gt;transports block&lt;/strong&gt;. WooCommerce stores declare MCP over the WordPress REST API, typically at a path like &lt;code&gt;/wp-json/ucp/v1/mcp&lt;/code&gt;. This is correct, but the REST API endpoint must be explicitly whitelisted in your security configuration. We see a significant share of WooCommerce stores where the manifest correctly declares the MCP transport but the endpoint itself returns a 401 or 403 for unauthenticated requests — which is what most agent clients send for initial tool discovery.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common Manifest Issues We Flag
&lt;/h3&gt;

&lt;p&gt;The most frequently flagged issues across our WooCommerce monitoring dataset: &lt;strong&gt;cached manifest serving stale content&lt;/strong&gt; (the manifest was generated before a configuration change and the cache has not been busted), &lt;strong&gt;payment handlers out of sync&lt;/strong&gt; (a gateway was added or removed without a manifest resync), &lt;strong&gt;REST API endpoint blocked&lt;/strong&gt; (a security plugin or WAF rule is returning a non-JSON response to agent requests), and &lt;strong&gt;capabilities declared but not implemented&lt;/strong&gt; (the discount tool is listed in the manifest but the endpoint returns an error when an agent calls it).&lt;/p&gt;

&lt;p&gt;None of these cause a hard failure on a basic manifest fetch. A checker that only validates whether the JSON is well-formed will pass these stores. Our checks simulate what an agent actually does — fetch the manifest, enumerate the tools, call the endpoint — which is why we catch issues that a simple validation pass misses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Runtime Performance: Hosting Matters Enormously
&lt;/h2&gt;

&lt;p&gt;This is the biggest difference between WooCommerce and Shopify from a performance standpoint: on Shopify, your store runs on Shopify's global infrastructure. On WooCommerce, your store runs on whatever you chose to host it on — and the performance range is enormous.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fze7xs0dz5xxbslp1j2mk.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fze7xs0dz5xxbslp1j2mk.webp" alt="WooCommerce MCP response times by hosting type — shared hosting vs VPS vs managed WordPress" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Across the WooCommerce stores in our dataset, MCP tool call response times ranged from 510ms to 1,593ms, with an average around 980ms — significantly slower than Shopify’s median of 146ms. Our sample is small, but this is consistent with what you’d expect from PHP-based self-hosted infrastructure. The spread in practice is likely much wider: well-configured managed WordPress hosts (WP Engine, Kinsta, Flywheel) can achieve sub-500ms response times, while stores on shared hosting with cold PHP processes can see latency well above 3 seconds.&lt;/p&gt;

&lt;p&gt;Most agent frameworks have configurable timeouts, typically defaulting between 5 and 10 seconds. A store that responds in 4 seconds most of the time will occasionally spike to 8+ seconds when the PHP process is cold or the server is under load — and those spikes cause agent session failures that look like UCP implementation errors rather than hosting issues. The manifest validates fine, but the store cannot complete a real session reliably.&lt;/p&gt;

&lt;p&gt;Specific hosting-related issues we flag frequently: &lt;strong&gt;PHP-FPM cold start latency&lt;/strong&gt; on servers where PHP processes idle between requests (common on lower-tier shared hosting); &lt;strong&gt;object cache not configured&lt;/strong&gt; (WooCommerce makes a large number of database queries per request — without Redis or Memcached, product catalog responses will be slow); and &lt;strong&gt;opcode cache absent&lt;/strong&gt; (WooCommerce's PHP footprint is substantial — OPcache is essential for acceptable performance and is missing on a surprising share of self-managed servers we monitor).&lt;/p&gt;

&lt;p&gt;If you are on shared hosting and considering WooCommerce UCP, the performance characteristics alone are likely to produce poor agent experiences. Managed WordPress hosting starts at around $25–35/month and typically delivers 5–10× better MCP response times than budget shared hosting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration Checklist
&lt;/h2&gt;

&lt;p&gt;Based on our monitoring data, here are the five configuration steps that separate WooCommerce stores that perform well in agent sessions from those that pass a manifest check but fail in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, install and fully configure the WooCommerce UCP plugin.&lt;/strong&gt; Do not stop at activation — complete the key generation step, review the capabilities configuration, and use the plugin's built-in test to verify the manifest and MCP endpoint are both returning valid responses. Partial configurations are the most common source of manifest issues we see in WooCommerce stores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, whitelist the UCP manifest and MCP endpoint in your caching and security plugins.&lt;/strong&gt; Add &lt;code&gt;/.well-known/ucp&lt;/code&gt; to your caching plugin's exclusion list — agents need the current version on every request, not a cached copy. Add your MCP REST API path to your security plugin's whitelist so it returns JSON, not a block page. This step is specific to WordPress and has no equivalent in managed platform setups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third, verify your store at &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;ucpchecker.com/check&lt;/a&gt;.&lt;/strong&gt; Run the check, but specifically look at whether the MCP endpoint is reachable and returning valid responses — not just whether the manifest JSON is well-formed. We check both, and MCP endpoint reachability failure is far more common on WooCommerce than on any other platform we monitor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fourth, configure a persistent object cache.&lt;/strong&gt; WooCommerce's database query load under agent traffic is significant — agents make tool calls in rapid succession, and without Redis or Memcached, each call triggers a full set of database queries. Most managed WordPress hosts include Redis as a one-click option; on self-managed servers, the Redis Object Cache plugin plus a running Redis server is the standard configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fifth, set up &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;UCP Alerts&lt;/a&gt;.&lt;/strong&gt; Plugin updates, security plugin config changes, and WordPress core updates can all affect your UCP configuration without any explicit notification. We have seen stores where a security plugin update changed the response format on the MCP endpoint and the merchant did not know for days. Alerts catch these changes the next time we check your store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plugin Compatibility: The WordPress Ecosystem Challenge
&lt;/h2&gt;

&lt;p&gt;WooCommerce's power comes from its plugin ecosystem — there are over 900 extensions on the WooCommerce Marketplace alone, plus thousands more on WordPress.org and third-party marketplaces. That ecosystem is also the primary source of UCP compatibility issues we see.&lt;/p&gt;

&lt;p&gt;The highest-risk category is &lt;strong&gt;security and firewall plugins&lt;/strong&gt;. Wordfence, iThemes Security, Sucuri, and similar plugins use aggressive bot-blocking rules that frequently misclassify AI agent requests. UCP agents typically identify themselves with specific user-agent strings; if your security plugin is configured to block non-browser user agents, it will block agent traffic before it ever reaches your UCP implementation. We see this as a 403 response on the MCP endpoint — the manifest is reachable, but actual agent sessions are blocked.&lt;/p&gt;

&lt;p&gt;The second category is &lt;strong&gt;caching plugins&lt;/strong&gt;. WP Super Cache, W3 Total Cache, WP Rocket, and LiteSpeed Cache all have different approaches to caching REST API responses. By default, some of them cache the MCP endpoint — which means agents receive a cached response from a previous session, including potentially stale cart or product data. Your MCP endpoint must return fresh responses on every request, which means explicitly excluding it from caching at both the plugin and server levels.&lt;/p&gt;

&lt;p&gt;Third is &lt;strong&gt;checkout customization plugins&lt;/strong&gt;. WooCommerce Checkout Field Editor, WooCommerce One Page Checkout, and similar plugins modify the checkout flow in ways the MCP checkout tool does not know about. A mandatory custom field that requires input before checkout can proceed will silently fail agent checkout attempts — the agent calls the checkout tool, server-side validation rejects it because the custom field is empty, and the response is an error the agent typically cannot resolve.&lt;/p&gt;

&lt;p&gt;Fourth, for merchants using &lt;strong&gt;multi-currency or multi-language plugins&lt;/strong&gt; (WPML, WooCommerce Multilingual, Currency Switcher), these add complexity with no equivalent on Shopify Markets. There is no standard way for a WooCommerce store to declare multi-currency support in its UCP manifest, which means agents accessing your store from different geographic contexts may get different pricing without the manifest indicating that variation exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Failure Modes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjx3cwmbxq05zwm373yxt.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjx3cwmbxq05zwm373yxt.webp" alt="Common WooCommerce UCP failure modes — cache conflicts, security blocks, PHP limits, REST API disabled" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Five failure patterns come up repeatedly across our WooCommerce monitoring data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caching plugin serving stale MCP responses.&lt;/strong&gt; An agent requests the tools list and receives a cached response from a previous session — one that might include products now out of stock, prices that have been updated, or a cart session belonging to a different user. This is the most WooCommerce-specific failure mode we see and it is entirely a configuration issue, not a UCP implementation problem. The fix is always the same: explicitly exclude your MCP endpoint path from caching at every level (plugin, server, CDN).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security plugin blocking agent user agents.&lt;/strong&gt; The agent makes a request to the MCP endpoint and receives a 403 or a redirect to a CAPTCHA page. From the manifest perspective, everything looks fine. From the agent's perspective, the store is inaccessible. We detect this during our endpoint reachability checks. The fix requires explicitly whitelisting UCP agent user-agent strings in your security plugin's bot management configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PHP memory exhaustion on large catalogs.&lt;/strong&gt; WooCommerce stores with large catalogs (10,000+ SKUs) frequently hit PHP memory limits when the MCP discovery tool attempts to enumerate products. The default PHP memory limit on many hosts is 256MB — inadequate for large WooCommerce queries under agent access patterns. We see this as timeouts or 500 errors on the discovery tool while other tools work fine. Setting &lt;code&gt;WP_MEMORY_LIMIT&lt;/code&gt; to 512M or higher and ensuring your PHP-FPM pool has sufficient memory allocation resolves it in most cases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Payment gateway plugin conflicts at checkout.&lt;/strong&gt; WooCommerce's checkout flow is highly extensible — and that extensibility means payment plugins can add hooks that interfere with the MCP checkout tool's assumptions about what happens at payment initiation. We have seen stores where a payment gateway plugin redirects to an external payment page the agent cannot follow, causing the session to terminate after cart completion but before payment. Test your specific gateway configuration explicitly with agent sessions before going live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Variable product variant ID instability.&lt;/strong&gt; On WooCommerce, variation IDs can change when products are edited, reimported, or synced from an external system like an ERP or inventory platform. Agents that cache a variation ID for a specific product configuration may find that ID invalid the next time they try to add it to a cart, because the variation was recreated with a new ID. For stores that use bulk product management or external sync tools, this is a persistent issue. SKU-based addressing where possible, and avoiding unnecessary variation recreation, significantly improve agent session reliability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product Feed Best Practices for WooCommerce
&lt;/h2&gt;

&lt;p&gt;WooCommerce product data quality is more variable than Shopify's because it is entirely merchant-managed. There is no platform-level enforcement of required fields, no structured data template, and no automatic format normalization. What agents see when they call the discovery tool depends entirely on how well your product catalog is maintained.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Variable products need complete, consistent attribute sets.&lt;/strong&gt; WooCommerce's variable product model lets you define any attributes you want as variation axes. But it does not enforce completeness. If some variations are missing attribute values — a color variation without a size, or a size variation with no price set — agents may discover the product but fail to add a specific variant to cart. Audit your variable products for incomplete variations before enabling UCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom fields require explicit plugin support.&lt;/strong&gt; Many WooCommerce stores use Advanced Custom Fields (ACF), Meta Box, or WooCommerce's own custom product tabs to store additional product data. By default, none of this data is exposed through the MCP discovery tool — the UCP plugin has to explicitly include it in the MCP product response. If your products have custom fields essential for purchasing decisions (technical specifications, compatibility matrices, bulk pricing tiers), verify your UCP plugin is configured to include them in discovery responses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set explicit currency on all prices.&lt;/strong&gt; WooCommerce's default product data model stores prices as raw numbers without currency. The currency is typically declared at the store level, but stores using multi-currency plugins may serve prices in different currencies for different contexts. Ensure your UCP plugin serializes prices with explicit currency codes — not just numeric values — in every product response. Agents guessing currency from context produce wrong price displays.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stock status must be accurate and real-time.&lt;/strong&gt; WooCommerce stock management is excellent when configured correctly, but many stores have products set to "In Stock" without managing actual inventory quantities. When an agent discovers a product, adds it to cart, and then hits an out-of-stock error at checkout, the session fails. Enable proper stock quantity management and ensure your stock sync — especially if you use a third-party inventory system — is near-real-time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SKUs should be present, stable, and unique.&lt;/strong&gt; WooCommerce SKUs are optional. Many stores, especially smaller ones, do not set them. But SKUs are the most reliable way for agents to reference specific products and variations across sessions — they are more stable than variation IDs and more portable than internal WooCommerce post IDs. Setting SKUs on all products and variations, and keeping them stable across product updates, is one of the highest-leverage improvements for agent session reliability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product descriptions should be agent-parseable.&lt;/strong&gt; WooCommerce product descriptions are free-form HTML — great for human-readable storefront pages, but problematic for agents. The short description field (the excerpt) is typically what MCP discovery tools expose as the primary product description. Keep it clean, text-based, and specific to what an agent needs to understand about the product. Avoid shortcodes, embedded tables, or JavaScript-dependent content in the short description.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured data for web-crawling agents.&lt;/strong&gt; Some agents discover products through web crawling before connecting via MCP. WooCommerce stores using Yoast WooCommerce SEO or Rank Math get reasonable &lt;code&gt;schema.org/Product&lt;/code&gt; markup automatically. Verify your storefront product pages include at minimum: name, description, price with currency, availability, brand, SKU, and image. This creates a secondary discovery path for agents that do not connect via MCP directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Coming
&lt;/h2&gt;

&lt;p&gt;Two developments in the WooCommerce UCP ecosystem are worth watching in 2026.&lt;/p&gt;

&lt;p&gt;The first is &lt;strong&gt;first-party plugin support from Automattic&lt;/strong&gt;. The current WooCommerce UCP implementation is third-party. As WooCommerce's UCP install base grows, there is meaningful pressure on Automattic to build UCP support directly into WooCommerce core or develop an official first-party plugin with automatic manifest updates on gateway and catalog changes. A first-party implementation would dramatically reduce the configuration burden and plugin compatibility surface we currently see across our monitoring dataset.&lt;/p&gt;

&lt;p&gt;The second is &lt;strong&gt;better persistent identity support&lt;/strong&gt; for logged-in WooCommerce customers. The current MCP authentication model does not leverage WordPress's native user session infrastructure well — most agent sessions are unauthenticated, which means agents cannot access customer-specific pricing, loyalty balances, or saved addresses. As the UCP spec's identity linking capability matures, WooCommerce stores with rich customer profiles stand to gain significantly from authenticated agent sessions that can personalize the shopping experience.&lt;/p&gt;

&lt;p&gt;We track WooCommerce adoption trends through our &lt;a href="https://ucpchecker.com/stats" rel="noopener noreferrer"&gt;stats dashboard&lt;/a&gt; and break down platform-by-platform analysis in the &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-2026" rel="noopener noreferrer"&gt;State of Agentic Commerce&lt;/a&gt; reports.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check Your Store
&lt;/h2&gt;

&lt;p&gt;If you are running a WooCommerce store and have not run a UCP check yet, &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;start here&lt;/a&gt;. The check takes about 30 seconds and covers both manifest validity and MCP endpoint reachability — the two most common failure points on WordPress-based stores.&lt;/p&gt;

&lt;p&gt;If you are already listed in our &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;directory&lt;/a&gt;, set up &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;UCP Alerts&lt;/a&gt; so you are notified when your configuration changes. A WordPress plugin update, security plugin tweak, or caching config change can silently break your UCP implementation. Alerts catch it before an agent session fails.&lt;/p&gt;

&lt;p&gt;And if you want to see exactly how AI agents experience your WooCommerce store — variant resolution, cart building, checkout completion — &lt;a href="https://ucpplayground.com/?utm_source=ucpchecker&amp;amp;utm_medium=blog&amp;amp;utm_campaign=woocommerce-guide" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt; runs real agent sessions against live stores. It is the fastest way to find the configuration issues that do not show up in manifest validation but break real transactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  References &amp;amp; Official Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://developer.woocommerce.com/2025/10/03/ai-agentic-commerce-in-woocommerce/" rel="noopener noreferrer"&gt;AI &amp;amp; Agentic Commerce in WooCommerce — Roadmap Insights&lt;/a&gt; — WooCommerce’s official agentic commerce vision&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.woocommerce.com/2025/10/22/woocommerce-10-3-cogs-comes-to-core-and-mcp-beta/" rel="noopener noreferrer"&gt;WooCommerce 10.3: MCP Beta Release&lt;/a&gt; — First official MCP integration for WooCommerce&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://woocommerce.com/feature-request/native-support-for-googles-universal-commerce-protocol-ucp-for-ai-agents/" rel="noopener noreferrer"&gt;Native UCP Support — WooCommerce Feature Request&lt;/a&gt; — Community request for built-in UCP&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.google/products/ads-commerce/agentic-commerce-ai-tools-protocol-retailers-platforms/" rel="noopener noreferrer"&gt;Google: New Tech and Tools for Retailers in an Agentic Shopping Era&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ucp.dev/" rel="noopener noreferrer"&gt;UCP Specification — ucp.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/first-autonomous-ai-agent-purchase-ucp" rel="noopener noreferrer"&gt;The First Fully Autonomous AI Agent Purchase Through UCP&lt;/a&gt; — completed on a WooCommerce store running the UCPReady plugin&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/ucp-identity-linking-agentic-commerce" rel="noopener noreferrer"&gt;UCP Now Supports Identity Linking&lt;/a&gt; — how authenticated agent sessions unlock customer-specific pricing and saved addresses&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-march-2026" rel="noopener noreferrer"&gt;The State of Agentic Commerce — March 2026&lt;/a&gt; — latest ecosystem data including WooCommerce adoption trends&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/why-we-built-ucp-playground" rel="noopener noreferrer"&gt;Why We Built UCP Playground&lt;/a&gt; — how we test WooCommerce stores end-to-end with real agent sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Related Platform Guides
&lt;/h2&gt;

&lt;p&gt;Exploring UCP across other platforms? These guides cover what we’ve learned about each platform’s implementation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ucpchecker.com/blog/shopify-ucp-guide-ai-agent-commerce" rel="noopener noreferrer"&gt;The Shopify UCP Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ucpchecker.com/blog/magento-adobe-commerce-ucp-guide-ai-agent-commerce" rel="noopener noreferrer"&gt;The Magento / Adobe Commerce UCP Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ucpchecker.com/blog/bigcommerce-ucp-guide-ai-agent-commerce" rel="noopener noreferrer"&gt;The BigCommerce UCP Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ecommerce</category>
      <category>api</category>
      <category>tutorial</category>
      <category>ucp</category>
    </item>
    <item>
      <title>The Shopify UCP Guide: What 3,200 Monitored Domains Taught Us About AI Agent Commerce</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Mon, 30 Mar 2026 21:56:59 +0000</pubDate>
      <link>https://forem.com/benjifisher/the-shopify-ucp-guide-what-3200-monitored-domains-taught-us-about-ai-agent-commerce-l5g</link>
      <guid>https://forem.com/benjifisher/the-shopify-ucp-guide-what-3200-monitored-domains-taught-us-about-ai-agent-commerce-l5g</guid>
      <description>&lt;p&gt;Shopify accounts for the overwhelming majority of UCP adoption. Of the 2,826 verified UCP merchants in our monitoring dataset, 2,812 — over 99.5% — are on Shopify.&lt;/p&gt;

&lt;p&gt;That's not a coincidence — Shopify co-developed the Universal Commerce Protocol with Google and shipped native UCP support before most platforms had even published a roadmap. But what surprised us as we grew our monitoring dataset past 3,200 domains was how significant the gap is between "technically passes" and "performs well for AI agents in production."&lt;/p&gt;

&lt;p&gt;This guide covers everything we've learned: what Shopify gives you out of the box, what you need to configure, what breaks under real agent traffic, and how to optimize your store for the agentic commerce era.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fse3qcoi8frlsp9wovrm2.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fse3qcoi8frlsp9wovrm2.webp" alt="Shopify UCP Architecture — how AI agents connect to your store via manifest discovery, MCP server, and Shopify infrastructure" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Shopify Provides Natively
&lt;/h2&gt;

&lt;p&gt;Shopify's UCP implementation is the most complete we've seen across any platform. When you enable UCP through the Universal Commerce Agent app in the Shopify App Store, the platform automatically generates and serves your &lt;code&gt;/.well-known/ucp&lt;/code&gt; manifest without any manual configuration required.&lt;/p&gt;

&lt;p&gt;Out of the box, a properly activated Shopify store exposes two stable UCP capabilities to AI agents: &lt;strong&gt;Checkout&lt;/strong&gt; (cart management and purchase completion) and &lt;strong&gt;Orders&lt;/strong&gt; (order status and history). Every verified Shopify store in our dataset exposes both. Catalog browsing is part of the UCP spec but is currently in draft status and not yet widely deployed.&lt;/p&gt;

&lt;p&gt;The platform also exposes your store catalog through the Agentic plan, which opens Shopify Catalog as a structured data source for agents that support it. This is separate from the MCP tool layer but increasingly relevant as agent frameworks develop richer product understanding capabilities.&lt;/p&gt;

&lt;p&gt;What this means practically: if you install the Universal Commerce Agent app and your store is otherwise functional, you'll likely pass a basic UCP check within minutes. The harder work is everything that comes after.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Manifest: What We See Across 3,200 Domains
&lt;/h2&gt;

&lt;p&gt;Your UCP manifest is a structured JSON document that tells AI agents what your store supports, how to communicate with it, and what constraints to respect. Shopify generates this automatically, but the contents vary significantly across stores — and the differences matter.&lt;/p&gt;

&lt;p&gt;The first thing we look at is the &lt;strong&gt;protocol version&lt;/strong&gt;. The current specification is &lt;code&gt;2026-01-23&lt;/code&gt;, and across our dataset, the vast majority of Shopify stores are already on this version. Shopify's app update mechanism keeps active stores current — though stores that have not updated the Universal Commerce Agent app in many months may occasionally fall behind. Agents implementing strict version negotiation may refuse to interact with outdated manifests.&lt;/p&gt;

&lt;p&gt;The second is the &lt;strong&gt;capabilities array&lt;/strong&gt;. A well-configured Shopify manifest should declare at minimum &lt;code&gt;dev.ucp.shopping.checkout&lt;/code&gt; and &lt;code&gt;dev.ucp.shopping.order&lt;/code&gt; — the two capabilities present on every verified Shopify store in our dataset. Stores that have partially configured their UCP setup sometimes declare fewer capabilities than they actually support, which causes agents to skip features the store is perfectly capable of handling.&lt;/p&gt;

&lt;p&gt;Third is the &lt;strong&gt;payment handlers&lt;/strong&gt; section, which reflects your actual payment stack. Shopify populates this automatically based on your enabled payment providers, but it can become stale if you add or remove payment methods without a full UCP re-sync. We see this most often on stores that recently switched from Shopify Payments to a third-party provider, or vice versa.&lt;/p&gt;

&lt;p&gt;Finally, the &lt;strong&gt;transports&lt;/strong&gt; declaration. Shopify stores declare MCP as the primary transport, which is correct. Problems arise when stores have custom middleware or proxy configurations that intercept requests before they reach the MCP handler — the manifest says MCP is available but the actual endpoint doesn't behave as expected.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common Manifest Issues We Flag
&lt;/h3&gt;

&lt;p&gt;Across our monitoring dataset, the most frequently flagged issues are: missing &lt;strong&gt;signing keys&lt;/strong&gt; (stores that enabled UCP before key rotation was standard and haven't re-synced), &lt;strong&gt;currency not declared&lt;/strong&gt; on stores using Shopify Markets (agents trying to price-compare across sessions can get inconsistent results), and &lt;strong&gt;stale capabilities&lt;/strong&gt; after payment provider changes (the manifest still lists a payment method that's no longer active).&lt;/p&gt;

&lt;p&gt;None of these will cause a hard failure on a basic UCP check — the manifest is technically valid. But they create subtle errors in production agent sessions that are difficult to diagnose without a monitor that tracks changes over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Runtime Performance: What Agents Actually Experience
&lt;/h2&gt;

&lt;p&gt;A manifest check tells you whether your store is configured correctly. What it can't tell you is how your store actually performs when an agent runs a real session — product discovery, cart building, variant resolution, checkout completion.&lt;/p&gt;

&lt;p&gt;Across our benchmark dataset, Shopify stores show response times between 102ms and 1,316ms for MCP tool calls, with a median of 146ms and a p95 of 205ms — fast enough for virtually any agent workflow. The rare outliers above 500ms are almost always explained by one of three things: geographic distance from the nearest Shopify edge node, heavy app stack adding middleware latency, or Shopify Markets adding an additional 200–400ms for cross-region requests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvm2qd5uylwnwpmhhr7m.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvm2qd5uylwnwpmhhr7m.webp" alt="Shopify MCP Response Time Distribution — bar chart showing standard stores vs Markets proxy latency across 3,200 domains" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tool availability is generally excellent on Shopify. When we run &lt;code&gt;tools/list&lt;/code&gt; against a properly configured store, we consistently see both core tools available. Compare that to custom UCP implementations on other platforms, where tool availability is frequently incomplete or inconsistently declared.&lt;/p&gt;

&lt;p&gt;Checkout completion rates are the highest we see on any platform — but they drop meaningfully on stores that have mandatory custom fields on the checkout page. Agents can handle standard Shopify checkout flows natively, but custom fields that require JavaScript interaction or are injected by third-party apps often break the automated flow. If your store has a mandatory gift message field or a custom loyalty ID input, test it explicitly with agent sessions.&lt;/p&gt;

&lt;p&gt;In our &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-2026" rel="noopener noreferrer"&gt;180-session benchmark&lt;/a&gt;, we ran sessions against Shopify stores using multiple agent models. Variant resolution was the most variable capability — the Llama 3.3 70B variant had notably lower success rates on stores with complex product option configurations (more than 3 option dimensions, or options that affect availability rather than just presentation).&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration Checklist
&lt;/h2&gt;

&lt;p&gt;Based on our monitoring data, here are the five steps that separate stores that perform well in agent sessions from stores that pass the basic check but struggle in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, enable UCP properly.&lt;/strong&gt; Install the Universal Commerce Agent app from the Shopify App Store and complete the full setup flow, including the key generation step. Partial installations are the single most common source of manifest issues we see.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, verify your manifest at &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;ucpchecker.com/check&lt;/a&gt;.&lt;/strong&gt; Run the check, review the capabilities and payment sections specifically, and confirm the protocol version matches the current specification. If you're on an older version, an app update is usually all it takes to fix it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third, review your &lt;code&gt;robots.txt&lt;/code&gt; and bot access configuration.&lt;/strong&gt; Shopify's default &lt;code&gt;robots.txt&lt;/code&gt; allows UCP agent traffic, but custom modifications can block it. If you've used a third-party SEO app to customize your &lt;code&gt;robots.txt&lt;/code&gt;, verify it isn't inadvertently blocking the user agents that UCP-compliant AI clients use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fourth, test with multiple agent models.&lt;/strong&gt; Don't assume that passing validation means all agents can complete transactions. Run sessions with at least two different agent implementations and specifically test variant-heavy products. Variant resolution failure is the most common production issue we see on otherwise well-configured stores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fifth, set up &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;UCP Alerts&lt;/a&gt;.&lt;/strong&gt; Your manifest can change silently — app updates, payment provider changes, and Shopify platform changes can all alter what your manifest declares. Alerts notify you when we detect a change in your manifest so you can investigate before agents encounter the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shopify Markets and Multi-Region Considerations
&lt;/h2&gt;

&lt;p&gt;Shopify Markets is the platform's native multi-currency, multi-region selling feature. It's excellent for human shoppers and increasingly common on the stores we monitor. It also introduces UCP-specific complexity that many merchants don't account for.&lt;/p&gt;

&lt;p&gt;The proxy layer that Markets uses to serve region-appropriate content adds 200–400ms of latency to MCP tool calls. For most agent workflows, this is acceptable. For agents running product discovery across dozens of stores in a single session, it compounds.&lt;/p&gt;

&lt;p&gt;More importantly, your manifest can vary by geographic context when Markets is active. An agent accessing your store from a US IP may see a different payment handlers section than one accessing from the EU, because your available payment methods differ by region. This isn't inherently wrong — it's expected behavior — but it means agents can't cache your manifest reliably across sessions from different origins.&lt;/p&gt;

&lt;p&gt;If you're using Markets, declare your primary currency explicitly in your UCP configuration even if Shopify auto-detects it. And ensure your store correctly handles the &lt;code&gt;country&lt;/code&gt; parameter in product and checkout requests — agents that pass explicit country context should get deterministic pricing, not a redirect to a region-detection flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Failure Modes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwis7zsd6t7cqg7fzefuz.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwis7zsd6t7cqg7fzefuz.webp" alt="Common Shopify UCP Failure Modes — app conflicts, variant resolution, draft product leaks, and redirect loops" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Four failure patterns come up repeatedly in our monitoring data, and they're all worth knowing before you go into production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App conflicts causing cart total mismatches.&lt;/strong&gt; Some Shopify apps modify cart calculations through hooks that don't propagate correctly to the MCP checkout tool. The most common manifestation: an agent successfully adds items to a cart and receives a subtotal, but when it initiates checkout, the total has changed because a discount or surcharge app modified it after the initial cart response. Agents that validate cart totals before confirming checkout will abort the transaction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Variant complexity exceeding agent resolution capability.&lt;/strong&gt; Products with more than three option dimensions, or options that combine to affect availability (a size that's only available in certain colors), frequently cause agents to fail at variant selection. The MCP tool returns the product correctly, but the agent can't determine which variant ID to use without rendering the full option matrix. Simplifying your product option structure — or providing explicit variant recommendations for your most common configurations — significantly improves agent success rates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Draft products appearing in MCP responses.&lt;/strong&gt; Shopify's catalog API and the MCP Discovery tool don't always apply the same product visibility filters. We've seen stores where draft products (not published to the storefront) appear in MCP product listings. Agents attempting to add these to a cart receive an error. Audit your product visibility settings if you maintain a large draft catalog.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Redirect loops for agents without location headers.&lt;/strong&gt; Some stores have geographic redirect logic that sends visitors without a detected location to a region-selection page. Agents that don't send standard location headers get caught in this loop — they follow the redirect, hit the same logic again, and either fail or get stuck. If you use geographic redirects, configure them to pass through to the default storefront for requests that carry a UCP agent identifier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product feed best practices
&lt;/h2&gt;

&lt;p&gt;When Shopify generates your UCP manifest and exposes your catalog through MCP tools, the quality of what agents see depends entirely on your product data. A clean manifest with dirty product data is worse than no UCP at all — agents will discover your store, attempt to shop, and fail.&lt;/p&gt;

&lt;p&gt;Here's what matters for agent-readable product feeds:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Titles must be variant-specific.&lt;/strong&gt; An agent searching for "blue cotton t-shirt size L" needs to match against a title that contains those attributes. If your product title is just "Classic Tee" with variants buried in option fields, agents have to make extra calls to resolve what they're looking at. Stores with descriptive, variant-aware titles see higher search-to-cart conversion in our agent sessions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set priceCurrency on every offer.&lt;/strong&gt; This is the single most common data quality issue we flag. Without explicit currency declarations, agents may display wrong currency symbols or attempt incorrect conversions. On multi-market Shopify stores, the product price changes by region — but if the feed doesn't declare which currency applies, the agent is guessing. Always set &lt;code&gt;priceCurrency&lt;/code&gt; in your product structured data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Images must have descriptive alt text.&lt;/strong&gt; Agents that support multimodal input use alt text to understand product images. "IMG_4521.jpg" tells an agent nothing. "Navy blue merino wool crew neck sweater — front view" tells it everything. This is standard accessibility practice that doubles as agent optimization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep variant data clean and consistent.&lt;/strong&gt; If your store has products with multiple option axes (color × size × material), each variant needs a unique, resolvable ID. We've seen stores where variant IDs change after inventory syncs, breaking any agent that cached a previous variant reference. Stable variant IDs are essential for reliable add-to-cart flows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't expose draft or out-of-stock products.&lt;/strong&gt; Your MCP-facing catalog should match your public storefront. If an agent finds a product through search, adds it to cart, and then gets an "unavailable" error at checkout, that's a failed session. Check that your product visibility settings apply consistently to both the storefront and the MCP server. In our monitoring, we've flagged stores where the MCP endpoint returns 10-15% more products than the public catalog — those are ghost products that agents can discover but buyers can't purchase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured data matters beyond the manifest.&lt;/strong&gt; Shopify merchants using Schema.org Product markup on their storefront pages help agents that discover products through web crawling (not just MCP). The markup should include: product name, description, price with currency, availability status, brand, SKU, and image URLs. This creates a second discovery path for agents that crawl the web before connecting via MCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update frequency.&lt;/strong&gt; Stale feeds cause stale agent experiences. If you run flash sales, seasonal pricing, or frequent inventory changes, your product feed needs to reflect those changes in near-real-time. Shopify's native UCP integration handles most of this automatically, but custom feeds or third-party sync tools can introduce lag. Our daily monitoring catches when a manifest's product data drifts from what's actually available on the storefront.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Coming
&lt;/h2&gt;

&lt;p&gt;Two capabilities currently in draft status will be significant for Shopify merchants when they ship: &lt;strong&gt;Cart&lt;/strong&gt; as a persistent, shareable construct (enabling agents to hand off a pre-filled cart to a human for completion), and &lt;strong&gt;Catalog&lt;/strong&gt; as a richer product data access layer (giving agents structured access to inventory, pricing tiers, and product relationships without relying on search).&lt;/p&gt;

&lt;p&gt;Shopify's existing OAuth infrastructure puts it in a strong position for &lt;strong&gt;identity linking&lt;/strong&gt; — the ability for agents to authenticate as a known customer and access loyalty points, saved addresses, and purchase history. This is the capability most likely to drive meaningful conversion improvements for returning customers.&lt;/p&gt;

&lt;p&gt;We track adoption of emerging capabilities through our &lt;a href="https://ucpchecker.com/stats" rel="noopener noreferrer"&gt;stats dashboard&lt;/a&gt; and publish deeper analysis in the &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-2026" rel="noopener noreferrer"&gt;State of Agentic Commerce&lt;/a&gt; reports. If you want to understand where the ecosystem is heading, those are the places to watch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check Your Store
&lt;/h2&gt;

&lt;p&gt;If you're running a Shopify store and haven't run a UCP check yet, &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;start there&lt;/a&gt;. The check takes about 30 seconds and will tell you whether your manifest is correctly configured and up to date.&lt;/p&gt;

&lt;p&gt;If you're already in our directory, set up &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;UCP Alerts&lt;/a&gt; so you're notified when your manifest changes. Silent regressions — the kind that only show up when an agent fails to complete a transaction — are the hardest to catch without monitoring.&lt;/p&gt;

&lt;p&gt;And if you want to see how AI agents actually experience your store, &lt;a href="https://ucpplayground.com/?utm_source=ucpchecker&amp;amp;utm_medium=blog&amp;amp;utm_campaign=shopify-guide" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt; lets you run real agent sessions against live stores. It's the fastest way to find the variant resolution and checkout completion issues that don't show up in manifest validation.&lt;/p&gt;

&lt;h2&gt;
  
  
  References &amp;amp; Official Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.shopify.com/news/ai-commerce-at-scale" rel="noopener noreferrer"&gt;Shopify: The Agentic Commerce Platform&lt;/a&gt; — Shopify’s announcement connecting merchants to every AI conversation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://shopify.engineering/ucp" rel="noopener noreferrer"&gt;Building the Universal Commerce Protocol — Shopify Engineering&lt;/a&gt; — Technical deep-dive into how UCP was built&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.shopify.com/news/winter-26-edition-agentic-storefronts" rel="noopener noreferrer"&gt;Introducing Shopify Agentic Storefronts&lt;/a&gt; — Sell products everywhere AI conversations happen&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.google/products/ads-commerce/agentic-commerce-ai-tools-protocol-retailers-platforms/" rel="noopener noreferrer"&gt;Google: New Tech and Tools for Retailers in an Agentic Shopping Era&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.googleblog.com/under-the-hood-universal-commerce-protocol-ucp/" rel="noopener noreferrer"&gt;Under the Hood: Universal Commerce Protocol — Google Developers Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ucp.dev/" rel="noopener noreferrer"&gt;UCP Specification — ucp.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/first-autonomous-ai-agent-purchase-ucp" rel="noopener noreferrer"&gt;The First Fully Autonomous AI Agent Purchase Through UCP&lt;/a&gt; — an AI agent completed an end-to-end purchase on a live store, from identity linking to wallet payment&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/ucp-identity-linking-agentic-commerce" rel="noopener noreferrer"&gt;UCP Now Supports Identity Linking&lt;/a&gt; — how OAuth-based identity changes the checkout experience for returning customers&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-march-2026" rel="noopener noreferrer"&gt;The State of Agentic Commerce — March 2026&lt;/a&gt; — latest ecosystem data across 3,000+ monitored domains&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/how-a-browser-extension-became-our-biggest-discovery-engine" rel="noopener noreferrer"&gt;How a Browser Extension Became Our Biggest Discovery Engine&lt;/a&gt; — how we discover and monitor Shopify stores at scale&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Related Platform Guides
&lt;/h2&gt;

&lt;p&gt;Exploring UCP across other platforms? These guides cover what we’ve learned about each platform’s implementation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ucpchecker.com/blog/woocommerce-ucp-guide-ai-agent-commerce" rel="noopener noreferrer"&gt;The WooCommerce UCP Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ucpchecker.com/blog/magento-adobe-commerce-ucp-guide-ai-agent-commerce" rel="noopener noreferrer"&gt;The Magento / Adobe Commerce UCP Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ucpchecker.com/blog/bigcommerce-ucp-guide-ai-agent-commerce" rel="noopener noreferrer"&gt;The BigCommerce UCP Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>We Built OAuth Identity Linking Into Our AI Agent Commerce Playground — Here's How the Protocol Actually Works</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Sat, 21 Mar 2026 13:12:59 +0000</pubDate>
      <link>https://forem.com/benjifisher/we-built-oauth-identity-linking-into-our-ai-agent-commerce-playground-heres-how-the-protocol-10k7</link>
      <guid>https://forem.com/benjifisher/we-built-oauth-identity-linking-into-our-ai-agent-commerce-playground-heres-how-the-protocol-10k7</guid>
      <description>&lt;p&gt;In our &lt;a href="https://dev.to/benjifisher/we-ran-180-ai-agent-shopping-sessions-across-11-models-and-20-stores-heres-what-we-found-2884"&gt;last post&lt;/a&gt;, we ran 180 AI agent shopping sessions across 11 models and 20 live stores. Every single session was anonymous. The agent connected, searched the catalog, built a cart, reached checkout — and the merchant had no idea who the buyer was.&lt;/p&gt;

&lt;p&gt;That's fine for product discovery. It's a dead end for real commerce.&lt;/p&gt;

&lt;p&gt;Without identity, there's no loyalty pricing. No saved addresses. No order history. No way to say "ship it to the same place as last time." The agent collects buyer info from scratch every session — name, email, phone, shipping address — adding 4-5 messages before checkout can even start. In our 180-session dataset, that friction was consistent across every model and every store.&lt;/p&gt;

&lt;p&gt;So we built identity linking into &lt;a href="https://ucpplayground.com/" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What changed in the spec&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On March 18, a breaking change landed in the &lt;a href="https://github.com/Universal-Commerce-Protocol/ucp" rel="noopener noreferrer"&gt;UCP repository&lt;/a&gt;: &lt;code&gt;feat!: redesign identity linking with mechanism registry and capability-driven scopes&lt;/code&gt;. Identity linking — &lt;code&gt;dev.ucp.common.identity_linking&lt;/code&gt; — is now one of four core capabilities in the UCP spec, alongside Checkout, Order, and Payment Token Exchange.&lt;/p&gt;

&lt;p&gt;Two concepts from this redesign matter for anyone building against UCP:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mechanism registry&lt;/strong&gt;. Merchants declare which authentication mechanisms they support in a structured registry within their UCP manifest. The registry pattern supports multiple mechanisms and can evolve without breaking existing implementations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capability-driven scopes&lt;/strong&gt;. OAuth scopes are no longer static. A merchant might require one set of scopes for catalog access and a different set for checkout. The agent negotiates what it needs based on the capabilities it wants to use. An agent that only browses the catalog doesn't get checkout permissions. Least-privilege, applied to commerce.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What we built&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We implemented the full OAuth 2.0 Authorization Code flow with PKCE in UCP Playground. Here's what the architecture looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffsb5zgq5htyevb7saaw1.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffsb5zgq5htyevb7saaw1.webp" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;UCP Identity Linking — OAuth 2.0 PKCE Flow&lt;br&gt;
Five steps, three actors. The agent never sees user credentials. The human stays in the loop at the consent step. Here's how each piece works in practice:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Discovery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you point the playground at a merchant domain, we read the UCP manifest. If it declares &lt;code&gt;dev.ucp.common.identity_linking&lt;/code&gt; and includes OAuth endpoints — authorization URL, token URL, and optionally a client registration URL — we light up the identity flow.&lt;/p&gt;

&lt;p&gt;This is the same manifest we're already parsing for checkout and catalog capabilities. Identity linking is just another capability declaration, which means the discovery infrastructure we built for our &lt;a href="https://dev.to/benjifisher/we-monitored-2000-ucp-manifests-every-day-for-a-month-heres-what-breaks-4cj9"&gt;2,000-manifest monitoring&lt;/a&gt; works here too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Dynamic client registration (RFC 7591)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was the first surprise. The spec supports &lt;a href="https://datatracker.ietf.org/doc/html/rfc7591" rel="noopener noreferrer"&gt;RFC 7591&lt;/a&gt; dynamic client registration. Instead of manually registering an OAuth app at every merchant — which doesn't scale when you're testing against 20+ stores — the agent sends a registration request and gets client credentials back automatically.&lt;/p&gt;

&lt;p&gt;In our &lt;code&gt;IdentityLinkingService&lt;/code&gt;, this is a single POST:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Http&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$registrationUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'client_name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'UCP Playground'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'redirect_uris'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$callbackUrl&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s1"&gt;'grant_types'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'authorization_code'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s1"&gt;'response_types'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'code'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s1"&gt;'token_endpoint_auth_method'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'none'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// public client&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We cache the registration per merchant so subsequent sessions reuse the same client credentials. No developer portal visits. No API key management. The protocol handles it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. PKCE authorization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PKCE (Proof Key for Code Exchange) prevents authorization code interception. We generate a random code verifier, hash it to create a challenge, and send the challenge with the authorization request. When we exchange the code for tokens later, we prove we're the same client by presenting the original verifier.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$verifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Str&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$challenge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;rtrim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;strtr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nb"&gt;base64_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'sha256'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$verifier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="s1"&gt;'+/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'-_'&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;'='&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The user sees the merchant's consent screen — what permissions are being requested, what data will be shared. The agent can't bypass this. This is the critical trust boundary: the human explicitly approves what the agent can do on their behalf.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Token exchange&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After consent, the merchant redirects back with an authorization code. We exchange it server-side with the PKCE verifier to prove the code belongs to us. Back comes an access token and a refresh token.&lt;/p&gt;

&lt;p&gt;We built an &lt;code&gt;OAuthTokenManager&lt;/code&gt; that handles refresh automatically. When a token expires mid-session, the manager swaps it transparently so the agent flow doesn't break. In practice, this means a user can link their identity once and the agent maintains the connection across multiple interactions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Profile resolution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With a valid token, we call the merchant's profile endpoint. Back comes the buyer's identity — name, email, phone, shipping address. This is what flows into checkout instead of the manual 4-5 message collection.&lt;/p&gt;

&lt;p&gt;One thing we learned building this: profile response formats vary across merchants. Some return flat JSON, some nest address fields, some use different key names for the same data. Our &lt;code&gt;IdentityLinkingService&lt;/code&gt; normalizes across formats so the agent always gets a consistent buyer profile regardless of the merchant's implementation.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What we learned&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building this end-to-end surfaced a few things that aren't obvious from reading the spec:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dynamic client registration is the unlock&lt;/strong&gt;. Without RFC 7591, every platform building agent commerce would need to manually register OAuth apps at every merchant. That's the same integration bottleneck UCP was designed to eliminate. Dynamic registration makes the whole flow self-bootstrapping.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PKCE is non-negotiable&lt;/strong&gt;. The spec requires it, and rightly so. Agents are effectively public clients — they can't securely store a client secret. PKCE ensures the authorization code can only be exchanged by the client that initiated the flow. Standard security practice, but it's good to see it baked into the spec rather than left as optional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capability-driven scopes add real complexity&lt;/strong&gt;. Static scopes are straightforward — you request a list and you're done. Capability-driven scopes mean the agent needs to understand what capabilities it wants to use before requesting authorization. We built scope negotiation into the authorization step, but this is an area where fragmentation could emerge as different merchants define different scope mappings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Profile normalization is unglamorous but essential&lt;/strong&gt;. Every merchant returns buyer data slightly differently. If you don't normalize at the protocol layer, every agent has to handle format differences. We centralized this in one service, but the spec could benefit from stricter response format requirements.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The impact on agent sessions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the practical difference. In our anonymous shopping sessions, the checkout flow looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent: I'd like to check out. What information do you need?
[Merchant requests: email, name, shipping address, phone]
Agent: What's your email?
User: user@example.com
Agent: Shipping address?
User: 123 Main St...
Agent: Phone number?
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four to five back-and-forth messages before the cart even moves toward payment. With identity linking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent: [resolves buyer profile via OAuth token]
Agent: Ready to check out with your saved details. Proceed?
User: Yes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero friction. The agent already knows who you are and where to ship. It's the difference between an agent shopping for you and an agent shopping as you.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Where adoption stands&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We monitor 3,000+ domains through &lt;a href="https://ucpchecker.com/" rel="noopener noreferrer"&gt;UCP Checker&lt;/a&gt;. Identity linking is starting to appear in merchant manifests, but most implementations are still at the declaration stage — merchants list the capability without fully wiring up the OAuth flow behind it.&lt;/p&gt;

&lt;p&gt;In our audit system, identity linking earns 2 points in the manifest capability score. If a merchant declares it but their runtime tools don't support buyer identity fields, we flag it as a gap. We're scoring declaration today; runtime probing of OAuth endpoints is on our roadmap.&lt;/p&gt;

&lt;p&gt;The infrastructure is ready on the platform side. We're waiting for merchants to plug in.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What to watch&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Merchant adoption&lt;/strong&gt;. Platforms like Shopify already run extensive OAuth infrastructure for their app ecosystem. Extending it to UCP identity linking is a natural step. Custom platform developers building against the spec will likely move faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scope standardization&lt;/strong&gt;. The capability-driven scopes model is powerful but new. As more merchants implement it, patterns will emerge. Early standardization prevents fragmentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The mechanism registry evolving&lt;/strong&gt;. OAuth 2.0 is the starting point, but the registry is designed for more. Passkeys, verifiable credentials, federated identity — the architecture is there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check your domain:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;ucpchecker.com/check&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Test the full flow:&lt;/strong&gt; &lt;a href="https://ucpplayground.com" rel="noopener noreferrer"&gt;ucpplayground.com&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Read the spec:&lt;/strong&gt; &lt;a href="https://github.com/Universal-Commerce-Protocol/ucp" rel="noopener noreferrer"&gt;github.com/Universal-Commerce-Protocol/ucp&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Follow the data:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/blog" rel="noopener noreferrer"&gt;ucpchecker.com/blog&lt;/a&gt;&lt;/p&gt;

</description>
      <category>oauth</category>
      <category>ai</category>
      <category>webdev</category>
      <category>ucp</category>
    </item>
  </channel>
</rss>
