<?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>DEV Community: Peter</title>
    <description>The latest articles on DEV Community by Peter (@ucptools).</description>
    <link>https://dev.to/ucptools</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%2F3737432%2F036b6d50-5faf-4939-ac76-c7f56e7a6382.jpeg</url>
      <title>DEV Community: Peter</title>
      <link>https://dev.to/ucptools</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ucptools"/>
    <language>en</language>
    <item>
      <title>Build a UCP Watchdog: Catch the Production Breaks Your CI Never Will</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Fri, 05 Jun 2026 14:50:32 +0000</pubDate>
      <link>https://dev.to/ucptools/build-a-ucp-watchdog-catch-the-production-breaks-your-ci-never-will-18jh</link>
      <guid>https://dev.to/ucptools/build-a-ucp-watchdog-catch-the-production-breaks-your-ci-never-will-18jh</guid>
      <description>&lt;p&gt;You wired UCP validation into CI. Every push runs the checks, every PR gets a score, and a bad profile fails the build before it merges. Good - that is the right baseline.&lt;/p&gt;

&lt;p&gt;Here is what it does not catch: the break that happens when nobody touches the code.&lt;/p&gt;

&lt;p&gt;The standard here is UCP (Universal Commerce Protocol) - an open standard that gives AI shopping agents a machine-readable entry point to a store at &lt;code&gt;/.well-known/ucp&lt;/code&gt;. &lt;em&gt;(Quick disclaimer: UCP is owned and maintained by Google and Shopify. UCPtools, which I work on, is an independent community tool - not affiliated with either.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A CI gate is triggered by &lt;em&gt;your&lt;/em&gt; commits. But a UCP profile is a live production surface, and most of the things that break it are not commits at all:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;TLS certificate renews&lt;/strong&gt; and propagates to your origin but not to every CDN edge.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;capability schema host&lt;/strong&gt; your profile references goes down - someone else's outage, your broken profile.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;CDN or DNS change&lt;/strong&gt; starts serving a cache page or a redirect at &lt;code&gt;/.well-known/ucp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Your &lt;strong&gt;platform&lt;/strong&gt; (Shopify, BigCommerce, a WooCommerce plugin update) quietly changes the served manifest or strips the &lt;code&gt;Content-Type: application/json&lt;/code&gt; header.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;signing key rotates&lt;/strong&gt; in your infra but not in the published profile.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these trips a build, because there is no build. Your CI is green. Your store works fine for human browsers. The only thing that regressed is the machine-readable layer that no human ever visits - and the AI agent that hits it does not file a bug. It just leaves for the next merchant whose profile answers.&lt;/p&gt;

&lt;p&gt;CI catches what you break on merge. A watchdog catches what breaks itself. You need both.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a Watchdog Actually Watches
&lt;/h2&gt;

&lt;p&gt;A pre-merge gate asks "is the profile I'm about to ship valid?" A watchdog asks a different question on a schedule: "is the profile that is live &lt;em&gt;right now&lt;/em&gt; still valid, from outside, the way an agent sees it?"&lt;/p&gt;

&lt;p&gt;Two design rules make the difference:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check from outside your network.&lt;/strong&gt; A check that runs inside your own infra can hit a warm cache or an internal route and report healthy while external agents get errors. Fetch your public URL over the public internet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare against a baseline, not just against pass/fail.&lt;/strong&gt; A profile can stay technically valid while its score quietly slides from A to C. Alert on regression from a known-good baseline, not only on hard failures.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's build it two ways: a dependency-free cron version, and a GitHub Action with Slack alerts.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 10-Line Version: cron + curl
&lt;/h2&gt;

&lt;p&gt;UCPtools exposes a public remote-validation endpoint that fetches a live domain's profile and runs the checks server-side. You can hit it from anything that runs &lt;code&gt;curl&lt;/code&gt; and &lt;code&gt;jq&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="c"&gt;# ucp-watch.sh - alert if the live UCP profile is broken&lt;/span&gt;
&lt;span class="nv"&gt;DOMAIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"mystore.com"&lt;/span&gt;

&lt;span class="nv"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://ucptools.dev/v1/profiles/validate-remote &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;domain&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;}"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$resp&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;     | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.ok'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$resp&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'[.issues[] | select(.severity=="error")] | length'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ok&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$errors&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-gt&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nv"&gt;codes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$resp&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'[.issues[] | select(.severity=="error") | .code] | join(", ")'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SLACK_WEBHOOK_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:rotating_light: UCP profile for &lt;/span&gt;&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt;&lt;span class="s2"&gt; is broken: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;codes&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;}"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The endpoint returns the live result, shaped like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"profile_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mystore.com/.well-known/ucp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"issues"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"UCP_SCHEMA_FETCH_FAILED"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$.ucp.capabilities[0]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"hint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"validated_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-05T14:33:57Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Schedule it and you have a watchdog:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*/15 * * * * SLACK_WEBHOOK_URL=https://hooks.slack.com/... /opt/ucp-watch.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now &lt;code&gt;UCP_SCHEMA_FETCH_FAILED&lt;/code&gt; or &lt;code&gt;UCP_ENDPOINT_NOT_HTTPS&lt;/code&gt; showing up at 3am - hours after a cert renewal, with no deploy in sight - pages you instead of silently costing you agent traffic.&lt;/p&gt;




&lt;h2&gt;
  
  
  The GitHub Action Version: scheduled, with a baseline
&lt;/h2&gt;

&lt;p&gt;If your store already lives in GitHub, you can run the same idea on a &lt;code&gt;schedule:&lt;/code&gt; trigger and reuse the existing &lt;a href="https://github.com/Nolpak14/ucp-validate-action" rel="noopener noreferrer"&gt;&lt;code&gt;ucp-validate-action&lt;/code&gt;&lt;/a&gt; - the same action people put in CI - but pointed at your &lt;strong&gt;live production domain&lt;/strong&gt; and run on a clock instead of on push. The difference is entirely in the trigger and what you do with the result.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;UCP Watchdog&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;*/30&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*'&lt;/span&gt;   &lt;span class="c1"&gt;# every 30 minutes&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;          &lt;span class="c1"&gt;# let me run it by hand too&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;watch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ucp&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Nolpak14/ucp-validate-action@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mystore.com'&lt;/span&gt;   &lt;span class="c1"&gt;# your LIVE domain, not staging&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Alert on regression&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;SLACK_WEBHOOK_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SLACK_WEBHOOK_URL }}&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;score="${{ steps.ucp.outputs.score }}"&lt;/span&gt;
          &lt;span class="s"&gt;grade="${{ steps.ucp.outputs.grade }}"&lt;/span&gt;
          &lt;span class="s"&gt;found="${{ steps.ucp.outputs.ucp-found }}"&lt;/span&gt;
          &lt;span class="s"&gt;baseline=$(cat .ucp-baseline 2&amp;gt;/dev/null || echo 0)&lt;/span&gt;

          &lt;span class="s"&gt;echo "Live: score=$score grade=$grade found=$found | baseline=$baseline"&lt;/span&gt;

          &lt;span class="s"&gt;if [ "$found" = "false" ] || [ "$score" -lt "$baseline" ]; then&lt;/span&gt;
            &lt;span class="s"&gt;curl -sS -X POST "$SLACK_WEBHOOK_URL" -H 'Content-type: application/json' \&lt;/span&gt;
              &lt;span class="s"&gt;-d "{\"text\":\":rotating_light: UCP regression on mystore.com - score ${score} (grade ${grade}), baseline ${baseline}\"}"&lt;/span&gt;
            &lt;span class="s"&gt;exit 1&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commit a one-line baseline file the first time you go green:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo &lt;/span&gt;90 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .ucp-baseline   &lt;span class="c"&gt;# your known-good score&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The action exposes &lt;code&gt;score&lt;/code&gt;, &lt;code&gt;grade&lt;/code&gt;, &lt;code&gt;ucp-found&lt;/code&gt;, &lt;code&gt;passed&lt;/code&gt;, and &lt;code&gt;result-json&lt;/code&gt;, so you can build whatever alerting logic you want on top. The point is that the trigger is a clock, the target is production, and the comparison is against your last known-good state.&lt;/p&gt;




&lt;h2&gt;
  
  
  Alert Hygiene (so you don't train yourself to ignore it)
&lt;/h2&gt;

&lt;p&gt;A watchdog that cries wolf gets muted, and a muted watchdog is worse than none. Three things keep it honest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Baseline, don't just pass/fail.&lt;/strong&gt; A slow slide from grade A to grade C is the regression you most want to know about, and a binary "still valid?" check will miss it entirely. Diff the score.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debounce flaps.&lt;/strong&gt; A single failed fetch can be a transient network blip. Require two consecutive bad checks before paging, or alert on a sustained drop rather than one data point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bump the baseline when you improve.&lt;/strong&gt; When you legitimately raise your score, update &lt;code&gt;.ucp-baseline&lt;/code&gt; in the same PR. The baseline is a ratchet - it should only move up on purpose.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Platform Notes
&lt;/h2&gt;

&lt;p&gt;The watchdog is platform-agnostic - it reads the open &lt;code&gt;/.well-known/ucp&lt;/code&gt; standard, not platform internals - but the regression that pages you tends to differ by stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WooCommerce:&lt;/strong&gt; a caching or security plugin update that starts serving &lt;code&gt;/.well-known/ucp&lt;/code&gt; from cache, behind a challenge, or as &lt;code&gt;text/html&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BigCommerce / headless:&lt;/strong&gt; a frontend deploy or app change that moves an endpoint the profile still advertises, or a storefront-scope mismatch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shopify:&lt;/strong&gt; the platform changing what it serves at the well-known path out from under you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In every case the failure is invisible until something fetches the live profile from outside and compares it to what you expect. That is the whole job of the watchdog.&lt;/p&gt;




&lt;p&gt;CI proves the profile you wrote is correct. A watchdog proves the profile your customers' agents actually hit is still correct - at 3am, after a cert renewal, when no one shipped a thing. Both are a few lines of YAML. The merchants who win the agentic-commerce transition will treat the second one like uptime, because that is exactly what it is.&lt;/p&gt;

&lt;p&gt;If you would rather not run your own, UCPtools does hosted monitoring with break-alerts across all four validation levels - &lt;a href="https://ucptools.dev/signup" rel="noopener noreferrer"&gt;start here&lt;/a&gt;. Either way: watch the live profile, not just the build.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;UCP is an open standard by Google and Shopify. UCPtools is an independent community tool.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Built by Peter at &lt;a href="https://ucptools.dev" rel="noopener noreferrer"&gt;UCPtools&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>githubactions</category>
      <category>devops</category>
      <category>ecommerce</category>
      <category>ai</category>
    </item>
    <item>
      <title>How AI Shopping Agents Read Your Magento Store (and 4 UCP Checks That Fail in Production)</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Thu, 21 May 2026 15:52:52 +0000</pubDate>
      <link>https://dev.to/ucptools/how-ai-shopping-agents-read-your-magento-store-and-4-ucp-checks-that-fail-in-production-1lkj</link>
      <guid>https://dev.to/ucptools/how-ai-shopping-agents-read-your-magento-store-and-4-ucp-checks-that-fail-in-production-1lkj</guid>
      <description>&lt;p&gt;If you run a Magento or Adobe Commerce store, you have probably started getting the question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can ChatGPT or Google's AI find my products? Are we 'AI-ready'?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The standard that answers it is UCP (Universal Commerce Protocol) - an open standard from Google and Shopify that gives AI shopping agents a machine-readable entry point to a store, served at &lt;code&gt;/.well-known/ucp&lt;/code&gt;. &lt;em&gt;(Quick disclaimer: UCP is owned and maintained by Google and Shopify. UCPtools, which I work on, is an independent community tool - not affiliated with either.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here is the catch for Magento specifically: a UCP profile that validates perfectly on your laptop can still be broken for every real AI agent in production. Magento's enterprise stack - GraphQL plus REST, Varnish full-page cache, multi-store scopes, CDN edges - breaks UCP discovery in ways a single-tenant Shopify store simply never encounters.&lt;/p&gt;

&lt;p&gt;This post walks through the four levels of UCP validation and, for each, the Magento-specific failure mode that bites in production.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Magento Is a Different Animal
&lt;/h2&gt;

&lt;p&gt;On Shopify, the platform owns the edge. Your UCP surface is largely handled for you and the failure modes are narrow.&lt;/p&gt;

&lt;p&gt;On Magento/Adobe Commerce, &lt;em&gt;you&lt;/em&gt; own the edge - and that is exactly where UCP lives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/.well-known/ucp&lt;/code&gt; is a static-looking path served by a very dynamic system.&lt;/strong&gt; Varnish, Fastly, or your CDN decides whether agents see a fresh profile or a stale one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two API surfaces.&lt;/strong&gt; Magento exposes both GraphQL and REST. A UCP profile that points agents at endpoints has to point at ones that actually answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple store views and websites.&lt;/strong&gt; A profile bound to the wrong scope describes the wrong catalog, currency, or domain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-managed TLS and CDN.&lt;/strong&gt; Certificate renewals and cache propagation are your problem, and agents are unforgiving about both.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;UCP validation is not a one-time setup step here. It is a production concern, like uptime.&lt;/p&gt;




&lt;h2&gt;
  
  
  Level 1: Structural - Does the Profile Parse?
&lt;/h2&gt;

&lt;p&gt;The first level is the cheap one: is &lt;code&gt;/.well-known/ucp&lt;/code&gt; valid JSON, are the required fields present, and is the version string a valid &lt;code&gt;YYYY-MM-DD&lt;/code&gt; date?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Magento failure mode: Varnish serves HTML, not JSON.&lt;/strong&gt; The single most common Magento issue is that the full-page cache or a misconfigured rewrite intercepts &lt;code&gt;/.well-known/ucp&lt;/code&gt; and returns an HTML error page (or the homepage) with a &lt;code&gt;200&lt;/code&gt;. Structurally, an agent receives HTML where it expected JSON, and discovery dies at step one.&lt;/p&gt;

&lt;p&gt;The fix is a cache-bypass rule for the &lt;code&gt;.well-known&lt;/code&gt; path. If you are on Varnish, exclude it from the full-page cache so the profile is always served fresh and as &lt;code&gt;application/json&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Level 2: Rules - Is the Profile Internally Consistent?
&lt;/h2&gt;

&lt;p&gt;Structural validity is not compliance. Level 2 checks the UCP rules: namespace and origin binding, extension chains, HTTPS-only endpoints, and the presence of signing keys.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Magento failure mode: origin/scope mismatch.&lt;/strong&gt; Multi-store Magento installs serve several domains and store views from one backend. It is easy to publish a profile whose declared origin does not match the host actually serving it, or whose capability endpoints point at a different store view's domain. To an agent, that is a profile that does not trust its own host - and it will not transact against it.&lt;/p&gt;

&lt;p&gt;A close second: declaring capability endpoints over &lt;code&gt;http://&lt;/code&gt; or with trailing slashes that your rewrites then bounce. Agents follow the spec literally; "close enough" URLs are not close enough.&lt;/p&gt;




&lt;h2&gt;
  
  
  Level 3: Network - Do the Endpoints Actually Answer?
&lt;/h2&gt;

&lt;p&gt;Level 3 leaves the profile behind and goes to the wire. It fetches the schemas and endpoints the profile advertises and verifies they resolve, over HTTPS, with a valid certificate chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Magento failure mode: the deploy that quietly breaks an endpoint.&lt;/strong&gt; This is the one that makes UCP a recurring concern rather than a checklist item. A &lt;code&gt;setup:upgrade&lt;/code&gt;, a module update, or a routing change can move or 500 the very endpoint your profile promised. The profile still validates structurally - it is the live endpoint that regressed.&lt;/p&gt;

&lt;p&gt;The other classic: a certificate renewal that propagated to your origin but not to every CDN edge, so agents hitting one POP get a valid chain and agents hitting another get a handshake error. You will not see it in a browser; an agent will.&lt;/p&gt;




&lt;h2&gt;
  
  
  Level 4: SDK / Spec - Does It Pass Official Compliance?
&lt;/h2&gt;

&lt;p&gt;The final level runs the profile against the official UCP SDK to confirm it complies with the current published spec, not just a plausible-looking shape. Specs move; a profile written against an older draft can drift out of compliance without anyone touching it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Magento failure mode: pinned-and-forgotten.&lt;/strong&gt; Enterprise Magento changes slowly and deliberately - which is a virtue everywhere except here. A profile authored months ago against an earlier UCP version keeps validating against its own assumptions while the spec advances around it. Level 4 is what catches that drift.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Part Most Magento Teams Miss: Discovery Is Not Checkout
&lt;/h2&gt;

&lt;p&gt;A page can be perfectly structured - Schema.org markup, FAQs, breadcrumbs - and an agent can still be unable to &lt;em&gt;buy&lt;/em&gt;. Structured data helps agents understand your catalog. UCP is the actionable layer that lets them complete a purchase: the capabilities, endpoints, and payment handlers a profile declares.&lt;/p&gt;

&lt;p&gt;Passing a structural "AI readiness" check means you are discoverable. Passing all four UCP levels - in production, on every CDN edge, after every deploy - means you are transactable. Those are different bars, and only the second one earns the order.&lt;/p&gt;




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

&lt;p&gt;If you want to see where your Magento store actually stands:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run your domain through a UCP validator that does all four levels, not just a JSON parse. (UCPtools does this for free; it works on Magento, Adobe Commerce, and any other platform, since it reads the open &lt;code&gt;/.well-known/ucp&lt;/code&gt; standard rather than platform internals.)&lt;/li&gt;
&lt;li&gt;Pay special attention to the &lt;strong&gt;Network&lt;/strong&gt; level - that is where Magento's Varnish/CDN/deploy issues surface.&lt;/li&gt;
&lt;li&gt;Re-run it after every deploy and certificate renewal. Treat a UCP regression like a failed health check.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I wrote a deeper, Magento-specific walkthrough - including the GraphQL + REST endpoint setup and the Varnish bypass rule - in the &lt;a href="https://ucptools.dev/guides/magento" rel="noopener noreferrer"&gt;Magento &amp;amp; Adobe Commerce UCP guide&lt;/a&gt;. If you want to compare structural "readiness" checks against full UCP validation, &lt;a href="https://ucptools.dev/compare/ucptools-vs-shopify-agentic-readiness" rel="noopener noreferrer"&gt;this comparison&lt;/a&gt; lays out the difference.&lt;/p&gt;




&lt;p&gt;The merchants who win the agentic-commerce transition will not be the ones with the prettiest product pages. They will be the ones whose checkout an agent can actually complete - reliably, in production, on Magento's genuinely complicated stack. The good news is that it is all measurable now. Measure it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;UCP is an open standard by Google and Shopify. UCPtools is an independent community tool.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ucp</category>
      <category>ecommerce</category>
      <category>magento</category>
      <category>ai</category>
    </item>
    <item>
      <title>ACP Pivoted from Checkout to Discovery. UCP Wins by Default - Here's the Protocol Convergence.</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Wed, 06 May 2026 10:21:17 +0000</pubDate>
      <link>https://dev.to/ucptools/acp-pivoted-from-checkout-to-discovery-ucp-wins-by-default-heres-the-protocol-convergence-374e</link>
      <guid>https://dev.to/ucptools/acp-pivoted-from-checkout-to-discovery-ucp-wins-by-default-heres-the-protocol-convergence-374e</guid>
      <description>&lt;h1&gt;
  
  
  ACP Pivoted from Checkout to Discovery. UCP Wins by Default - Here's the Protocol Convergence.
&lt;/h1&gt;

&lt;p&gt;OpenAI just made the biggest strategic retreat in agentic commerce, and most developers missed what it means for their stack.&lt;/p&gt;

&lt;p&gt;In March 2026, OpenAI quietly pivoted ACP (Agentic Commerce Protocol) away from its original premise: completing purchases inside ChatGPT. The "Instant Checkout" button that was supposed to revolutionize shopping? Gone. Replaced by a merchant app model where purchases complete on the retailer's own storefront.&lt;/p&gt;

&lt;p&gt;This isn't a bug. It's an admission that full-stack commerce is harder than discovery. And it hands the complete commerce stack to UCP by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually happened
&lt;/h2&gt;

&lt;p&gt;OpenAI's ACP launched with an ambitious vision: users would discover products, compare options, and complete purchases entirely within ChatGPT. Stripe provided the payment rails. The promise was a seamless, one-tap checkout experience inside an AI conversation.&lt;/p&gt;

&lt;p&gt;It didn't work.&lt;/p&gt;

&lt;p&gt;CNBC reported on March 20 that "OpenAI's first try at agentic shopping stumbled." Users browsed products in ChatGPT but abandoned purchases before completing them. The in-chat checkout experience lacked sales tax infrastructure, return policy visibility, and the trust signals that mature e-commerce storefronts provide.&lt;/p&gt;

&lt;p&gt;The pivot, detailed by Digital Commerce 360 on March 24, shifts ACP to a merchant app model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dedicated retailer apps inside ChatGPT (Instacart, Etsy, Shopify, Walmart)&lt;/li&gt;
&lt;li&gt;Product discovery and comparison happens in-chat&lt;/li&gt;
&lt;li&gt;Purchase completion happens on the merchant's own storefront (in-app browser on mobile, separate tab on desktop)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As Roger Dunn wrote in his analysis: "ACP's role shifts from universal long-tail merchant connector to plumbing for deep, bespoke retailer partnerships."&lt;/p&gt;

&lt;h2&gt;
  
  
  The protocol math just changed
&lt;/h2&gt;

&lt;p&gt;Here's what this means for the two competing protocols:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before the pivot (January - February 2026):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UCP: Discovery + browsing + cart + checkout (full commerce)&lt;/li&gt;
&lt;li&gt;ACP: Discovery + Instant Checkout inside ChatGPT (full commerce)&lt;/li&gt;
&lt;li&gt;They competed for the same stack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After the pivot (March 2026 onward):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UCP: Discovery + browsing + cart + checkout (full commerce) &lt;/li&gt;
&lt;li&gt;ACP: Discovery + handoff to merchant storefront (discovery only)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The protocols aren't competing anymore. They're converging into different layers of the same stack. UCP owns commerce. ACP owns discovery within ChatGPT's walled garden.&lt;/p&gt;

&lt;p&gt;As Ken Huang put it on his Substack: "Google's UCP Just Won Agentic Commerce."&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for developers building today
&lt;/h2&gt;

&lt;p&gt;If you're an e-commerce developer deciding where to invest protocol implementation time, the math is now straightforward:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implement UCP now.&lt;/strong&gt; It's the only protocol that gives AI agents the full commerce capability: product catalog browsing, cart management, identity linking, and payment processing. It's co-created by Google and Shopify with 25+ partners. It's what Google AI Mode, Gemini, and an expanding ecosystem of agents use to discover and transact with stores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ACP is becoming a discovery layer.&lt;/strong&gt; If you want your products surfaced inside ChatGPT conversations, ACP integration matters - but as a discovery mechanism that hands off to your storefront, not as a transaction protocol.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The real implementation gap isn't protocol choice.&lt;/strong&gt; It's quality. Most deployed UCP profiles fail at basic validation levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Missing &lt;code&gt;signing_keys&lt;/code&gt; means agents can't verify your manifest&lt;/li&gt;
&lt;li&gt;Namespace/origin mismatches break discovery before it starts&lt;/li&gt;
&lt;li&gt;Incomplete Cart capability definitions create failed add-to-cart experiences&lt;/li&gt;
&lt;li&gt;Identity Linking (the stable spec) is the least-implemented capability despite being the most valuable for cross-domain user recognition&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At UCPtools, we scan thousands of profiles. The average score sits well below what AI agents consider reliable. Being "detected" is not the same as being "buyable."&lt;/p&gt;

&lt;h2&gt;
  
  
  What to build
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Implement UCP on your primary store domain first.&lt;/strong&gt; The &lt;code&gt;.well-known/ucp&lt;/code&gt; manifest is table stakes. Make sure it validates at all four levels: structural JSON validity, business rules consistency, network reachability, and SDK-level agent simulation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Don't skip Identity Linking.&lt;/strong&gt; It's the stable spec that enables cross-domain user recognition. When a user browses your store on one device and returns via an AI agent on another, Identity Linking is what connects those sessions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Add ACP as a discovery channel, not a transaction channel.&lt;/strong&gt; The merchant app model means your ChatGPT presence should focus on product discovery and comparison, with a clean handoff to your UCP-enabled storefront where the actual purchase happens.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Monitor continuously.&lt;/strong&gt; Protocols evolve. Specs change. Your profile that validated perfectly in April might fail in June when a capability gets promoted from draft to stable. Continuous validation catches regressions before they cost you AI agent traffic.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;The protocol war is over before it really started. ACP pivoted to discovery. UCP owns the commerce stack by default.&lt;/p&gt;

&lt;p&gt;The question for e-commerce developers isn't which protocol to bet on - it's whether your UCP implementation is good enough for AI agents to actually complete a purchase.&lt;/p&gt;

&lt;p&gt;Most aren't.&lt;/p&gt;

&lt;p&gt;Validate your UCP profile at &lt;a href="https://ucptools.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202605" rel="noopener noreferrer"&gt;https://ucptools.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202605&lt;/a&gt; - the free tier runs all four validation levels and simulates a real AI agent interaction against your store. If an AI agent can't buy from you, your customers can't either.&lt;/p&gt;

</description>
      <category>agenticcommerce</category>
      <category>ucp</category>
      <category>acp</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>What Your UCP Trial Unlocks: From Grade C to Grade A in 15 Minutes</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Fri, 01 May 2026 10:26:52 +0000</pubDate>
      <link>https://dev.to/ucptools/what-your-ucp-trial-unlocks-from-grade-c-to-grade-a-in-15-minutes-38i3</link>
      <guid>https://dev.to/ucptools/what-your-ucp-trial-unlocks-from-grade-c-to-grade-a-in-15-minutes-38i3</guid>
      <description>&lt;h1&gt;
  
  
  What Your UCP Trial Unlocks: From Grade C to Grade A in 15 Minutes
&lt;/h1&gt;

&lt;p&gt;Most stores with a UCP profile are stuck at Grade C. Their manifest loads. Agents can see them. But they cannot buy a single thing. Here is what changes when you fix the three fields every Grade C store is missing - and how a 7-day trial makes it a 15-minute job.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Grade C trap: visible, but not transactable
&lt;/h2&gt;

&lt;p&gt;A Grade C UCP profile means structural validity. Your &lt;code&gt;/.well-known/ucp&lt;/code&gt; returns valid JSON. An AI shopping agent can discover your store. That feels like progress.&lt;/p&gt;

&lt;p&gt;But Grade C also means the agent hits a wall the moment it tries to do anything commercial. No payment handlers configured. No signing keys for verification. No return policy for the agent to communicate to the buyer. The agent walks away, and your store never knows it happened.&lt;/p&gt;

&lt;p&gt;We see this pattern constantly. In the last 7 days, 59 UCP profiles were validated on UCPtools. Eleven of those stores ran the AI Agent Simulator - a real end-to-end agent interaction test. None of them completed a purchase. Zero.&lt;/p&gt;

&lt;p&gt;Grade C means "detected." That is not the same as "can transact."&lt;/p&gt;




&lt;h2&gt;
  
  
  The three fields keeping you at Grade C
&lt;/h2&gt;

&lt;p&gt;After scanning dozens of e-commerce domains, three failures appear on nearly every Grade C profile:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;signing_keys&lt;/code&gt; - the trust layer agents require&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without a public key in your manifest, AI agents cannot cryptographically verify that your UCP responses are authentic. This is not optional. Agents check this before they take any commercial action. A missing &lt;code&gt;signing_keys&lt;/code&gt; field is an instant trust failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. &lt;code&gt;payment_handlers&lt;/code&gt; - the "how do I pay?" gap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agents need to know which payment methods your store accepts before they can initiate a checkout. No &lt;code&gt;payment_handlers&lt;/code&gt; array means the agent has no path to complete a purchase. The store is technically "discoverable" but functionally invisible for any transaction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Return policy schema - the confidence gap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI agents are designed to communicate return terms to buyers before purchase. If your manifest does not include return policy information, the agent cannot answer basic buyer questions like "what happens if I need to return this?" That missing confidence costs conversions - both for the agent and for you.&lt;/p&gt;

&lt;p&gt;These are not exotic edge cases. They are the baseline requirements that separate "the agent found your store" from "the agent bought from your store."&lt;/p&gt;




&lt;h2&gt;
  
  
  What the free tools tell you vs. what the trial shows you
&lt;/h2&gt;

&lt;p&gt;Free UCP checkers give you a binary answer: detected or not detected. They run structural validation. They might catch a missing JSON field. But they stop there.&lt;/p&gt;

&lt;p&gt;A UCPtools Starter trial ($9/mo, 7 days free, no credit card) gives you four layers the free tools skip:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Level 1 - Structural validation:&lt;/strong&gt; Yes, free tools do this. Valid JSON, required fields present. This is where every Grade C store already passes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Level 2 - Rules validation:&lt;/strong&gt; Business logic checks. Do your namespace and origin match? Are your capability declarations internally consistent? This is where most Grade C stores start failing - but free checkers do not run these tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Level 3 - Network validation:&lt;/strong&gt; Live endpoint testing. Are your UCP endpoints actually reachable over HTTPS? Do they return the correct response codes? A manifest can be structurally valid and still serve 404s to agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Level 4 - SDK validation (AI Agent Simulator):&lt;/strong&gt; This is the one that matters. The simulator behaves like a real AI shopping agent - it discovers your store, reads your manifest, and attempts to complete a purchase. It shows you exactly where the agent fails and why. Eleven stores ran this in the last 7 days. All eleven hit failures that structural validation alone would never catch.&lt;/p&gt;




&lt;h2&gt;
  
  
  From Grade C to Grade A: the 15-minute path
&lt;/h2&gt;

&lt;p&gt;Here is what the upgrade looks like in practice:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Run the full scan (2 minutes)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start your trial and point UCPtools at your domain. The 4-level scan completes in under 90 seconds. You get a report that looks nothing like a "detected/not detected" badge - it is a prioritized list of failures ranked by severity, with exact fix recommendations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Generate your signing keys (3 minutes)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;UCPtools generates a key pair for you through the hosted profile generator. Copy the public key into your manifest. The tool validates the placement so you know it is right before you deploy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Configure payment handlers (5 minutes)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Map your existing payment stack (Stripe, Shopify Payments, PayPal) to the UCP payment handler format. The trial shows you the exact JSON structure your manifest needs based on what your store already supports.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Add return policy schema (3 minutes)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Structured return policy data that agents can parse and communicate. The trial's hosted profile builder includes a template you fill in once and deploy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Re-scan and simulate (2 minutes)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run validation again. Run the AI Agent Simulator. Watch the agent discover your store, verify your keys, read your payment handlers, and complete a purchase simulation. Grade A means the agent can do everything a human shopper can do - find you, browse, and buy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why the trial matters (and why it is free)
&lt;/h2&gt;

&lt;p&gt;Nobody pays $9 to see a validation report. They pay $9 because the report tells them something the free tools never will: whether AI agents can actually buy from their store, and exactly how to fix it if they cannot.&lt;/p&gt;

&lt;p&gt;The 7-day trial exists because this is not something you evaluate from a marketing page. You need to see your own domain's results. You need to run the simulator against your own store. The trial gives you full access to do exactly that, with no credit card required.&lt;/p&gt;

&lt;p&gt;If your store passes structural validation but you have never run the simulator, you do not know if your UCP profile works. You just know it loads.&lt;/p&gt;




&lt;h2&gt;
  
  
  Scan your store free
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Start your 7-day free trial at &lt;a href="https://ucptools.dev/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202605" rel="noopener noreferrer"&gt;ucptools.dev&lt;/a&gt; - no credit card required. Run a full 4-level validation against your domain and see exactly where your store stands with AI shopping agents.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Written by the team at UCPtools - the only toolkit that validates, monitors, and optimizes your UCP business profile for AI agent discoverability. Questions? Find us on &lt;a href="https://twitter.com/ucptoolsdev" rel="noopener noreferrer"&gt;X @ucptoolsdev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ucp</category>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>UCP Validation for Agencies: How to Audit AI Readiness Across Every Client Domain</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Wed, 29 Apr 2026 11:02:37 +0000</pubDate>
      <link>https://dev.to/ucptools/ucp-validation-for-agencies-how-to-audit-ai-readiness-across-every-client-domain-1da0</link>
      <guid>https://dev.to/ucptools/ucp-validation-for-agencies-how-to-audit-ai-readiness-across-every-client-domain-1da0</guid>
      <description>&lt;p&gt;If you're a GEO consultant or agency managing ecommerce clients, you've probably been asked some version of this question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can AI agents find my store? How do I know?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The honest answer, until recently, was: you don't. There was no standardized way to measure AI agent discoverability. That changed with UCP (Universal Commerce Protocol) - the open standard from Google and Shopify that gives AI shopping agents a machine-readable entry point to any store.&lt;/p&gt;

&lt;p&gt;Now there &lt;em&gt;is&lt;/em&gt; something measurable. And if you're the one measuring it for your clients, that's a service worth charging for.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Agencies Should Care About UCP Audits
&lt;/h2&gt;

&lt;p&gt;Google AI Mode, Microsoft Copilot, ChatGPT, and Perplexity are all building agentic commerce capabilities. &lt;a href="https://blogs.bing.com/webmaster/2026/04/21/ucp-feeds-general-availability" rel="noopener noreferrer"&gt;Microsoft announced GA of UCP feeds in Merchant Center&lt;/a&gt; on April 21, 2026. Over 12,000 merchants have published UCP profiles as of Q1 2026.&lt;/p&gt;

&lt;p&gt;Your clients are going to ask about this. Some already have. The agencies that can answer with data - not hand-waving - will win those conversations.&lt;/p&gt;

&lt;p&gt;Here's what makes UCP audits a natural fit for agencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's per-domain.&lt;/strong&gt; Each client's hosting stack, CDN, and certificate chain breaks differently. A profile that works on Shopify fails on WooCommerce for entirely different reasons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's recurring.&lt;/strong&gt; UCP validation isn't a one-time setup. Deploys break endpoints. CDN caches serve stale schemas. Certificate renewals don't propagate. The profile that passed last month can silently fail this month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's reportable.&lt;/strong&gt; UCP validation produces a numerical AI readiness score (0-100) with specific, fixable issues. That's the kind of deliverable clients understand.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Agency Audit Framework
&lt;/h2&gt;

&lt;p&gt;Here's a repeatable process for running UCP audits across a client portfolio. It works whether you manage 3 domains or 300.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Baseline Scan: Does the Profile Exist?
&lt;/h3&gt;

&lt;p&gt;Before anything else, check whether each client domain serves a UCP manifest at &lt;code&gt;/.well-known/ucp&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://client-store.com/.well-known/ucp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three outcomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;404 / No manifest&lt;/strong&gt; - The store is invisible to AI agents. Full stop. This is your biggest finding and your clearest upsell.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manifest exists but invalid JSON&lt;/strong&gt; - Broken deployment or misconfigured server. Quick fix, high impact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Valid manifest&lt;/strong&gt; - Move to deeper validation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In our experience, roughly 70% of ecommerce stores don't serve a UCP manifest at all. For the ones that do, about 60% have issues at deeper validation levels.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Four-Level Validation
&lt;/h3&gt;

&lt;p&gt;UCP validation isn't binary (pass/fail). There are four distinct levels, and each catches different categories of issues:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;What It Checks&lt;/th&gt;
&lt;th&gt;Common Failures&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Structural&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JSON syntax, required fields, version format&lt;/td&gt;
&lt;td&gt;Missing &lt;code&gt;ucp&lt;/code&gt; root, wrong version format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. Compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Protocol rules: namespaces, HTTPS, signing keys&lt;/td&gt;
&lt;td&gt;Namespace mismatches, missing signing keys (42% of L2 failures), HTTP endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Network&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Do declared URLs actually resolve?&lt;/td&gt;
&lt;td&gt;CDN 404s, stale schemas, malformed JWK keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4. Agent Simulation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full checkout lifecycle test&lt;/td&gt;
&lt;td&gt;Backend returns 500 on cart creation, state machine failures&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Most validators - including the free ones your clients might have tried - only check Level 1. That gives false confidence. A Level 1 pass with Level 3 failures means the profile looks correct but agents can't actually use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For agencies, Level 3 is the most valuable finding.&lt;/strong&gt; These are infrastructure-drift issues that only surface after deploys, CDN changes, or certificate renewals. They're invisible to the developer who wrote the profile but obvious to an auditor running regular checks.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Score and Categorize
&lt;/h3&gt;

&lt;p&gt;After running validation, each domain gets an AI readiness score (0-100) and a letter grade:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Grade&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;What It Means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;90-100&lt;/td&gt;
&lt;td&gt;AI agents can discover, browse, and transact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;70-89&lt;/td&gt;
&lt;td&gt;Discoverable with minor issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;50-69&lt;/td&gt;
&lt;td&gt;Detected but can't complete transactions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;20-49&lt;/td&gt;
&lt;td&gt;Major issues blocking agent interaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F&lt;/td&gt;
&lt;td&gt;0-19&lt;/td&gt;
&lt;td&gt;Effectively invisible&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Grade C trap is the most common: the profile exists and passes basic checks, but missing signing keys or broken endpoints prevent any actual transaction. Your client thinks they're "UCP ready" because they have a manifest file. They're not.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Build the Client Report
&lt;/h3&gt;

&lt;p&gt;A useful client report contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Score and grade&lt;/strong&gt; for each domain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issue breakdown&lt;/strong&gt; by validation level (structural, compliance, network, simulation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specific fixes&lt;/strong&gt; with estimated effort (most Level 2 fixes take minutes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparison to previous audit&lt;/strong&gt; if this is a recurring engagement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitive context&lt;/strong&gt; - how do they compare to others in their vertical?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key metric clients care about: &lt;strong&gt;"Can AI agents buy from my store?"&lt;/strong&gt; Frame everything around that question. A score of 62 means "AI agents can find you but can't complete a purchase." That's concrete enough to drive action.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to Check Per Platform
&lt;/h2&gt;

&lt;p&gt;UCP issues cluster differently by ecommerce platform. Knowing the common patterns saves audit time:&lt;/p&gt;

&lt;h3&gt;
  
  
  Shopify
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;UCP profile served via app proxy (path configuration matters)&lt;/li&gt;
&lt;li&gt;Payment handler configuration usually correct (Shopify handles this)&lt;/li&gt;
&lt;li&gt;Watch for: signing key rotation gaps, custom app conflicts&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  WooCommerce
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Profile typically served via WordPress plugin or &lt;code&gt;.htaccess&lt;/code&gt; rewrite&lt;/li&gt;
&lt;li&gt;Watch for: HTTP endpoints (mixed content from plugin misconfiguration), schema URL 404s after plugin updates&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  BigCommerce
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Common issue: &lt;code&gt;dev.ucp.shopping&lt;/code&gt; service missing required &lt;code&gt;spec&lt;/code&gt; field (&lt;code&gt;UCP_INVALID_SERVICE&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Watch for: trailing slashes on API endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Magento / Adobe Commerce
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Custom module required for &lt;code&gt;/.well-known/ucp&lt;/code&gt; routing&lt;/li&gt;
&lt;li&gt;Watch for: namespace mismatches when using third-party extensions, GraphQL endpoint schema drift&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Custom / Headless
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Most flexibility, most failure modes&lt;/li&gt;
&lt;li&gt;Watch for: CORS blocking agent preflight requests, endpoint URLs changing between environments&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Automating Portfolio Audits
&lt;/h2&gt;

&lt;p&gt;Running manual checks across 10+ domains doesn't scale. Two automation approaches:&lt;/p&gt;

&lt;h3&gt;
  
  
  CI/CD Integration (Per Client)
&lt;/h3&gt;

&lt;p&gt;If you have access to client repos, the &lt;a href="https://github.com/marketplace/actions/ucp-profile-validator" rel="noopener noreferrer"&gt;ucp-validate GitHub Action&lt;/a&gt; fails the build when the AI readiness score drops below a threshold:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Nolpak14/ucp-validate-action@v1&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;client-store.com'&lt;/span&gt;
    &lt;span class="na"&gt;min-score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;70&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This catches regressions at deploy time - before they affect agent traffic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scheduled Monitoring (Portfolio-Wide)
&lt;/h3&gt;

&lt;p&gt;For ongoing monitoring without repo access, run validation against each client domain on a schedule. The &lt;a href="https://ucptools.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=agency-audit" rel="noopener noreferrer"&gt;UCPtools validator&lt;/a&gt; supports domain-level validation via URL - no code access needed.&lt;/p&gt;

&lt;p&gt;Track scores over time. A domain that drops from 85 to 62 between audits means something broke in production, and you're the one catching it before the client's AI-driven traffic disappears.&lt;/p&gt;




&lt;h2&gt;
  
  
  Positioning This as a Service
&lt;/h2&gt;

&lt;p&gt;UCP auditing fits naturally into existing GEO/SEO service packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One-time audit&lt;/strong&gt; - Baseline scan across all client domains with a findings report. Natural entry point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monthly monitoring&lt;/strong&gt; - Recurring validation with score tracking and regression alerts. Retainer model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation support&lt;/strong&gt; - Fix the issues the audit found. Scope varies by platform (Shopify is usually hours, custom builds are days).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pitch to clients: "Your SEO drives traffic to your store. UCP drives AI agent traffic. We monitor both."&lt;/p&gt;

&lt;p&gt;What makes this defensible: UCP validation requires understanding the spec, the four validation levels, and platform-specific patterns. A generic SEO tool can't do this. You can.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run a free validation&lt;/strong&gt; against one of your client domains at &lt;a href="https://ucptools.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=agency-audit" rel="noopener noreferrer"&gt;ucptools.dev&lt;/a&gt;. See the score, the issues, and which level caught them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeat for your portfolio.&lt;/strong&gt; Note which clients have no manifest at all vs. which have broken ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build the report.&lt;/strong&gt; Score, grade, issues, fixes. Send it to the client.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up monitoring.&lt;/strong&gt; Catch regressions before they cost AI traffic.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The agencies that can quantify AI discoverability will own this conversation. The ones that can't will be explaining why they didn't notice their client's store disappeared from ChatGPT.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;UCPtools is an independent community tool - not affiliated with Google, Shopify, or the UCP consortium.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ucp</category>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Your UCP Profile is Detected. But AI Agents Still Can't Buy From You.</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Sun, 26 Apr 2026 15:55:30 +0000</pubDate>
      <link>https://dev.to/ucptools/your-ucp-profile-is-detected-but-ai-agents-still-cant-buy-from-you-j6p</link>
      <guid>https://dev.to/ucptools/your-ucp-profile-is-detected-but-ai-agents-still-cant-buy-from-you-j6p</guid>
      <description>&lt;h1&gt;
  
  
  Your UCP Profile is Detected. But AI Agents Still Can't Buy From You.
&lt;/h1&gt;

&lt;p&gt;We scanned 111 e-commerce stores. 35 of them have UCP profiles that pass validation. But not a single one can actually complete a purchase with AI agents.&lt;/p&gt;

&lt;p&gt;Here's why: these "Grade C" stores all share the same 3 critical missing fields.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Grade C Trap: Detection ≠ Readiness
&lt;/h2&gt;

&lt;p&gt;Every store in the Grade C category (score: 60-79) has UCP manifest files that basic validators like UCPChecker.com report as "valid." They pass structural validation, network connectivity, and even basic schema checks.&lt;/p&gt;

&lt;p&gt;But when AI agents actually try to interact with these stores, they fail. Every single time.&lt;/p&gt;

&lt;p&gt;The problem isn't that these stores lack UCP profiles. The problem is that their profiles lack 3 specific fields that AI agents need to complete transactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 3 Missing Fields Break AI Commerce
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Missing &lt;code&gt;signing_keys&lt;/code&gt; - The Trust Gap
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;: Cryptographic verification that the UCP manifest hasn't been tampered with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why agents need it&lt;/strong&gt;: AI agents need to verify that the UCP profile they're interacting with is authentic and hasn't been maliciously modified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;: Without signing keys, AI agents cannot trust the UCP profile, making the entire interaction insecure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prevalence&lt;/strong&gt;: 19.8% of stores with UCP profiles lack signing keys, but 100% of Grade C stores are missing them.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Missing &lt;code&gt;payment_handlers&lt;/code&gt; - The Purchase Blocker
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;: Configuration that tells AI agents how to process payments for the store.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why agents need it&lt;/strong&gt;: AI agents need to know which payment methods to use, how to format payment requests, and how to handle payment processing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;: Without payment handlers, AI agents cannot complete purchases. They can discover the store and browse products, but they can't buy anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prevalence&lt;/strong&gt;: 22.5% of stores with UCP profiles lack payment handlers, but 100% of Grade C stores are missing them.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Missing &lt;code&gt;return_policy&lt;/code&gt; Schema - The Trust Builder
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;: Structured data about return policies, warranties, and refund terms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why agents need it&lt;/strong&gt;: AI agents need to show customers trust signals before making purchases. Return policies are one of the most important trust signals for e-commerce.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;: Without return policy schema, AI agents cannot display return terms, build customer trust, or handle post-purchase service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prevalence&lt;/strong&gt;: 48.6% of all stores lack return policy schema, but 100% of Grade C stores are missing them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Agentic Commerce
&lt;/h2&gt;

&lt;p&gt;The Grade C pattern reveals a critical gap in current UCP implementations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stores pass "presence" validation but fail "interaction" validation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI discovery works (agents can find the store)&lt;/li&gt;
&lt;li&gt;Product browsing works (agents can see products)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;But purchasing fails (agents cannot complete transactions)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For agentic commerce to work, we need to move beyond "is UCP present?" to "can UCP actually facilitate commerce?"&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Fix Your Grade C Profile
&lt;/h2&gt;

&lt;p&gt;The good news: these are configuration issues, not platform limitations. Here's how to address each:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Add Signing Keys
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"signing_keys"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"key_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-key-id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"public_key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-public-key-here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"algorithm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ES256"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Configure Payment Handlers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payment_handlers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"payment_method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"credit_card"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"supported_networks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"visa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mastercard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"amex"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"supports_installments"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"supports_3d_secure"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"payment_method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"paypal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"supports_paypal_vault"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Add Return Policy Schema
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"return_policy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"return_window_days"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"return_shipping_paid_by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"merchant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"refund_method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"original_payment_method"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"exceptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"final_sale_items"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"custom_products"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"restocking_fee_percent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The BigCommerce Platform Bug
&lt;/h2&gt;

&lt;p&gt;Our scans reveal a specific pattern affecting BigCommerce stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue&lt;/strong&gt;: &lt;code&gt;dev.ucp.shopping&lt;/code&gt; service missing required &lt;code&gt;spec&lt;/code&gt; field&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issue&lt;/strong&gt;: REST transport missing required &lt;code&gt;schema&lt;/code&gt; field
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result&lt;/strong&gt;: All report &lt;code&gt;UCP_INVALID_SERVICE&lt;/code&gt; errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This appears to be a platform-level issue in BigCommerce's UCP implementation. BigCommerce merchants should verify their REST schema fields and contact BigCommerce support if these fields are missing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who's Affected?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;All 35 Grade C stores share these exact same failures&lt;/strong&gt;, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SaaS agencies&lt;/strong&gt;: obundle.com, papathemes.com&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fashion DTC&lt;/strong&gt;: allbirds.com, brooklinen.com, chubbiesshorts.com, fashionnova.com&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Home Decor&lt;/strong&gt;: curatedhomedecor.com, interiordelights.net, feldkampsfurniture.com&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beauty&lt;/strong&gt;: kyliecosmetics.com&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't small, unknown stores. These are established brands with UCP profiles that "pass validation" but fail at AI commerce.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reality Check
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;65% of stores have zero UCP profiles.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Zero stores are fully AI-agent ready.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;35 stores have "broken but detectable" UCP profiles.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The state of agentic commerce readiness is worse than most merchants realize. Having a UCP profile isn't enough. Your profile actually needs to work with AI agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Your AI Readiness
&lt;/h2&gt;

&lt;p&gt;Don't trust basic validation. Test your actual AI commerce readiness:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check your signing keys&lt;/strong&gt;: Can your manifest be cryptographically verified?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test payment handlers&lt;/strong&gt;: Can AI agents process payments on your store?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify return policy&lt;/strong&gt;: Do agents have access to your return terms?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The gap between "UCP detected" and "AI commerce ready" is where most merchants are stuck. Fixing these 3 fields is the bridge from discovery to actual transactions.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Data from UCPtools AI Readiness Index (111 domains scanned, April 13, 2026)&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Test your store's actual AI readiness at ucptools.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ucp</category>
      <category>agenticcommerce</category>
      <category>ecommerce</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Microsoft Dropped ACP for UCP in 104 Days. Identity Linking Is Why.</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Fri, 24 Apr 2026 09:54:57 +0000</pubDate>
      <link>https://dev.to/ucptools/microsoft-dropped-acp-for-ucp-in-104-days-identity-linking-is-why-2ce9</link>
      <guid>https://dev.to/ucptools/microsoft-dropped-acp-for-ucp-in-104-days-identity-linking-is-why-2ce9</guid>
      <description>&lt;p&gt;On January 8, 2026, Microsoft launched Copilot Checkout on ACP - OpenAI's Agentic Commerce Protocol, powered by Stripe.&lt;/p&gt;

&lt;p&gt;104 days later, on April 22, Microsoft announced general availability of UCP feeds in Merchant Center. Target was the launch partner. The same day, Ulta Beauty went live with agentic commerce, linking 46 million loyalty members through UCP.&lt;/p&gt;

&lt;p&gt;Microsoft didn't just add a second protocol. They switched horses mid-race.&lt;/p&gt;

&lt;p&gt;The question nobody's answering clearly: &lt;strong&gt;what does UCP have that ACP doesn't?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer is one capability: &lt;strong&gt;Identity Linking&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Loyalty Problem AI Agents Create
&lt;/h2&gt;

&lt;p&gt;Think about what happens when an AI agent shops on your behalf.&lt;/p&gt;

&lt;p&gt;It finds a product. Compares prices. Adds to cart. Checks out. Every step works. But it checks out as a guest.&lt;/p&gt;

&lt;p&gt;The agent doesn't know you're a Target Circle member. It doesn't know you have 50,000 reward points. It doesn't know you qualify for member-only pricing on the item it just found.&lt;/p&gt;

&lt;p&gt;Every AI-mediated purchase becomes a guest checkout. Merchants lose their most valuable signal: who this customer actually is.&lt;/p&gt;

&lt;p&gt;This isn't an edge case. Target Circle has tens of millions of members. Ulta has 46 million. Sephora, Best Buy, Gap - all UCP endorsers - have massive loyalty programs. When AI agents ignore all of that, merchants lose the customer relationship they spent years building.&lt;/p&gt;

&lt;p&gt;The protocol that solves this wins. That's why Microsoft switched.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Identity Linking Actually Works
&lt;/h2&gt;

&lt;p&gt;Identity Linking is a stable capability in the UCP spec (not draft, not experimental). It's been there since the January 2026 launch.&lt;/p&gt;

&lt;p&gt;The namespace is &lt;code&gt;dev.ucp.common.identity_linking&lt;/code&gt; - note it's under &lt;code&gt;common&lt;/code&gt;, not &lt;code&gt;shopping&lt;/code&gt;. This trips up a lot of implementations.&lt;/p&gt;

&lt;p&gt;Here's what the capability declaration looks like in your &lt;code&gt;/.well-known/ucp&lt;/code&gt; profile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev.ucp.common.identity_linking"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-01-11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"spec"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://ucp.dev/latest/specification/identity-linking/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://ucp.dev/schemas/common/identity_linking.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"config"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"supported_mechanisms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"oauth2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"issuer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://yourstore.com"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The flow uses standard OAuth 2.0 Authorization Code (RFC 6749). Nothing exotic:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent reads your UCP profile and sees you support Identity Linking&lt;/li&gt;
&lt;li&gt;Agent discovers your OAuth server via RFC 8414 at &lt;code&gt;/.well-known/oauth-authorization-server&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Agent requests authorization on the user's behalf&lt;/li&gt;
&lt;li&gt;User sees a one-time consent prompt (inside Copilot or Gemini)&lt;/li&gt;
&lt;li&gt;Agent gets an access token scoped to &lt;code&gt;ucp:scopes:checkout_session&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Every subsequent checkout carries member pricing, points, preferences&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The critical insight: &lt;strong&gt;one consent, persistent identity&lt;/strong&gt;. The user approves once. After that, the agent carries their loyalty membership into every future session with that merchant. No re-auth. No per-transaction prompts.&lt;/p&gt;

&lt;p&gt;Your OAuth server needs to publish a metadata endpoint per RFC 8414:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"issuer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://yourstore.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"authorization_endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://yourstore.com/oauth/authorize"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token_endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://yourstore.com/oauth/token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scopes_supported"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ucp:scopes:checkout_session"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"response_types_supported"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"grant_types_supported"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"authorization_code"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token_endpoint_auth_methods_supported"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"client_secret_basic"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: the OAuth endpoints are NOT declared in the UCP profile. They're discovered dynamically via RFC 8414. The profile only declares the &lt;code&gt;issuer&lt;/code&gt; URL.&lt;/p&gt;




&lt;h2&gt;
  
  
  Target Circle in Copilot: What the Flow Looks Like
&lt;/h2&gt;

&lt;p&gt;Here's what Microsoft built with Target as the launch partner:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You ask Copilot to find running shoes under $80&lt;/li&gt;
&lt;li&gt;Copilot queries Target's UCP endpoint, finds matching products&lt;/li&gt;
&lt;li&gt;You pick a shoe. Copilot starts checkout&lt;/li&gt;
&lt;li&gt;Copilot sees Identity Linking in Target's profile. Prompts: "Connect your Target Circle account?"&lt;/li&gt;
&lt;li&gt;You approve. OAuth happens behind the scenes&lt;/li&gt;
&lt;li&gt;Checkout continues - but now with your Circle discount applied, your email pre-filled, your reward points available&lt;/li&gt;
&lt;li&gt;Next time you shop at Target through Copilot, step 4 is skipped. Your identity persists&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is why Microsoft specifically called out Identity Linking in their Merchant Center announcement. It's not a nice-to-have feature - it's the mechanism that makes loyalty programs survive the shift to AI-mediated commerce.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why ACP Can't Do This
&lt;/h2&gt;

&lt;p&gt;ACP uses Stripe delegated tokens. A Stripe token represents a payment credential - a card, a wallet, a bank account.&lt;/p&gt;

&lt;p&gt;A Stripe token knows your card number. It does not know you're a rewards member. It does not know your loyalty tier. It does not carry member pricing.&lt;/p&gt;

&lt;p&gt;ACP has no OAuth identity layer. No account linking mechanism. No way for an agent to say "this shopper is customer #4821 with Gold status."&lt;/p&gt;

&lt;p&gt;This is a structural gap, not a missing feature. ACP was designed for payment delegation. UCP was designed for the full commerce lifecycle - including identity.&lt;/p&gt;

&lt;p&gt;When Microsoft needed loyalty programs to work in Copilot Shopping, ACP couldn't deliver. UCP could. 104 days was all it took to make the switch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Implementation: Adding Identity Linking to Your Profile
&lt;/h2&gt;

&lt;p&gt;If you have a loyalty program and want it to work with AI agents, here's what you need:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Add the capability to your UCP profile&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Add the &lt;code&gt;dev.ucp.common.identity_linking&lt;/code&gt; entry to your capabilities array (see the JSON example above). Common namespace - not shopping.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Set up your OAuth server&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need a standard OAuth 2.0 Authorization Server with a metadata endpoint at &lt;code&gt;/.well-known/oauth-authorization-server&lt;/code&gt;. If you already support OAuth for mobile apps or partner integrations, you're most of the way there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Watch for these validation failures&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our validator catches 4 Identity Linking-specific issues:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error Code&lt;/th&gt;
&lt;th&gt;What Went Wrong&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UCP_IDENTITY_MISSING_MECHANISMS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No &lt;code&gt;config.supported_mechanisms&lt;/code&gt; in your capability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UCP_IDENTITY_INVALID_MECHANISM&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mechanism entry missing required &lt;code&gt;type&lt;/code&gt; field&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UCP_IDENTITY_MISSING_ISSUER&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OAuth2 mechanism without an &lt;code&gt;issuer&lt;/code&gt; URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UCP_IDENTITY_ISSUER_NOT_HTTPS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Issuer URL uses HTTP instead of HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The most common failure: declaring the capability but forgetting the &lt;code&gt;config&lt;/code&gt; block entirely. A Level 1 validator (JSON structure only) won't catch this. You need Level 2 compliance validation.&lt;/p&gt;




&lt;h2&gt;
  
  
  What To Do Next
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check if your profile declares Identity Linking&lt;/strong&gt; - if you have a loyalty program and it's missing, your members are invisible to AI agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate your Identity Linking config&lt;/strong&gt; at &lt;a href="https://ucptools.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=identity-linking" rel="noopener noreferrer"&gt;ucptools.dev&lt;/a&gt; - the validator checks all 4 error codes and tells you exactly what to fix&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add UCP validation to CI/CD&lt;/strong&gt; - catch regressions before agents do (&lt;a href="https://github.com/marketplace/actions/ucp-profile-validator" rel="noopener noreferrer"&gt;GitHub Action&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test the OAuth flow end-to-end&lt;/strong&gt; - a valid profile means nothing if the OAuth metadata endpoint returns a 404&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Microsoft made their bet. Target and Ulta are live. The Identity Linking spec is stable and validated by multiple agent platforms. If you have a loyalty program, this is the capability that makes it travel with your customers into AI commerce.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;UCPtools is an independent community tool - not affiliated with Google, Shopify, or the UCP consortium.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ucp</category>
      <category>ecommerce</category>
      <category>oauth</category>
      <category>agenticcommerce</category>
    </item>
    <item>
      <title>93% of UCP profiles are broken. Here are the 3 failures that matter most.</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Sat, 18 Apr 2026 07:03:35 +0000</pubDate>
      <link>https://dev.to/ucptools/93-of-ucp-profiles-are-broken-here-are-the-3-failures-that-matter-most-1n37</link>
      <guid>https://dev.to/ucptools/93-of-ucp-profiles-are-broken-here-are-the-3-failures-that-matter-most-1n37</guid>
      <description>&lt;h1&gt;
  
  
  93% of UCP profiles are broken. Here are the 3 failures that matter most.
&lt;/h1&gt;

&lt;p&gt;Published April 18, 2026 | 5 min read&lt;/p&gt;

&lt;p&gt;We just scanned 111 e-commerce domains and found a staggering truth: &lt;strong&gt;93% of UCP profiles cannot complete AI agent purchases&lt;/strong&gt;. Not because they don't have UCP files, but because they fail at the 3 critical steps that actually matter for agentic commerce.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Data Behind the 93%
&lt;/h2&gt;

&lt;p&gt;Our AI Readiness Index scanned 111 reachable domains across fashion, home decor, beauty, SaaS, and marketplaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;72 domains (65%)&lt;/strong&gt;: Zero UCP presence at all&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;35 domains (31.5%)&lt;/strong&gt;: Have UCP files but are functionally broken&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4 domains (3.6%)&lt;/strong&gt;: Have structural issues &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0 domains&lt;/strong&gt;: Are actually AI-agent ready&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Among the 35 stores that technically "pass" UCP validation (Grade C), &lt;strong&gt;100% share the same 3 fatal failures&lt;/strong&gt;. This is where the real problem lies.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 3 Failures That Break AI Commerce
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Missing &lt;code&gt;signing_keys&lt;/code&gt; - 20% of all stores
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ucp_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"signing_keys"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;←&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;EMPTY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;OR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MISSING&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters&lt;/strong&gt;: Without cryptographic signing keys, AI agents cannot verify that your UCP manifest is authentic and hasn't been tampered with. This is a security requirement for any transaction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;: Agents will refuse to interact with your store, period.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Missing &lt;code&gt;payment_handlers&lt;/code&gt; - 23% of stores with UCP
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"services"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"checkout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://yourstore.com/checkout"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"payment_handlers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;←&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;EMPTY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;OR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MISSING&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters&lt;/strong&gt;: Payment handlers tell AI agents which payment methods you accept (credit cards, PayPal, Apple Pay, etc.). Without them, agents have no idea how to complete a purchase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;: AI agents can discover your store but cannot buy from you.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Missing &lt;code&gt;return_policy&lt;/code&gt; schema - 49% of all stores
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"organization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your Store"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"return_policy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;←&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MISSING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;REQUIRED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;FIELDS&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters&lt;/strong&gt;: Return policies are trust signals for AI agents. They need to know your return terms to recommend your store to users and handle post-purchase issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;: AI agents cannot display your trustworthiness, reducing conversion likelihood.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Detected" ≠ "Ready" Trap
&lt;/h2&gt;

&lt;p&gt;Most UCP validation tools (including our own basic checks) only answer one question: &lt;em&gt;"Is there a .well-known/ucp file?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;They don't answer the questions that actually matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Can agents cryptographically verify your manifest?&lt;/li&gt;
&lt;li&gt;✅ Can agents process payments at your store?&lt;/li&gt;
&lt;li&gt;✅ Can agents display your trust signals?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stores like Allbirds, Brooklinen, and Fashion Nova all pass basic UCP detection but fail at these critical levels. They're "detected" but not "transactable."&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Example: BigCommerce Bug
&lt;/h2&gt;

&lt;p&gt;We found a platform-wide issue affecting BigCommerce merchants:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"services"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dev.ucp.shopping"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://store.mybigcommerce.com/api/ucp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"spec"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;←&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MISSING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;SPEC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;FIELD&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three BigCommerce domains shared identical &lt;code&gt;UCP_INVALID_SERVICE&lt;/code&gt; errors due to missing &lt;code&gt;spec&lt;/code&gt; fields. This isn't merchant error - it's a platform implementation issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means for AI Commerce
&lt;/h2&gt;

&lt;p&gt;The 93% broken rate isn't just a statistic - it's a barrier to the $15T e-commerce market becoming AI-accessible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For brands&lt;/strong&gt;: You have a first-mover advantage right now. Fix these 3 fields and you'll be in the top 7% of AI-ready stores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For agencies&lt;/strong&gt;: Your clients' UCP profiles are likely broken even if they "pass" validation. You need to check these 3 critical areas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For platforms&lt;/strong&gt;: The current UCP implementation guidance is insufficient. Platforms need to enforce these 3 requirements at the validation level, not just the presence level.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix These in 15 Minutes
&lt;/h2&gt;

&lt;p&gt;These aren't complex architectural changes. They're simple field additions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add signing keys&lt;/strong&gt; from your SSL certificate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;List accepted payment methods&lt;/strong&gt; in payment_handlers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define return terms&lt;/strong&gt; in the return_policy schema&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The tools exist to validate these properly - most just don't yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Market Opportunity
&lt;/h2&gt;

&lt;p&gt;Right now, the gap is enormous:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0% of marketplaces have working UCP&lt;/li&gt;
&lt;li&gt;Only 31.5% of DTC brands even have UCP files&lt;/li&gt;
&lt;li&gt;Of those, effectively none are actually AI-transactable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a massive opportunity for the first platforms, agencies, and tools that solve these 3 fundamental problems.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Data from UCPtools AI Readiness Index - 111 domains scanned April 13, 2026. Scan methodology: Serper API discovery + targeted validation. All numbers from actual scan reports.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test your store's UCP profile&lt;/strong&gt;: &lt;a href="https://ucptools.dev/directory?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604" rel="noopener noreferrer"&gt;https://ucptools.dev/directory?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604&lt;/a&gt; ?utm_source=dev.to&amp;amp;utm_medium=article&amp;amp;utm_campaign=202604&lt;/p&gt;

</description>
      <category>agenticcommerce</category>
      <category>ucp</category>
      <category>ecommerce</category>
      <category>webdev</category>
    </item>
    <item>
      <title>UCP and ACP Need a Third Layer: Trust Rails</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Thu, 16 Apr 2026 05:59:36 +0000</pubDate>
      <link>https://dev.to/ucptools/ucp-and-acp-need-a-third-layer-trust-rails-341i</link>
      <guid>https://dev.to/ucptools/ucp-and-acp-need-a-third-layer-trust-rails-341i</guid>
      <description>&lt;p&gt;If you only watched protocol updates in agentic commerce, this week might have looked like more of the same.&lt;/p&gt;

&lt;p&gt;But if you looked at where new announcements actually landed, the signal was different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UCP and ACP keep defining reach&lt;/strong&gt; (where an agent can discover and attempt checkout).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A new trust layer is becoming explicit&lt;/strong&gt; (who carries risk when an autonomous purchase goes wrong).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That second point is the story.&lt;/p&gt;

&lt;p&gt;In the last 7 days, the market did not just talk about agent checkout mechanics. It moved toward &lt;strong&gt;issuer-side controls, intent proof, and liability handling&lt;/strong&gt; as first-class infrastructure.&lt;/p&gt;

&lt;p&gt;For merchants, this changes the implementation question from:&lt;/p&gt;

&lt;p&gt;"Which protocol should we support first?"&lt;/p&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;p&gt;"How do we ship protocol coverage and trust controls together so autonomous checkout can scale without blowing up disputes?"&lt;/p&gt;

&lt;h2&gt;
  
  
  The 7-Day Signal (Apr 10-Apr 16)
&lt;/h2&gt;

&lt;p&gt;Here are the highest-signal changes and discussions from the current window:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apr 14, 2026: American Express launched ACE developer tooling and registered-agent purchase protection&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Official newsroom announcement: American Express introduced Agentic Commerce Experiences (ACE) and protection mechanics for registered agent purchases.&lt;/li&gt;
&lt;li&gt;Practical meaning: payment-side participants are now publishing explicit models for intent validation, registration, and post-transaction accountability.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apr 14, 2026: Commerce media coverage emphasized trust, control, and visibility for agent-initiated transactions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Industry writeups broke out the operational pieces: agent registration, account enablement, purchase intent, tokenized credential pass-through, and optional cart context.&lt;/li&gt;
&lt;li&gt;Practical meaning: trust is no longer an abstract "future standards" topic. It is entering implementation checklists.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apr 10-Apr 16, 2026: Operator conversation accelerated around protocol fragmentation and execution gaps&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Builders and commerce operators repeatedly framed the same reality: one protocol path rarely covers every agent ecosystem.&lt;/li&gt;
&lt;li&gt;Practical meaning: merchants need a multi-surface strategy (discovery + checkout + payment trust) instead of single-protocol optimism.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  UCP and ACP Are Reach Layers, Not Full Safety Models
&lt;/h2&gt;

&lt;p&gt;Let's separate what each layer does.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 1: Reach and Interoperability
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UCP (Google/Shopify ecosystem)&lt;/strong&gt; helps agents discover merchant capabilities and run structured commerce flows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACP (OpenAI/Stripe ecosystem)&lt;/strong&gt; enables structured agent checkout interactions in the ChatGPT-linked path.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are essential. Neither is sufficient on its own for production-scale autonomous buying.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because successful autonomous commerce needs answers to risk questions that protocol alone does not fully answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What evidence proves user intent at authorization time?&lt;/li&gt;
&lt;li&gt;Who is accountable if the agent buys the wrong item?&lt;/li&gt;
&lt;li&gt;How does dispute resolution separate merchant error from agent error from user error?&lt;/li&gt;
&lt;li&gt;What data can be safely retained for adjudication without creating privacy debt?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When volume is low, teams hand-wave these questions.&lt;br&gt;
When agent volume rises, they become blocking architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Week Matters More Than Another Spec Diff
&lt;/h2&gt;

&lt;p&gt;The common pattern in early UCP/ACP discussions was:&lt;/p&gt;

&lt;p&gt;"Get discoverable and check-out capable first."&lt;/p&gt;

&lt;p&gt;That guidance was directionally right, but incomplete.&lt;/p&gt;

&lt;p&gt;This week showed the next constraint very clearly:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agentic commerce throughput is constrained by the weaker layer:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Throughput ≈ min(protocol reach, trust-rail maturity)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If trust rails lag, throughput stalls. Not because agents cannot click "buy," but because finance, risk, and support teams will cap exposure.&lt;/p&gt;

&lt;p&gt;In plain terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can win technical demos with protocol support.&lt;/li&gt;
&lt;li&gt;You win real GMV only when risk teams sign off on intent and liability paths.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The New Merchant Architecture (Practical Version)
&lt;/h2&gt;

&lt;p&gt;You do not need to boil the ocean this quarter. You do need to avoid shipping protocol support in isolation.&lt;/p&gt;

&lt;p&gt;Use this architecture split:&lt;/p&gt;

&lt;h3&gt;
  
  
  A) Discovery and Capability Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Maintain a valid UCP profile (&lt;code&gt;/.well-known/ucp&lt;/code&gt;) where relevant.&lt;/li&gt;
&lt;li&gt;Keep capability declarations synchronized with real endpoint behavior.&lt;/li&gt;
&lt;li&gt;Validate profile and endpoint health continuously (not manually before launch days).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  B) Transaction Execution Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Implement clean, deterministic checkout state handling.&lt;/li&gt;
&lt;li&gt;Preserve idempotency across agent retries.&lt;/li&gt;
&lt;li&gt;Log machine-readable failure reasons so agents can recover.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  C) Trust and Liability Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Record explicit intent artifacts for agent-initiated actions.&lt;/li&gt;
&lt;li&gt;Capture agent identity/registration context where available.&lt;/li&gt;
&lt;li&gt;Define dispute routing playbooks: agent error vs merchant error vs user error.&lt;/li&gt;
&lt;li&gt;Align payment credential handling with tokenized, scoped, revocable controls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most teams currently invest heavily in A and B, then improvise C.&lt;br&gt;
This week's market signal suggests that C is now where winners and false starts will diverge.&lt;/p&gt;

&lt;h2&gt;
  
  
  A 30-Day Implementation Plan You Can Actually Execute
&lt;/h2&gt;

&lt;p&gt;If your team is small, here is a realistic sequencing model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 1: Baseline Reach Integrity
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Validate UCP profile shape and endpoint availability.&lt;/li&gt;
&lt;li&gt;Confirm declared capabilities match production behavior.&lt;/li&gt;
&lt;li&gt;Patch obvious hygiene gaps (HTTPS, schema paths, key metadata).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Week 2: Checkout Determinism
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Add idempotency guards on create/update/complete flows.&lt;/li&gt;
&lt;li&gt;Normalize error codes for agent-readable recovery.&lt;/li&gt;
&lt;li&gt;Add end-to-end replay tests for interrupted flows.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Week 3: Trust Artifacts
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Define and store minimal intent evidence bundle.&lt;/li&gt;
&lt;li&gt;Capture agent/session identifiers in transaction metadata.&lt;/li&gt;
&lt;li&gt;Document what support can and cannot adjudicate with current logs.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Week 4: Liability Readiness Review
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Run simulated dispute scenarios:

&lt;ul&gt;
&lt;li&gt;wrong color/variant selected by agent&lt;/li&gt;
&lt;li&gt;stale availability race&lt;/li&gt;
&lt;li&gt;canceled intent arriving after delayed authorization&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Confirm owner and fallback path for each failure mode.&lt;/li&gt;
&lt;li&gt;Update customer-facing policy language for autonomous purchases.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is not "perfect security architecture."&lt;br&gt;
It is enough to move from experimental to operational.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cost of Ignoring the Trust Layer
&lt;/h2&gt;

&lt;p&gt;If you skip this shift and treat agentic commerce as protocol-only, you will usually see one of four outcomes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;High discovery, low completion:&lt;/strong&gt; agents can find you but fail late in checkout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Completion spikes, dispute spikes:&lt;/strong&gt; operations spend explodes and leadership throttles rollout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Silent risk caps:&lt;/strong&gt; internal teams reduce allowed agent use-cases without product visibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channel fragmentation debt:&lt;/strong&gt; each ecosystem gets separate one-off fixes, no shared risk model.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In other words, engineering may report "integration complete" while finance reports "do not scale this yet."&lt;/p&gt;

&lt;h2&gt;
  
  
  Where UCPtools Fits (and Where It Doesn't)
&lt;/h2&gt;

&lt;p&gt;UCPtools helps with the &lt;strong&gt;readiness and validation side&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;profile and capability validation&lt;/li&gt;
&lt;li&gt;endpoint and schema checks&lt;/li&gt;
&lt;li&gt;implementation diagnostics you can run before shipping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; replace your policy, underwriting, or issuer agreements.&lt;/p&gt;

&lt;p&gt;But it does reduce one expensive failure class: shipping broken protocol posture and discovering it only after agents already route traffic.&lt;/p&gt;

&lt;p&gt;If you want a quick baseline, run your domain through the validator:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ucptools.dev/validator?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=ai_commerce_for_developers&amp;amp;utm_content=risk_layer" rel="noopener noreferrer"&gt;https://ucptools.dev/validator?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=ai_commerce_for_developers&amp;amp;utm_content=risk_layer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then use the score as your Week 1 input for the 30-day plan above.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Do This Week
&lt;/h2&gt;

&lt;p&gt;If you are deciding where to spend engineering time in April, here is the short answer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Do not pick between UCP and ACP as an ideology war.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pick based on your near-term customer channel mix.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Do not treat protocol support as the finish line.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add intent and liability handling to the same roadmap.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Do not wait for perfect standards convergence.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build a clear internal trust model now, then adapt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The teams that move fastest from pilot to durable volume will likely be the ones that connect these layers earliest:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reach (UCP/ACP) + Execution (checkout reliability) + Trust (intent/liability rails).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That was not obvious to most teams a month ago.&lt;br&gt;
After this week, it should be.&lt;/p&gt;




&lt;p&gt;UCP is an open standard driven by Google and Shopify. ACP is an open standard driven by OpenAI and Stripe. UCPtools is an independent community tool and is not affiliated with Google, Shopify, OpenAI, or Stripe.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>shopify</category>
    </item>
    <item>
      <title>UCP vs ACP Payment Architecture: Why Both Protocols Matter for AI Commerce</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Wed, 15 Apr 2026 09:00:42 +0000</pubDate>
      <link>https://dev.to/ucptools/ucp-vs-acp-payment-architecture-why-both-protocols-matter-for-ai-commerce-10d4</link>
      <guid>https://dev.to/ucptools/ucp-vs-acp-payment-architecture-why-both-protocols-matter-for-ai-commerce-10d4</guid>
      <description>&lt;h2&gt;
  
  
  UCP vs ACP Payment Architecture: Why Both Protocols Matter for AI Commerce
&lt;/h2&gt;

&lt;p&gt;In the realm of AI-driven commerce, two protocols have emerged as frontrunners in enabling seamless transactions between consumers and merchants: the Universal Commerce Protocol (UCP) and the Agentic Commerce Protocol (ACP). Both protocols aim to bridge the gap between AI agents and commerce platforms, yet their approaches diverge in several key ways. This article will delve into these differences, highlighting when and why you might choose one over the other.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding UCP and ACP
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Universal Commerce Protocol (UCP):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developed with a focus on interconnectivity and standardized interactions.&lt;/li&gt;
&lt;li&gt;Establishes a "trust triangle" involving consumers, merchants, and AI agents.&lt;/li&gt;
&lt;li&gt;Leverages a decentralized manifest system for merchant discovery, ensuring flexible integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Agentic Commerce Protocol (ACP):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prioritizes rapid deployment and ease of use.&lt;/li&gt;
&lt;li&gt;Utilizes a delegated payment model, allowing agents to act as intermediaries.&lt;/li&gt;
&lt;li&gt;Supports both centralized and decentralized discovery mechanisms.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Payment Credential Flow Differences
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UCP&lt;/strong&gt;: Centers around direct credential exchanges with robust verification steps, ensuring high security.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACP&lt;/strong&gt;: Employs a streamlined delegated approach, where agents facilitate transactions without directly handling sensitive credentials.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Trust Triangle vs Delegated Payment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UCP Trust Triangle&lt;/strong&gt;: Creates a robust ecosystem where merchants and consumers can interact through verified AI agents. This approach emphasizes security and reliability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACP Delegated Payment&lt;/strong&gt;: Facilitates quicker transactions by reducing the steps needed for verification, making it ideal for environments where speed is more critical than comprehensive checks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When to Use Which Protocol?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UCP&lt;/strong&gt;: Best suited for environments where security and interoperability are paramount. It's the protocol of choice for platforms needing a robust verification system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACP&lt;/strong&gt;: Optimal for scenarios requiring rapid transaction speeds and minimal friction in onboarding new merchants or consumers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Agorio: Dual-Protocol Support
&lt;/h3&gt;

&lt;p&gt;Agorio stands out by offering dual-protocol support, seamlessly integrating both UCP and ACP to provide flexible options for developers. Whether building for security-focused platforms or speed-intensive environments, Agorio's SDK ensures compatibility and enhances the AI-commerce interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;In the evolving landscape of AI commerce, the choice between UCP and ACP largely depends on specific business needs. While UCP offers rigorous security and interoperability, ACP provides speed and ease of use. By understanding and leveraging the strengths of both protocols, developers can create more effective and versatile AI-driven commerce solutions.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>typescript</category>
      <category>ecommerce</category>
      <category>opensource</category>
    </item>
    <item>
      <title>WooCommerce UCP Setup: The 3 Fields Most Developers Miss</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Mon, 13 Apr 2026 06:55:15 +0000</pubDate>
      <link>https://dev.to/ucptools/woocommerce-ucp-setup-the-3-fields-most-developers-miss-4caf</link>
      <guid>https://dev.to/ucptools/woocommerce-ucp-setup-the-3-fields-most-developers-miss-4caf</guid>
      <description>&lt;p&gt;You installed the WordPress plugin. Your &lt;code&gt;.well-known/ucp&lt;/code&gt; endpoint returns valid JSON. The UCP checker says "Detected."&lt;/p&gt;

&lt;p&gt;But AI shopping agents still can't buy from your store.&lt;/p&gt;

&lt;p&gt;After scanning 43 WooCommerce domains with UCP manifests, we see the same 3 missing fields over and over. Not edge cases. Not spec trivia. These are the fields that determine whether an AI agent can actually complete a purchase - or just window-shop and leave.&lt;/p&gt;

&lt;h2&gt;
  
  
  The state of WooCommerce UCP right now
&lt;/h2&gt;

&lt;p&gt;WooCommerce does not have native UCP support. There's an &lt;a href="https://woocommerce.com/feature-request/native-support-for-googles-universal-commerce-protocol-ucp-for-ai-agents/" rel="noopener noreferrer"&gt;official feature request&lt;/a&gt; and a &lt;a href="https://github.com/woocommerce/woocommerce/discussions/63192" rel="noopener noreferrer"&gt;GitHub discussion&lt;/a&gt;, but as of April 2026, you're on your own.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://wordpress.org/plugins/universal-commerce-protocol-ucp-for-woocommerce/" rel="noopener noreferrer"&gt;WordPress plugin&lt;/a&gt; gets you started. It generates the manifest and serves it at the right endpoint. That covers structural validation.&lt;/p&gt;

&lt;p&gt;But structural validation is level 1 of 4. The next 3 levels are where WooCommerce stores fall apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Field 1: &lt;code&gt;signing_keys&lt;/code&gt; (missing on ~60% of WooCommerce UCP profiles)
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;signing_keys&lt;/code&gt; field tells AI agents how to verify that your manifest is authentic - that it actually came from you and wasn't tampered with.&lt;/p&gt;

&lt;p&gt;Without &lt;code&gt;signing_keys&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agents can't cryptographically verify your manifest&lt;/li&gt;
&lt;li&gt;Some agents will skip your store entirely rather than risk interacting with an unverified profile&lt;/li&gt;
&lt;li&gt;Google's UCP documentation explicitly recommends including signing keys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In our Apr 10 scan of 15 domains, over half were missing this field. The WordPress plugin doesn't generate it by default. You need to add it manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to add it:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate a key pair (Ed25519 recommended):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl genpkey &lt;span class="nt"&gt;-algorithm&lt;/span&gt; ED25519 | openssl pkey &lt;span class="nt"&gt;-outform&lt;/span&gt; DER | &lt;span class="nb"&gt;base64&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Add to your &lt;code&gt;.well-known/ucp&lt;/code&gt; manifest:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"signing_keys"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"alg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EdDSA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"kid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"key-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BASE64_PUBLIC_KEY_HERE"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Store the private key securely. You'll need it if you ever sign UCP responses.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Field 2: &lt;code&gt;payment_handlers&lt;/code&gt; (missing on ~70% of WooCommerce UCP profiles)
&lt;/h2&gt;

&lt;p&gt;This is the one that actually breaks checkout. &lt;code&gt;payment_handlers&lt;/code&gt; tells AI agents which payment methods your store accepts. Without it, agents know your store exists but have no idea how to pay.&lt;/p&gt;

&lt;p&gt;This is not the same as your WooCommerce payment gateway settings. Those are for human checkout flows. &lt;code&gt;payment_handlers&lt;/code&gt; is the machine-readable equivalent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to add it:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"checkout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"payment_handlers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"card"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"networks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"visa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mastercard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"amex"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"payment_link"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://your-store.com/pay/{sessionId}"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Match the &lt;code&gt;networks&lt;/code&gt; to what your WooCommerce payment gateway actually supports. Don't declare Amex if you don't accept it - agents will try to use it and the transaction will fail at checkout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Field 3: Namespace/origin match (broken on ~40% of WooCommerce UCP profiles)
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;namespace&lt;/code&gt; and &lt;code&gt;origin&lt;/code&gt; fields in your manifest must match your actual domain. This sounds obvious, but it breaks constantly when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your WordPress site is at &lt;code&gt;www.yourstore.com&lt;/code&gt; but the manifest declares &lt;code&gt;yourstore.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;You use a CDN subdomain that differs from your WooCommerce origin&lt;/li&gt;
&lt;li&gt;The WordPress plugin auto-generates the origin from &lt;code&gt;site_url&lt;/code&gt; which may not match the domain AI agents use to discover you&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If an agent requests &lt;code&gt;/.well-known/ucp&lt;/code&gt; from &lt;code&gt;www.yourstore.com&lt;/code&gt; and the manifest says &lt;code&gt;origin: "yourstore.com"&lt;/code&gt;, the agent may reject the manifest as invalid for that domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to fix it:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Check what domain AI agents actually use to find your store. It's usually the canonical URL (the one with www or without, whichever you've standardized on).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure your manifest matches:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"namespace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.yourstore.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"origin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.yourstore.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;If you serve on both www and non-www, pick one canonical domain and redirect the other. Don't try to serve different manifests on each - that's a namespace collision.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why these 3 matter more than the rest
&lt;/h2&gt;

&lt;p&gt;All three of these failures happen at validation level 2 (rules) or level 3 (network). A basic JSON validator won't catch them. A "Detected / Not Detected" checker won't catch them. They only surface when you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run rules-based validation that checks capability consistency&lt;/li&gt;
&lt;li&gt;Actually test the endpoint with a live HTTP request&lt;/li&gt;
&lt;li&gt;Simulate an AI agent trying to complete a purchase flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the gap between "my UCP file exists" and "AI agents can buy from my store." It's the gap that matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick validation checklist for WooCommerce stores
&lt;/h2&gt;

&lt;p&gt;Run through this after you set up the WordPress plugin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;code&gt;signing_keys&lt;/code&gt; present with Ed25519 or RSA key&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;payment_handlers&lt;/code&gt; lists the card networks you actually accept&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;namespace&lt;/code&gt; and &lt;code&gt;origin&lt;/code&gt; match your canonical domain (including www)&lt;/li&gt;
&lt;li&gt;[ ] All endpoints use HTTPS (no HTTP)&lt;/li&gt;
&lt;li&gt;[ ] No trailing slashes on endpoint URLs&lt;/li&gt;
&lt;li&gt;[ ] Cart capability includes add, remove, and view actions (not just add)&lt;/li&gt;
&lt;li&gt;[ ] Return policy schema present if you have a return policy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can validate all 4 levels for free at &lt;a href="https://ucptools.dev" rel="noopener noreferrer"&gt;ucptools.dev&lt;/a&gt;. It runs structural validation, rules checks, live endpoint testing, and AI agent simulation - not just "is the file there."&lt;/p&gt;

&lt;h2&gt;
  
  
  What about Google's March 2026 UCP update?
&lt;/h2&gt;

&lt;p&gt;Google released new UCP capabilities and a simplified onboarding experience in March 2026. The update focuses on making it easier for merchants to get started, but the core validation requirements haven't changed. Your &lt;code&gt;.well-known/ucp&lt;/code&gt; still needs the same fields. The difference is that Google is now providing more guidance on what "complete" looks like - which makes the missing fields above even more visible.&lt;/p&gt;

&lt;p&gt;If you set up your WooCommerce UCP profile before March 2026, it's worth re-validating. The rules about what constitutes a "passing" profile have tightened.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;The WordPress plugin gets your WooCommerce store to level 1. That's the floor. If you want AI agents to actually complete purchases - not just discover your products and bounce - you need level 2-4 validation. The 3 fields above are where most WooCommerce stores fail. Fix them and you're ahead of the curve.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Validation data from UCPtools scans conducted Apr 1 and Apr 10, 2026. Sample sizes: 28 and 15 domains respectively. Percentages are approximate given sample size.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ucp</category>
      <category>woocommerce</category>
      <category>ecommerce</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Shopify Agentic Storefronts Enabled? Your UCP Profile Still Has Gaps.</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Sat, 11 Apr 2026 08:38:47 +0000</pubDate>
      <link>https://dev.to/ucptools/shopify-agentic-storefronts-enabled-your-ucp-profile-still-has-gaps-1lc1</link>
      <guid>https://dev.to/ucptools/shopify-agentic-storefronts-enabled-your-ucp-profile-still-has-gaps-1lc1</guid>
      <description>&lt;p&gt;You enabled Shopify's Agentic Storefronts. You verified your &lt;code&gt;.well-known/ucp&lt;/code&gt; returns JSON. Google AI Mode should be able to find your store now, right?&lt;/p&gt;

&lt;p&gt;Maybe. Probably not.&lt;/p&gt;

&lt;p&gt;In our April 1 scan of 28 e-commerce domains, every single store that had a UCP manifest was still failing at least 3 validation checks. Not one scored healthy. The most common pattern: Shopify generates the manifest structure correctly, but leaves critical fields empty or misconfigured - and most merchants never notice because their JSON looks valid.&lt;/p&gt;

&lt;p&gt;Here is what is actually missing, why it matters for AI agent discovery, and what to check.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Shopify's Agentic Storefronts Actually Set Up
&lt;/h2&gt;

&lt;p&gt;When you enable the Agentic plan in Shopify, the platform auto-generates a &lt;code&gt;.well-known/ucp&lt;/code&gt; manifest. It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store metadata (name, origin, namespace)&lt;/li&gt;
&lt;li&gt;Capabilities block (Cart, Catalog, Identity Linking, Checkout)&lt;/li&gt;
&lt;li&gt;Transport bindings pointing to Shopify's endpoint infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gets you past Level 1 validation (structural). The JSON parses. Required fields exist. If you run a basic JSON schema validator, it passes.&lt;/p&gt;

&lt;p&gt;But AI agents do not stop at Level 1. They need the manifest to be &lt;em&gt;callable&lt;/em&gt; - endpoints that respond, keys that verify, handlers that process payments.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 4 Gaps Shopify Leaves Open
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Missing Signing Keys
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What you see:&lt;/strong&gt; JSON validates fine. No errors in your Shopify admin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What AI agents see:&lt;/strong&gt; No &lt;code&gt;signing_keys&lt;/code&gt; array in the manifest. Agents that verify manifest authenticity (and Google's agents do) cannot confirm the profile was published by the domain owner. This is a trust signal, not just a formality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Generate a key pair, add the public key to your UCP manifest's &lt;code&gt;signing_keys&lt;/code&gt; field, and sign your manifest responses. Shopify does not handle this automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; Build-breaking. Missing signing keys means agents skip your store or treat it as unverified.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. No Payment Handlers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What you see:&lt;/strong&gt; Checkout works in the browser. Customers buy things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What AI agents see:&lt;/strong&gt; The &lt;code&gt;payment_handlers&lt;/code&gt; array is empty or missing. Agents that want to complete a purchase on behalf of a user cannot determine which payment methods your store accepts through the UCP manifest alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Add each active payment method to &lt;code&gt;payment_handlers&lt;/code&gt; in your manifest. This includes credit cards, Shop Pay, Apple Pay, Google Pay - whatever your store accepts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; Build-breaking for checkout-capable agents. Discovery and browsing still work, but the purchase flow is blocked.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Missing Return Policy Schema
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What you see:&lt;/strong&gt; Your return policy is on a web page. Humans can read it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What AI agents see:&lt;/strong&gt; No structured return policy data in your manifest or linked schema. Agents cannot communicate return terms to users before purchase. For regulated categories (cosmetics, electronics), this is a hard blocker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Add a &lt;code&gt;returnPolicy&lt;/code&gt; field to your product schema or UCP manifest. Use Schema.org's &lt;code&gt;MerchantReturnPolicy&lt;/code&gt; type.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; Warning for most stores. Build-breaking for regulated product categories.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Organization Schema Gaps
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What you see:&lt;/strong&gt; Your About page exists. Your brand looks legitimate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What AI agents see:&lt;/strong&gt; No &lt;code&gt;Organization&lt;/code&gt; schema linked from your manifest. Agents that verify merchant identity (especially for first-time interactions) cannot confirm the business behind the store.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Add Schema.org &lt;code&gt;Organization&lt;/code&gt; markup to your store's homepage. Include &lt;code&gt;@id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;, and &lt;code&gt;contactPoint&lt;/code&gt; at minimum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; Warning. Does not block discovery, but reduces trust scoring for agents that cross-reference identity.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Actually Validate This
&lt;/h2&gt;

&lt;p&gt;Running &lt;code&gt;curl https://your-store.com/.well-known/ucp&lt;/code&gt; tells you the JSON exists. It does not tell you whether an AI agent can use it.&lt;/p&gt;

&lt;p&gt;Here is what to check instead:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Level 1 - Structural:&lt;/strong&gt; Does the JSON parse? Are required fields present? (Shopify handles this.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Level 2 - Rules:&lt;/strong&gt; Are capabilities consistent? Does your namespace match your origin? Are declared capabilities actually wired to endpoints? (Shopify partially handles this, but custom theme modifications can break it.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Level 3 - Network:&lt;/strong&gt; Do the endpoints in your manifest actually respond? Over HTTPS? With correct content types? With no trailing slashes? (Shopify handles the endpoints, but CDN misconfigurations, custom domains, and redirect chains can break reachability.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Level 4 - SDK:&lt;/strong&gt; Can a real AI agent complete a discovery-to-checkout flow? Can it browse, add to cart, and initiate payment? (This is where most "valid" manifests fail - the structure is right but the interaction flow breaks at runtime.)&lt;/p&gt;

&lt;h2&gt;
  
  
  The 5-Minute Checklist
&lt;/h2&gt;

&lt;p&gt;Run through this after enabling Agentic Storefronts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;curl -I https://your-store.com/.well-known/ucp&lt;/code&gt; - verify 200 status, &lt;code&gt;application/json&lt;/code&gt; content type, HTTPS&lt;/li&gt;
&lt;li&gt;Check the response for &lt;code&gt;signing_keys&lt;/code&gt; - if empty or missing, generate and add keys&lt;/li&gt;
&lt;li&gt;Check the response for &lt;code&gt;payment_handlers&lt;/code&gt; - if empty, list your active payment methods&lt;/li&gt;
&lt;li&gt;Check your homepage for &lt;code&gt;Organization&lt;/code&gt; schema - add if missing&lt;/li&gt;
&lt;li&gt;Check your product pages for &lt;code&gt;returnPolicy&lt;/code&gt; schema - add if missing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Or run a free 4-level validation at &lt;a href="https://ucptools.dev" rel="noopener noreferrer"&gt;ucptools.dev&lt;/a&gt; that checks all of this in one scan, including a simulated AI agent interaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;Shopify's Agentic Storefronts are the on-ramp, not the destination. They handle the hardest part (generating a spec-compliant manifest and wiring commerce endpoints). But the trust and completeness layer - signing keys, payment handlers, identity and return policy schema - is still on you.&lt;/p&gt;

&lt;p&gt;Most merchants will enable the feature, see the green checkmark in Shopify admin, and assume they are done. The ones who validate beyond Level 1 are the ones AI agents actually find and use.&lt;/p&gt;

&lt;p&gt;The gap between "enabled" and "discoverable" is where your competitors will also get stuck. Close it first.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Scan data from UCPtools' April 1, 2026 scan of 28 e-commerce domains. 0 healthy profiles found. 92% broken or missing. Full results at &lt;a href="https://ucptools.dev/directory" rel="noopener noreferrer"&gt;ucptools.dev/directory&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agenticcommerce</category>
      <category>ucp</category>
      <category>shopify</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
