Skip to content

Decline code 12: Invalid Transaction

Calum EwingBy Calum Ewing · Head of FulfillmentReviewed by Jay StevensUpdated 3 min read
Summarize with AI

Quick answer

Decline code 12 — “Invalid Transaction” — is an ISO 8583 response code meaning the cardholder's issuing bank rejected the transaction itself as invalid: the request was malformed, used an unsupported transaction type, or named a card the issuer won't process this way. It's a hard decline, so an immediate retry of the same request fails again. Stripe surfaces the equivalent as a generic card_declined error, and Authorize.net returns it as response reason code 2 (Declined).

What code 12 means

Hard declineDo not retry

Don't blindly retry a 12 — the issuer is rejecting the request as malformed or not permitted, so re-sending the identical charge fails the same way. Fix the offending field or confirm the customer's card with them, then re-attempt; outreach beats back-to-back retries.

Cross-processor equivalents

The same issuer decision surfaces under a different code on every processor. Here is how code 12 maps across the stacks Revatto recovers on.

ISO 8583
Code12
CalledInvalid Transaction
Stripe
Codegeneric_decline
CalledGeneric declinealso card_declined
Braintree
Code2038
CalledProcessor Declined
Authorize.net
Code2
CalledDeclinedresponseReasonCode 2 — generic issuer decline
NMI
Code200
CalledTransaction declined
Chargebee
Codecard_declined
CalledCard declined
Recurly
Codedeclined
CalledDeclined
IxoPay
Code2002
CalledDeclined
Shopify
CodePAYMENT_METHOD_DECLINED
CalledPayment method declined
Whop
Codecard_declined
CalledCard declinednormalized — no processor-specific code (free-text categorized)
Fanbasis
Codecard_declined
CalledCard declinednormalized — matched by substring rule, no processor-specific code

Why it happens

  • The transaction request was malformed or carried an unsupported transaction type the issuer's system rejected outright.
  • The card or account isn't enabled for this kind of charge — e.g. a card not provisioned for recurring, card-not-present, or international transactions.
  • A field mismatch the issuer treats as invalid, such as an amount, currency, or processing code the issuer won't honor for that card.
  • The cardholder's bank applies a restriction that makes the requested transaction impermissible (some issuers return 12 instead of a more specific code).
  • A stale token or recently reissued card whose details no longer line up with what the issuer expects for the request.

How to recover it

  1. 1Don't re-run the exact same request — an unchanged 12 declines again and adds to your decline ratio without recovering anything.
  2. 2Check the transaction fields you control first (transaction type, amount, currency, card token) so an internal misconfiguration isn't the cause.
  3. 3Reach the customer on a channel they actually answer — email and SMS — let them know the bank declined the charge as invalid and ask them to confirm or update the card.
  4. 4
    When it persists, a real person — not another automated email — works the card update directly. That AI-plus-human handoff is exactly what Revatto does for you: AI-timed retries where the processor's API supports them, plus email, SMS, and human outreach, fully done-for-you. You only pay if it works — 20% of the first recovered payment, $0 setup, $0 monthly, cancel anytime.See how Revatto recovers 12declines →

See what Revatto would recover for you

Failed payments recovered automatically — no engineering, no manual chasing. We do the work; you keep the revenue.

See Your Recovery Potential

Frequently asked questions