How to Fix "UCP payment_handlers missing or empty"
Your manifest has valid JSON, correct namespace, proper origin. AI agents can even discover your store. But when they try to buy, it breaks - because your payment_handlers array is empty, missing, or declaring methods you don't support. Here's how to close the gap.
What are UCP payment_handlers?
payment_handlers is a required array in your UCP manifest that declares every payment method your store accepts. Each entry is a reverse-domain identifier - like com.google.pay for Google Pay or dev.shopify.card for Shopify's card handler.
When an AI shopping agent reads your manifest, it checks this array to answer one question: "Can I actually complete a purchase here?" The array sits inside the Payment capability block:
{
"capabilities": {
"payment": {
"spec_origin": "https://ucp.dev",
"endpoint": "https://yourstore.com/api/ucp/payment",
"payment_handlers": [
"com.stripe.pay",
"com.paypal.checkout"
]
}
}
}Why this breaks AI agent purchases
AI agents don't guess payment methods. They read your declared handlers and match them against the payment credentials the user has authorized. Step by step:
- Agent discovers your store and reads the manifest
- Agent sees
payment_handlers: [](or the field is missing entirely) - Agent checks: "Does this store support any payment method I can use?"
- Answer: "No payment methods declared."
- Agent tells the user the store doesn't support a payment method it can process - or simply skips your store
Even if the rest of your manifest is perfect, an empty payment_handlers array means AI agents cannot transact. Your store is discovered but unfundable - functionally the same as invisible.
The 4 types of payment_handlers failures
1. Empty array (most common)
{ "payment_handlers": [] }Valid JSON, field exists - but it tells agents you accept zero payment methods. This happens most often when a platform or plugin auto-generates a skeleton manifest without populating handlers.
2. Missing entirely
The field isn't present at all in the Payment capability. Agents treat this identically to an empty array. The UCP spec requires this field for any profile supporting Payment capability.
3. Wrong handler namespaces
{ "payment_handlers": ["stripe", "paypal", "shop_pay"] }These are NOT valid identifiers. The spec requires reverse-domain notation: com.stripe.pay, com.paypal.checkout, dev.shopify.shop_pay. Bare names are unrecognized and treated as if no handlers exist.
4. Declared handlers don't match actual setup
{ "payment_handlers": ["com.google.pay", "com.apple.pay"] }Your manifest says you accept Google Pay and Apple Pay, but your store is on Shopify with Shopify Payments only. The agent attempts a Google Pay transaction and it fails. This is the hardest failure to catch - it passes structural, rules, and even network checks. Only simulation testing finds it.
How to fix payment_handlers
Fix 1: Declare every supported payment method
Shopify (with Shopify Payments):
{
"payment_handlers": [
"dev.shopify.card",
"dev.shopify.shop_pay",
"com.google.pay",
"com.apple.pay"
]
}Stripe-powered: ["com.stripe.pay"]. WooCommerce with multiple gateways: ["com.woocommerce.txpg", "com.paypal.checkout", "com.stripe.pay"].
Fix 2: Use correct reverse-domain namespaces
| Payment Provider | Valid Handler Namespace |
|---|---|
| Shopify Payments / Card | dev.shopify.card |
| Shop Pay | dev.shopify.shop_pay |
| Google Pay | com.google.pay |
| Apple Pay | com.apple.pay |
| Stripe | com.stripe.pay |
| PayPal | com.paypal.checkout |
| WooCommerce | com.woocommerce.txpg |
| UCP Delegate Payment | dev.ucp.delegate_payment |
Fix 3: Match handlers to your actual infrastructure
This is the step most guides skip. List every payment method your store actually processes, map each to its correct namespace, and declare ONLY those - no aspirational methods. Adding com.google.pay when you don't support it causes agent-side failures invisible in your own testing.
Fix 4: Verify handlers work through UCP endpoints
Your payment endpoint must receive payment requests from agents, route them to the correct handler based on the declared namespace, and return standardized responses. If your endpoint only handles a different handler or returns errors, agents fail at the network level.
How to test your fix
Payment handler failures span multiple levels. Level 1 and 2 catch empty arrays and bad namespaces. Level 3 and 4 are where the mismatch between declared handlers and actual infrastructure shows up - if you declare com.google.pay but don't support it, only a full simulation catches the failure. See the four levels of UCP validation.
Confirm agents can actually pay
Run a free 4-level validation - including the agent simulation that catches handler mismatches your own testing won't.
Validate Your Store Free