Learn

Credit Card Decline Codes: Complete Reference for Subscription Businesses

Credit card decline codes are the standardized responses that issuing banks return when they reject a charge. For subscription businesses, understanding these codes is essential for building effective payment recovery. Each code tells you whether to retry, email the customer, or accept the loss. This reference covers every decline code you will encounter on Stripe, organized by recoverability.

Soft Declines: Temporary Issues That Resolve on Retry

Soft declines indicate a temporary problem. The card and account are valid, but something prevented this specific charge from going through at this specific moment.

insufficient_funds — The most common soft decline. The account does not have enough balance to cover the charge right now. Retry after 24-72 hours aligned with payday cycles. Recovery rate: 50-65%.

processing_error — A system error at the bank or card network. Nothing is wrong with the card. Retry in 1-4 hours. Recovery rate: 80-90%.

try_again_later — The bank explicitly asks you to retry. Wait 2-4 hours and retry. Recovery rate: 70-80%.

approve_with_id — The bank needs the cardholder to verify the charge through their banking app or a phone call. Retry after 24 hours to give the cardholder time to act. Recovery rate: 40-55%.

issuer_not_available — The bank's systems are temporarily offline. Retry in 2-6 hours. Recovery rate: 75-85%.

reenter_transaction — The bank's system needs a fresh transaction attempt. Retry immediately or within 1 hour. Recovery rate: 85-95%.

Collectively, soft declines account for about 55-65% of all payment failures and have the highest recovery rates. These are the charges Revive prioritizes for aggressive retry scheduling.

Hard Declines: Permanent Issues Requiring Customer Action

Hard declines mean the card cannot be charged again in its current state. Retrying will not help — the customer must update their payment method.

expired_card — The card's expiration date has passed. The customer needs to provide their new card number. Do not retry. Send a payment update email immediately. This accounts for 15-20% of all declines.

stolen_card / lost_card — The card has been reported compromised. Never retry. The bank may flag your merchant account if you do. Email the customer to provide a new card.

card_not_supported — The card type (e.g., a specific prepaid card) does not support recurring charges. The customer needs a different card.

invalid_account — The bank account tied to the card is closed. The customer must provide a completely new card.

pickup_card — A severe fraud indicator. The bank is instructing a physical merchant to confiscate the card. In an online context, this means the card is permanently blocked.

For hard declines, the only recovery path is customer communication. Send a clear, branded email explaining that their card needs to be updated, and provide a frictionless link to enter new payment details.

Ambiguous Declines: Case-by-Case Judgment Calls

Some decline codes fall between soft and hard. They may resolve on retry or may require customer intervention — it depends on the specific situation.

card_declined (generic) — The catch-all code returned when the bank does not provide a specific reason. This is the most frustrating code because it could mean anything from a temporary fraud hold to a permanent block. Best practice: retry 2-3 times over 48 hours. If retries fail, email the customer. Recovery rate: 30-45%.

do_not_honor — The bank has declined the charge and will not explain why. This code sometimes resolves on retry (the bank cleared an automated flag) and sometimes does not (the bank has a policy against the charge). Retry once after 24 hours. If it fails again, email the customer. Recovery rate: 20-35%.

authentication_required — Not exactly a decline, but a request for 3D Secure verification. Do not retry without authentication. Send the customer a payment link that includes the 3DS challenge. Recovery rate when properly handled: 60-70%.

card_velocity_exceeded — The card has hit a spending or transaction frequency limit. This may resolve after 24 hours when limits reset, or it may be a permanent limit. Retry once after 24 hours. Recovery rate: 35-50%.

Revive handles ambiguous declines with a blended strategy: retry at the optimal window while preparing a recovery email as backup. If the retry succeeds, the email never sends.

Regional and Network-Specific Decline Codes

Card networks (Visa, Mastercard, Amex, Discover) each have proprietary decline codes that Stripe normalizes into its standard set. However, some regional patterns are worth knowing.

European cards increasingly return authentication_required under PSD2/SCA regulations. If you have significant European customers, expect 10-15% of declines to require 3D Secure handling rather than simple retries.

Prepaid and debit cards fail at higher rates than credit cards because they lack credit buffers. A debit card hitting insufficient_funds is more common than the same code on a credit card. If your customer base skews toward debit card users, budget for a higher decline rate and more aggressive retry scheduling.

Corporate and virtual cards have unique failure patterns. Corporate cards may decline because of purchasing controls, expense category restrictions, or monthly spend limits set by the company's finance team. These require the cardholder to contact their company's admin.

International charges face higher decline rates due to cross-border fraud detection. If you charge customers in currencies different from your Stripe account's settlement currency, expect a 2-5% higher decline rate and consider using Stripe's local payment methods to reduce friction.

Using Decline Codes to Improve Your Overall Approval Rate

Decline codes are not just reactive recovery data — they are proactive optimization signals.

If expired_card is your top decline reason, you have a card updating problem. Enable Stripe's automatic card updater, and consider sending pre-dunning emails to customers with cards expiring next month.

If insufficient_funds dominates, look at your billing date. Charging on the 1st or 15th of the month (common paydays) may improve approval rates. Some businesses see a 5-10% improvement just by shifting their billing cycle.

If authentication_required is growing, you need to implement or improve your 3D Secure flow. Stripe's Payment Intents API handles SCA gracefully — make sure your integration uses it.

If generic card_declined is your top code, your bank relationships may need attention. Contact Stripe support to review your merchant category code (MCC) and ensure your business descriptor is clear on cardholder statements.

Revive provides a decline code breakdown in your recovery dashboard, showing which codes are most common and which have the highest recovery rates. Use this data to identify patterns and optimize your billing configuration proactively.

Key Takeaways

  • Soft declines (insufficient_funds, processing_error) are recoverable with retries — they make up 55-65% of all failures
  • Hard declines (expired_card, stolen_card) require customer outreach, not retries
  • Generic card_declined is the most common and trickiest code — use a blended retry + email approach
  • Decline code patterns reveal billing optimization opportunities beyond just recovery

Automate Your Payment Recovery

Revive uses everything in this guide — smart retries, decline-code routing, and branded recovery emails — on autopilot. Connect Stripe in 30 seconds.