7 min read

How to Fix UCP payment_handlers Missing or Empty - Complete Guide (2026)

AI agents can discover your store but can't complete a purchase. Fix your payment_handlers array and close the gap between discovery and transaction.

How to Fix "UCP payment_handlers missing or empty" - Complete Guide (2026)

Your UCP manifest has valid JSON, correct namespace, proper origin. AI agents can even discover your store. But when they try to initiate a purchase, it all breaks. The reason: your payment_handlers array is empty, missing, or declaring payment methods your store doesn't actually support.

This is the gap between "being discovered" and "being purchasable." Here's how to close it.

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 payment handler.

When an AI shopping agent reads your manifest, it checks this array to answer one question: "Can I actually complete a purchase here?" If the array is empty, missing, or listing handlers that don't match your actual payment infrastructure, the answer is no.

The payment_handlers array sits inside the Payment capability block of your manifest:

{
  "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.

Here's what happens step by step:

  1. Agent discovers your store and reads the manifest
  2. Agent sees payment_handlers: [] (or the field is missing entirely)
  3. Agent checks: "Does this store support any payment method I can use?"
  4. Answer: "No payment methods declared."
  5. Agent tells the user: "This store doesn't support any payment method I can process" - or simply skips your store in search results

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 - which is functionally the same as invisible.

The 4 types of payment_handlers failures

1. Empty array (most common)

{
  "payment_handlers": []
}

This validates structurally - it's valid JSON, the 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 but doesn't populate the payment handlers.

2. Missing entirely

The payment_handlers field isn't present at all in the Payment capability. Agents treat this identically to an empty array - no payment methods available. 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 payment handler identifiers. The UCP spec requires reverse-domain notation: com.stripe.pay, com.paypal.checkout, dev.shopify.shop_pay. Bare names like "stripe" or "paypal" are unrecognized by agents and treated as if no handlers exist.

4. Declared handlers don't match actual payment 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. An AI agent attempts a Google Pay transaction through your UCP endpoint - and it fails because your actual payment infrastructure doesn't support that handler.

This is the hardest failure to catch because it passes structural, rules, and even network-level checks. You need simulation testing (SDK level) to find it.

How to fix payment_handlers

Fix 1: Declare every supported payment method

List every payment provider your store actually accepts:

Shopify stores (with Shopify Payments):

{
  "payment_handlers": [
    "dev.shopify.card",
    "dev.shopify.shop_pay",
    "com.google.pay",
    "com.apple.pay"
  ]
}

Stripe-powered stores:

{
  "payment_handlers": [
    "com.stripe.pay"
  ]
}

WooCommerce with multiple gateways:

{
  "payment_handlers": [
    "com.woocommerce.txpg",
    "com.paypal.checkout",
    "com.stripe.pay"
  ]
}

Fix 2: Use correct reverse-domain namespaces

Every handler must use a reverse-domain identifier that the payment provider and UCP spec recognize:

Payment ProviderValid Handler Namespace
Shopify Payments / Carddev.shopify.card
Shop Paydev.shopify.shop_pay
Google Paycom.google.pay
Apple Paycom.apple.pay
Stripecom.stripe.pay
PayPalcom.paypal.checkout
WooCommercecom.woocommerce.txpg
UCP Delegate Paymentdev.ucp.delegate_payment

Never use bare names. An agent that doesn't recognize the namespace will skip the handler entirely.

Fix 3: Match manifest handlers to your actual payment infrastructure

This is the step most guides skip. After declaring handlers, verify they work:

  1. List every payment method your store actually processes
  2. Map each to its correct UCP handler namespace
  3. Declare ONLY those handlers - no aspirational methods you don't yet support
  4. Test: can your payment endpoint actually process a transaction using each declared handler?

Adding com.google.pay to your manifest when your store doesn't support Google Pay will cause agent-side failures that are invisible in your own testing.

Fix 4: Verify handlers work through UCP endpoints

Your payment endpoint (declared in the Payment capability) must be able to:

  • Receive payment requests from AI agents
  • Route them to the correct handler based on the declared namespace
  • Return standardized payment responses
{
  "payment": {
    "spec_origin": "https://ucp.dev",
    "endpoint": "https://yourstore.com/api/ucp/payment",
    "payment_handlers": [
      "com.stripe.pay"
    ]
  }
}

The endpoint at /api/ucp/payment must accept payment requests keyed to com.stripe.pay. If your endpoint only handles a different handler or returns errors, agents will fail at the network level.

How to test your fix

Payment handler failures span multiple validation levels:

  1. Structural (Level 1): Is payment_handlers present as an array? Is it valid JSON?
  2. Rules (Level 2): Are handler namespaces valid reverse-domain identifiers? Do they match known payment providers?
  3. Network (Level 3): Can your payment endpoint accept and route requests for each declared handler?
  4. SDK/Simulation (Level 4): Can an AI agent actually complete a payment using one of your declared handlers?

Level 1 and Level 2 checks catch empty arrays and bad namespaces. But Level 3 and Level 4 are where the mismatch between declared handlers and actual payment infrastructure shows up. If you declare com.google.pay but don't support it, only a full simulation catches the failure.

Run a free 4-level validation at ucptools.dev to catch payment handler failures across all four levels in one scan - plus every other failure class.

Common related failures

If you're fixing payment_handlers, also check:

  • Missing signing_keys - agents need cryptographic verification before processing payments. Payment handlers declare what you accept; signing_keys prove the transaction is legitimate
  • Checkout capability incomplete - payment handlers live inside the Payment capability, but the transaction flow requires a working Checkout capability too
  • Namespace/origin mismatch - a payment handler declared under a mismatched origin is treated as untrusted
  • HTTP instead of HTTPS - all UCP payment endpoints require HTTPS. HTTP payment endpoints cause hard failures

Quick reference: payment_handlers requirements

FieldRequired?FormatCommon Mistake
payment_handlers arrayYes (if Payment capability present)Array of reverse-domain stringsEmpty array, missing field
Handler namespaceMust be valid reverse-domaincom.google.pay, dev.shopify.cardBare names like "stripe" or "paypal"
Handler countAt least 1 handlerMatch your actual payment setupDeclaring handlers you don't support
Payment endpointMust route to correct handlerMatch handler namespace to payment processorGeneric endpoint that can't route by handler

Last updated: May 2026. UCP spec version 1.2. Payment_handlers is a required field within the Payment capability. Empty or missing arrays cause agents to skip your store in purchase flows - structural validation alone does not detect this.

← Back to Blog