Skip to content

Decline Codes Fresh

When a charge fails, Stripe returns a decline_code on the error object. Use these to show appropriate messages and determine next steps.

How decline codes work

Decline codes appear on card_error type errors. The error object includes:

  • type: "card_error" — identifies this as a card decline
  • decline_code — the specific reason code
  • message — a human-readable message (safe to show users for card errors)
  • charge — the ID of the failed charge
javascript
try {
  const paymentIntent = await stripe.paymentIntents.confirm(id);
} catch (err) {
  if (err.type === 'StripeCardError') {
    console.log(err.decline_code); // e.g., 'insufficient_funds'
    console.log(err.message);      // safe to show the customer
  }
}

Card decline codes

Decline codeDescriptionNext steps
authentication_requiredTransaction requires authentication (3DS)Retry with 3DS flow; for off-session, ask customer to authenticate on-session
authentication_not_handledAuth required but not performedRun 3DS / SCA flow before retrying
approve_with_idPayment cannot be authorizedRetry once; if still failing, customer contacts issuer
call_issuerDeclined for unknown reasonCustomer contacts their card issuer
card_not_supportedCard doesn't support this purchase typeCustomer contacts issuer to enable this purchase type
card_velocity_exceededBalance, credit limit, or transaction limit exceededCustomer contacts issuer
currency_not_supportedCard doesn't support this currencyCustomer checks with issuer
do_not_honorDeclined for unknown reasonCustomer contacts issuer
duplicate_transactionIdentical amount and card submitted recentlyCheck if a recent payment already exists
expired_cardCard has expiredCustomer uses another card
fraudulentStripe suspects fraudPresent as generic_decline — don't reveal fraud detection to customer
generic_declineUnknown reason or blocked by RadarCustomer contacts issuer
incorrect_addressAddress entered is incorrectCustomer retries with correct address
incorrect_cvcCVC number is incorrectCustomer retries with correct CVC
incorrect_numberCard number is incorrectCustomer retries with correct card number
incorrect_pinPIN is incorrect (card-present only)Customer retries with correct PIN
incorrect_zipPostal code is incorrectCustomer retries with correct postal code
insufficient_fundsCard has insufficient fundsCustomer uses alternative payment method
invalid_accountCard or account is invalidCustomer contacts issuer
invalid_amountPayment amount is invalid or exceeds limitCustomer checks with issuer
invalid_cvcCVC is incorrectCustomer retries with correct CVC
invalid_expiry_monthExpiration month is invalidCustomer retries with correct expiry
invalid_expiry_yearExpiration year is invalidCustomer retries with correct expiry
invalid_numberCard number is incorrectCustomer retries with correct card number
invalid_pinPIN is incorrectCustomer retries with correct PIN
issuer_not_availableCard issuer couldn't be reachedRetry the payment; if still failing, customer contacts issuer
lost_cardCard reported lostPresent as generic_decline
merchant_blacklistMatches a value on your block listPresent as generic_decline
new_account_information_availableCard or account is invalidCustomer contacts issuer
no_action_takenDeclined for unknown reasonCustomer contacts issuer
not_permittedPayment not permittedCustomer contacts issuer
offline_pin_requiredCard requires a PINCustomer inserts card and enters PIN
online_or_offline_pin_requiredCard requires a PINPrompt for Online PIN if reader supports it; otherwise customer inserts and enters PIN
pickup_cardCard may be reported lost or stolenCustomer contacts issuer
pin_try_exceededToo many incorrect PIN attemptsCustomer uses another card or payment method
processing_errorError during card processingRetry the payment; if still failing, try again later
reenter_transactionIssuer couldn't process for unknown reasonRetry; if still failing, customer contacts issuer
restricted_cardCard restricted (may be lost or stolen)Customer contacts issuer
revocation_of_all_authorizationsDeclined for unknown reasonCustomer contacts issuer
revocation_of_authorizationDeclined for unknown reasonCustomer contacts issuer
security_violationDeclined for unknown reasonCustomer contacts issuer
service_not_allowedDeclined for unknown reasonCustomer contacts issuer
stolen_cardCard reported stolenPresent as generic_decline
stop_payment_orderDeclined for unknown reasonCustomer contacts issuer
testmode_declineStripe test card number used in live modeUse a real card for live payments
transaction_not_allowedDeclined for unknown reasonCustomer contacts issuer
withdrawal_count_limit_exceededCustomer exceeded balance or credit limitCustomer uses alternative payment method
mobile_device_authentication_requiredTransaction requires device authenticationRetry by tapping mobile device again

Sensitive decline codes

Do NOT reveal the actual reason for these codes to customers. Present all of them as a generic decline:

  • fraudulent
  • lost_card
  • stolen_card
  • merchant_blacklist

Show the customer: "Your card was declined. Please contact your card issuer or use a different payment method."

Local payment method decline codes

Decline codeDescriptionNext steps
partner_generic_declinePayment provider declinedCustomer contacts payment provider
invalid_customer_accountCan't charge customer's accountCustomer resolves issue with their account
payment_limit_exceededOrder exceeds account limitCustomer resolves limit with payment provider
invalid_billing_agreementBilling agreement is invalidPayment method is invalid; retries won't succeed
processing_errorPayment provider processing errorRetry
insufficient_fundsInsufficient funds with payment providerCustomer uses alternative
currency_not_supportedCurrency not supported by payment providerRetries won't succeed
invalid_amountAmount not allowedRetries won't succeed
compliance_violationViolates terms of service or applicable lawsRetries won't succeed
duplicate_transactionIdentical transaction submitted recentlyCheck for existing payment
recurring_not_supported_by_bankBank doesn't support recurring for this methodCustomer selects a bank that supports recurring

Handling declines in code

javascript
const express = require('express');
const stripe = require('stripe')('sk_test_YOUR_KEY');
const app = express();

app.post('/charge', async (req, res) => {
  try {
    const paymentIntent = await stripe.paymentIntents.confirm(req.body.paymentIntentId);
    res.json({ success: true });
  } catch (err) {
    if (err.type === 'StripeCardError') {
      // Safe to show to customer
      res.status(402).json({
        error: err.message,
        decline_code: err.decline_code,
      });
    } else {
      // Don't expose internal errors to customers
      console.error(err);
      res.status(500).json({ error: 'An error occurred. Please try again.' });
    }
  }
});

Retrying declined charges

Decline codeRetryable?Notes
insufficient_fundsYes (later)Customer may top up account
processing_errorYesTransient error
issuer_not_availableYesTransient error
card_declined / generic_declineYes (once)Try once; if declined again, ask for alternate
expired_cardNoNeeds new card
invalid_cvc / incorrect_cvcNoNeeds correction
lost_card / stolen_cardNoCard is invalid
fraudulentNoDon't retry

Stripe API Reference - Self-contained docs reference, refreshed 2026-05-18