Debugging Payment Declines: Understanding ISO 8583 Response Codes
A customer calls: “My card was declined, but I have money!” You check the logs and see Response Code: 05. What does that mean, and more importantly, how do you fix it?
Welcome to the world of ISO 8583 response codes — the two-character messages that make or break every card transaction on the planet.
What Are Response Codes?
Response codes (also called action codes or authorization codes) live in Field 39 of every ISO 8583 response message. When an issuing bank processes a transaction, it sends back a 2-character alphanumeric code indicating the result.
This code tells you one of three things:
| Response | Meaning | Example Codes |
|---|---|---|
| ✅ Approved | Transaction successful | 00, 10 |
| ❌ Declined | Transaction denied | 05, 51, 54 |
| ⚠️ Error | System/format issue | 30, 91, 96 |
Debug faster: Paste your full ISO 8583 message into our ISO 8583 Studio to extract Field 39 automatically.
Also Known As…
Response codes go by several names in the industry:
| Name | Context |
|---|---|
| Response Code | ISO 8583 specification |
| Action Code | Visa/Mastercard documentation |
| Authorization Response Code | Acquirer systems |
| Decline Code | When referring to rejections |
| Field 39 | Technical shorthand |
| DE 39 | Data Element 39 (formal ISO term) |
They all refer to the same thing!
The Most Common Response Codes
Let’s start with the codes you’ll encounter 90% of the time:
Approval Codes
| Code | Name | What It Means |
|---|---|---|
00 | Approved | Transaction successful. Proceed with sale. |
10 | Partial Approval | Approved for less than requested. Common with prepaid/gift cards. |
08 | Honor with ID | Approved, but verify cardholder identity. |
85 | AVS Only | Address verification processed. Card not charged. |
Hard Declines (Do Not Retry)
These declines won’t change if you retry. The cardholder needs to take action:
| Code | Name | Root Cause | Customer Action |
|---|---|---|---|
05 | Do Not Honor | Generic decline from issuer | Contact bank |
14 | Invalid Card Number | PAN doesn’t exist or fails Luhn | Fix card number |
41 | Lost Card | Card reported lost | Use different card |
43 | Stolen Card | Card reported stolen | Use different card |
51 | Insufficient Funds | Not enough balance | Add funds |
54 | Expired Card | Past expiration date | Use current card |
57 | Transaction Not Permitted | Card not authorized for this purchase type | Contact bank |
Tip: Response code
05(Do Not Honor) is the most frustrating — it’s a catch-all that means “declined, but we won’t tell you why.” The cardholder must contact their bank.
Soft Declines (Retry May Work)
These are temporary issues that may resolve with a retry or slight modification:
| Code | Name | Root Cause | Retry Strategy |
|---|---|---|---|
1A | SCA Required | 3D Secure authentication needed | Retry with 3DS |
51 | Insufficient Funds | Sometimes soft if funds are incoming | Wait and retry |
61 | Exceeds Limit | Daily limit hit | Wait until tomorrow |
65 | Exceeds Frequency | Too many transactions | Wait before retry |
91 | Issuer Unavailable | Bank system down | Retry in 30 seconds |
96 | System Error | Generic system failure | Retry immediately |
PIN and Security Codes
| Code | Name | Cause | Fix |
|---|---|---|---|
55 | Incorrect PIN | Wrong PIN entered | Re-enter correctly |
75 | PIN Tries Exceeded | Too many wrong attempts | Card may be blocked |
82 | CVV Validation Error | CVV/CVC mismatch | Verify 3-digit code |
N7 | CVV2/CVC2 Mismatch | Security code wrong | Re-enter CVV |
How to Debug a Payment Decline
When a transaction fails, follow this systematic approach:
Step 1: Extract the Response Code
If you have the raw ISO 8583 response, find Field 39. It’s always two characters.
0210723405412880880016491234567890123456000000001000000123456...05...
^^
Response Code
Quick decode: Use our ISO 8583 Studio to parse the complete message.
Step 2: Classify the Decline
| If Code Is… | Category | Next Action |
|---|---|---|
00, 10 | ✅ Approved | No action needed |
05, 14, 41-43, 51, 54 | ❌ Hard Decline | No retry; customer action needed |
1A, 91, 96 | ⚠️ Soft Decline | Retry with modifications |
55, 75, 82 | 🔐 Security Issue | Verify PIN/CVV entry |
30, 92 | 🛠️ Technical Error | Check your integration |
Step 3: Check Related Fields
Response codes don’t tell the whole story. Always examine:
| Field | Purpose | Why It Matters |
|---|---|---|
| Field 38 | Authorization Code | Present on approvals; needed for capture |
| Field 44 | Additional Response Data | Extra details on declines |
| Field 55 | EMV Data | Chip card cryptogram results |
For EMV transactions, the EMV tags inside Field 55 provide crucial context. Decode them with our EMV Tag Inspector.
Step 4: Implement Retry Logic
function shouldRetry(responseCode) {
// Soft declines - safe to retry
const softDeclines = ['91', '96', '19', '90', '92'];
// SCA required - retry with 3DS
const scaRequired = ['1A'];
// Hard declines - never retry automatically
const hardDeclines = [
'05', '14', '41', '43', '51', '54', '57',
'04', '07', '33', '59', '62', '63'
];
if (softDeclines.includes(responseCode)) {
return { retry: true, delay: 30000 }; // 30 second wait
}
if (scaRequired.includes(responseCode)) {
return { retry: true, requires3DS: true };
}
return { retry: false };
}
Brand-Specific Response Codes
Card networks sometimes use proprietary codes beyond the standard two-digit values:
Visa Codes
| Code | Name | Meaning |
|---|---|---|
Q1 | Card Authentication Failed | ARQC cryptogram failed |
R0 | Stop Payment Order | Recurring payment cancelled |
R1 | Revocation of Authorization | Customer revoked merchant auth |
R3 | Revocation of All Authorizations | Customer blocked all merchant charges |
P5 | PIN Change Failure | PIN update denied |
77 | Intervention Required | Call authorization center |
Mastercard Codes
| Code | Name | Meaning |
|---|---|---|
N0 | Force STIP | Stand-in processing activated |
N3 | Cashback Not Available | Cashback service unavailable |
N7 | CVV2 Mismatch | Card security code failed |
Discover D-PAS Codes
| Code | Name | Meaning |
|---|---|---|
Y1 | Offline Approved | Chip approved without issuer |
Y3 | Offline Approved (Fallback) | Couldn’t reach issuer, card approved |
Z1 | Offline Declined | Chip declined without issuer |
Z3 | Offline Declined (Fallback) | Couldn’t reach issuer, card declined |
Quick Reference Table
Here’s a printable cheat sheet of the most common codes:
| Code | Status | Name | Customer Message |
|---|---|---|---|
00 | ✅ | Approved | Payment successful |
05 | ❌ | Do Not Honor | Contact your bank |
10 | ✅ | Partial Approval | Partial payment accepted |
14 | ❌ | Invalid Card | Check card number |
41 | ❌ | Lost Card | Card reported lost |
43 | ❌ | Stolen Card | Card reported stolen |
51 | ❌ | Insufficient Funds | Not enough balance |
54 | ❌ | Expired Card | Card has expired |
55 | ❌ | Incorrect PIN | Re-enter PIN |
57 | ❌ | Not Permitted | Transaction type not allowed |
61 | ❌ | Limit Exceeded | Over daily limit |
75 | ❌ | PIN Tries Exceeded | Card blocked |
91 | ⚠️ | Issuer Unavailable | Try again shortly |
96 | ⚠️ | System Error | Try again |
What Response Codes DON’T Tell You
❌ They’re Not Always Accurate
Issuers sometimes send generic codes (05) when the real reason is more specific. This is intentional — revealing exact decline reasons could help fraudsters.
❌ They Don’t Explain Business Rules
A 57 (Transaction Not Permitted) doesn’t tell you which permission is missing. It could be:
- Card not enabled for international use
- Merchant category restricted
- Transaction size above card’s single-purchase limit
❌ They’re Not Standardized Across All Issuers
While ISO 8583 defines the codes, some issuers interpret them differently. One bank’s 51 might appear as another bank’s 05.
Integrating Response Codes in Your System
Best Practices
- Log everything: Store the full response, not just Field 39
- Map to user-friendly messages: Never show
05to customers; show “Please contact your bank” - Track decline rates by code: High
14rates suggest input validation issues - Implement automatic retries carefully: Only for soft declines, with exponential backoff
- Monitor for pattern changes: Sudden spikes in specific codes indicate problems
Example Decline Rate Report
SELECT
response_code,
COUNT(*) as decline_count,
ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 2) as percent
FROM transactions
WHERE response_code != '00'
GROUP BY response_code
ORDER BY decline_count DESC
LIMIT 10;
Complete Response Code Reference
For the full list of 60+ response codes with meanings and actions, visit our Reference Database. You can:
- Search by code number
- Filter by card network
- Copy descriptions directly
Next Steps
Now that you understand how to decode payment declines:
- Parse live messages: ISO 8583 Studio — Extract Field 39 from raw hex
- Decode EMV context: EMV Tag Inspector — Analyze Field 55 chip data
- Validate card numbers: Luhn Validator — Catch
14errors before submission - Browse all codes: Reference Database — Complete searchable reference
- Learn message structure: Understanding ISO 8583 Message Structure — Foundation for debugging
- Understand SCA declines: 3D Secure / SCA Guide — response code
1Ameans authentication is required - Comply with PCI logging: PCI DSS Guide — how to log decline codes without violating Requirement 10
- Analyze logs instantly: ISO 8583 AI Copilot Guide — learn how to use local AI to decode your payment data in plaintext.
- Route smarter with ML: AI-Driven Intelligent Payment Routing — how response code history powers ML models that optimize processor selection.
This post is part of the ISO 8583 Mastery series. Follow along as we explore payment messaging in depth.
Related Posts
💬 Discussion
Have a question or feedback? Leave a comment below — powered by GitHub Discussions.
What is an ISO 8583 Response Code (Field 39)?
Field 39 is a 2-character alphanumeric code indicating the final disposition of an authorization request. It tells the terminal whether the transaction was approved, declined, or if there was a system error.
What does a '00' response code mean?
A ‘00’ response code universally means ‘Approved and completed successfully’. It is the standard success code across all major card networks.
What is the difference between a '05' and '51' decline?
‘05’ means ‘Do Not Honor’, which is a generic decline from the issuer often related to fraud rules or account status. ‘51’ specifically means ‘Insufficient Funds’.