Shopify payment declined codes, explained for subscription merchants

Moorly guides · Updated August 2026 · 9 min read

When a subscription renewal fails, somewhere behind that failure is a decline code — the short reason the payment system recorded for why the charge didn't go through. Shopify shows what it receives from the customer's bank in the order history, and Shopify's subscription billing API records an error code on every failed billing attempt. Most merchants never see these codes; subscription apps tend to surface only “payment failed.” That's a loss, because the code tells you what would actually recover the money — and the right responses to different codes are close to opposites.

The one distinction that matters: soft vs. hard declines

Retrying a hard decline wastes attempts and emails; sending a card-update ask for a soft decline adds friction the customer didn't need. Reading the code correctly is what our retry-schedule guide builds on.

The codes you'll actually see, by family

The names below follow the error codes Shopify's subscription billing API uses for failed billing attempts (the same reasons appear in slightly different spellings in order history and in gateway dashboards — insufficient_funds, INSUFFICIENT_FUNDS, and “insufficient funds” are the same decline).

Usually recoverable with a retry (soft)

Never recoverable with a retry (hard)

Ambiguous — the bank won't say (treat carefully)

Configuration errors — yours, not the customer's

Individual code guides

Each of the codes below has its own deep-dive — what it means, why it happens on renewals specifically, the exact merchant playbook, and whether retrying helps:

How to actually see these codes

  1. Order history: Shopify displays what the bank returned on the declined order — often generic, sometimes specific.
  2. Your subscription app: apps differ widely in how much failure detail they surface per renewal. If yours shows only “failed,” the reason still exists underneath — it's just not being shown to you. Our Appstle and Seal guides cover where each app keeps its failure information.
  3. The billing API: every failed subscription billing attempt in Shopify carries an error code from the list above — this is where recovery tooling reads the reason and picks a treatment.

The takeaway

You don't need to memorize fifty codes. You need the sort: retry-able, dead-card, ambiguous, or my-configuration — and a different response wired to each. A store that treats insufficient_funds and expired_card the same way is guaranteed to leave money in one of those two buckets, and usually both.

Where Moorly fits: Moorly reads the decline reason behind every failed renewal in your existing subscription app, classifies it into exactly this sort, and shows you the dollar figure per bucket — before you change anything. When you enable actions, each failure gets the treatment its code calls for, not a one-size-fits-all schedule. Join the early-access list →

Moorly is an independent product by Velun Labs and is not affiliated with Shopify, Appstle Inc., or Seal Subscriptions s.r.o. Code names and behavior follow Shopify's public API documentation as of August 2026 and may vary by gateway and plan — always confirm against your own admin.