Understanding the NEW RETRY_DECLINED Reason in CustomerPaymentMethod Revocations

Shopify’s 2027-01 API adds a RETRY_DECLINED revocation reason for payment methods, helping developers distinguish processor blocks from consecutive failures. Learn what changed, who’s affected, and how to update your apps today.

Understanding the NEW RETRY_DECLINED Reason in CustomerPaymentMethod Revocations
7 sections

Shopify’s GraphQL Admin API version 2027‑01 introduces a subtle but important change to the CustomerPaymentMethod.revokedReason field. In addition to the existing TOO_MANY_CONSECUTIVE_FAILURES, the API now returns a new enum value RETRY_DECLINED when a payment processor blocks any further retry attempts on a subscription payment method. This post breaks down the update, explains who needs to care, and gives you concrete steps to make your apps and integrations future‑proof.

What Changed in the API

Previously, when a saved payment method was revoked because the processor refused further charges, the revokedReason field always reported TOO_MANY_CONSECUTIVE_FAILURES. Starting with version 2027‑01, Shopify distinguishes two scenarios:

• TOO_MANY_CONSECUTIVE_FAILURES – the usual case where multiple charge attempts failed in a row.

• RETRY_DECLINED – the processor has explicitly blocked any additional retries, meaning the merchant must replace the payment method before any future attempts.

Who Is Affected?

The change is primarily developer‑focused. Any app, custom integration, or theme that reads CustomerPaymentMethod.revokedReason needs to handle the new enum. Merchants indirectly benefit because the additional granularity lets your app surface clearer messages (e.g., “Your processor blocked further retries – please add a new card”). If you rely on webhooks alone, you’ll still receive the same customer_payment_methods/revoke payload, but you’ll need to query the updated field to differentiate the reasons.

How to Detect RETRY_DECLINED

  • Ensure your GraphQL client is set to version 2027‑01 or newer.
  • After receiving the customer_payment_methods/revoke webhook, make a follow‑up query:
  • graphql

    query GetRevokedReason($id: ID!) {

    customerPaymentMethod(id: $id) {

    revokedReason

    }

    }

    The revokedReason field will now return either "RETRY_DECLINED" or "TOO_MANY_CONSECUTIVE_FAILURES". Compare the string to trigger the appropriate UI flow.

    Updating Your App Logic

    If you previously treated every revocation as a generic failure, you’ll want to add branching logic. For example:

    javascript

    if (revokedReason === 'RETRY_DECLINED') {

    // Show merchant a message that the processor blocked retries

    // Prompt the buyer to add a new payment method

    } else if (revokedReason === 'TOO_MANY_CONSECUTIVE_FAILURES') {

    // Suggest the buyer update the existing card or retry later

    }

    By surfacing the exact cause, you reduce confusion, lower support tickets, and improve recovery rates for subscription revenue.

    Testing & Best Practices

  • Upgrade your API version in a sandbox store before pushing to production.
  • Simulate both revocation reasons using the GraphQL Explorer or a mock server.
  • Validate webhook handling – keep the existing webhook payload unchanged but add the extra query step.
  • Log the reason in your analytics to track how often each scenario occurs. This data can inform future payment‑method UI improvements.
  • Action Checklist for Developers

  • Switch your GraphQL client to API version 2027‑01 (or later).
  • Update any code that reads revokedReason to handle the new enum.
  • Add the post‑webhook query shown above.
  • Test both paths in a development store.
  • Deploy, monitor logs, and inform merchants of the improved messaging.
  • Conclusion & Next Steps

    The addition of RETRY_DECLINED gives you a clearer window into why a subscription payment method was disabled, enabling more precise messaging and faster recovery. Update your API version, adjust your revocation handling, and you’ll see a smoother experience for both merchants and buyers. Need help implementing the change? Reach out to our Shopify Partner support or drop a comment below – we’re happy to walk you through the integration.

    Tags
    Sources

    Related Articles

    Why Your Public App Must Add an IP Allowlist by November

    Why Your Public App Must Add an IP Allowlist by November

    Shopify now requires every public app that calls the Admin API to enable an IP allowlist. Learn the deadlines, how to configure it, and what to do if you use serverless or bulk operations.

    November 5, 20264 min
    Why IP Allowlists Are Now Mandatory for All Public Shopify Apps

    Why IP Allowlists Are Now Mandatory for All Public Shopify Apps

    Shopify now requires every public app to configure an IP allowlist by November 2026. Learn who’s affected, the exact deadlines, why it matters, and step‑by‑step instructions to stay compliant.

    November 5, 20264 min
    Serverless Apps Get IP Allowlist Support via ASNs – What You Need to Know

    Serverless Apps Get IP Allowlist Support via ASNs – What You Need to Know

    Shopify now lets serverless apps add their hosting provider’s ASNs to IP allowlists, simplifying security for dynamic egress IPs. Learn what changed, who’s impacted, and how to configure the new settings today.

    November 5, 20265 min
    Test Your App’s Network Access Settings Directly on Dev Stores

    Test Your App’s Network Access Settings Directly on Dev Stores

    Learn how Shopify’s new network access testing preview lets developers validate allowed hosts and sources on a dev store, avoid navigation warnings, and keep merchant sites secure.

    November 4, 20264 min