Decline code 12: Invalid Transaction
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
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.
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
- 1Don't re-run the exact same request — an unchanged 12 declines again and adds to your decline ratio without recovering anything.
- 2Check the transaction fields you control first (transaction type, amount, currency, card token) so an internal misconfiguration isn't the cause.
- 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.
- 4When 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.