An authorization carries state. The instant the issuer approves a 0100, the cardholder's available balance drops by that amount (a hold), and it stays held until the transaction clears or the auth expires. That creates one fundamental problem:
A reversal is the mechanism that removes that disagreement: the originator tells the other side "that last one didn't happen β roll the state back." It is not a refund and not a new purchase; it is an instruction to undo one specific original transaction.
Line up the MTI's second digit (message class) first: x1xx = authorization, x2xx = financial, and x4xx = reversal / chargeback. The third digit (function) separates a request from an advice:
| MTI | Name | Meaning / when |
|---|---|---|
0400 | Reversal request | Acquirer asks to undo the original and waits for an answer. The other side may in principle refuse (rare in practice). |
0410 | Reversal response | The answer to a 0400; DE39 carries the outcome. |
0420 | Reversal advice | A notification of a done deal: "I have already reversed it; you must too." The receiver cannot refuse β only acknowledge. |
0430 | Reversal advice response | Acknowledges the 0420. If it doesn't arrive, the advice must be re-sent. |
Choosing 0400 vs 0420 is not a style preference. The test is: has the state change already happened on your side? If you merely *want* to undo it, send 0400 (a request). If you have already voided it locally, taken no money and booked it that way, you must send 0420 (an advice) β because you can no longer un-void it just because the other side said no. The classic failure is sending 0400, getting a decline, and being stuck: unable to reverse and unable not to.
This is the pair beginners conflate most often, and a rich source of incidents. A repeat re-sends the same transaction; a reversal sends a new message to undo it.
ISO 8583 marks repeats in the MTI's fourth digit (message origin):
| 4th digit | Meaning | Example |
|---|---|---|
0 | Acquirer | 0400 |
1 | Acquirer repeat | 0401 / 0421 |
2 | Issuer | 0422 |
3 | Issuer repeat | 0423 |
4 | Other | 0424 |
5 | Other repeat | 0425 |
When to repeat, when to reverse? In one line: unsure whether they processed it β repeat and ask again; sure they processed it but you no longer want it β reverse. The common production pattern is "repeat N times, still nothing, then reverse" rather than reversing immediately β because a repeat is harmless if the receiver is idempotent.
A reversal cannot just say "undo the last one" β the issuer may be handling thousands in the same second. It must carry enough identity to locate the original, and that is DE90, Original Data Elements: a fixed 42-digit field made of five parts:
| Offset | Len | Content |
|---|---|---|
| 1β4 | 4 | Original MTI (e.g. 0100 / 0200) |
| 5β10 | 6 | Original DE11 STAN |
| 11β20 | 10 | Original DE7 transmission date & time, MMDDhhmmss |
| 21β31 | 11 | Original DE32 acquiring institution ID (zero-padded) |
| 32β42 | 11 | Original DE33 forwarding institution ID (zeros if none) |
Paste those 42 digits into the parser and it splits them for you. Three frequent mistakes:
Beyond DE90, a reversal normally echoes DE2 (PAN), DE3 (processing code), DE4 (amount), DE37 (RRN) and DE41/42 (terminal/merchant) so the receiver can cross-check. On several networks DE37 RRN is the actual primary match key, with DE90 as the fallback β check the counterparty's spec.
Not every reversal is all-or-nothing. Classic cases: a fuel pump pre-auth of 150 where the customer actually pumped 92.40, or a restaurant pre-auth padded for tip that settles lower. You want to release the over-held portion, not cancel the whole thing β that's a partial reversal.
It travels in DE95, Replacement Amounts β fixed 42 characters in four parts:
| Len | Content |
|---|---|
| 12 | Replacement transaction amount (mirrors DE4) |
| 12 | Replacement settlement amount (mirrors DE5) |
| 12 | Replacement cardholder billing amount (mirrors DE6) |
| 6 | Replacement cardholder billing fee (mirrors DE8) |
000000009240 (the remainder), not 60.60 (the difference). Sending the difference is a classic incident: the issuer resets the hold to 60.60 and the cardholder is left with 90 mysteriously held.And amounts are always integers in the currency's minor unit, left zero-padded β the yen has no decimals, the dinar has three; never blanket-multiply by 100. See why amounts have no decimal point.
To the acquirer a timeout is one symptom: sent, no answer. Underneath it can be three completely different states β and the acquirer cannot tell which:
| Case | Issuer's actual state | Correct action |
|---|---|---|
| A. Request lost in transit | Nothing happened, no hold | Repeat is safe |
| B. Response lost on the way back | Approved, funds held | Must reverse, else an orphaned hold |
| C. Issuer slow, response arrives late | Approved; arrives after you gave up | Merchant already told "failed" β reverse too |
Since you can't distinguish them, the industry norm is to over-reverse rather than under-reverse: repeat first, then send a reversal if still nothing. Even if the original never reached the issuer (case A), the issuer receiving an unmatchable reversal still answers successfully and records it β an "unmatched reversal" is normal, not an error.
DE39=00 almost unconditionally. Even with no original to match, record an "unmatched reversal" and approve β do not answer 25 (unable to locate record). The practical reason: a failed reversal makes the acquirer retry forever, saturating your link, and the states still disagree. An unmatched reversal is something you resolve in reconciliation, not grounds for rejecting the other side.Also mind stand-in processing (STIP) when the issuer is unavailable (DE39=91): the network decides on the issuer's behalf and informs it afterwards with a 0120 / 0220 advice. Those are likewise faits accomplis β the issuer must book them, not refuse them. See the DE39 reference.
Since both repeats and reversals can arrive more than once, the receiving side must be idempotent. The question is what the unique key is. DE11 STAN alone is not enough: six digits, unique only within a day by definition, guaranteed to recycle across days and liable to collide between terminals at peak. The composite key used in practice:
The dedup window must cover the counterparty's retry policy plus the day cutover β 24β48 hours is typical β and it must cache the response too: a duplicate must get back byte-identical results (same DE39, same DE38 auth code), not a fresh decision. Re-deciding produces the bizarre inconsistency of "approved first time, insufficient funds on the retry".
These four get used interchangeably in conversation, but at the message level they are four different things, with different money paths and timing:
| Action | Message | When | On the statement |
|---|---|---|---|
| Reversal | 0400/0420 | Before clearing, seconds to minutes | The original never appears; the hold just drops |
| Void | Usually 0400, or a 0200 with a void processing code | Same day, before capture | Same β usually never hits the statement |
| Refund | 0200 with processing code 20xxxx | After clearing, any time | Two entries: the purchase and a credit |
| Chargeback | 0442/0432 and other dispute messages | After clearing, within network time limits (often 120 days) | Two entries, plus a dispute process |
The single most useful line for ops and support: reverse if you still can, refund only if you must. A reversal completes before clearing β the statement stays clean and the balance frees instantly. A refund is a new credit transaction that must clear in full: the cardholder waits days, sees two lines, and on cross-border transactions can lose money on the exchange rate because the amount is converted twice.
If a reversal never lands β retries exhausted, or never sent at all β the issuer is left holding funds against a transaction that will never clear: an orphaned hold or dangling authorization. Symptoms:
The safety net is auth expiry: the issuer gives each hold a lifetime (7 days typically, 30 for hotels and car rental) and releases it automatically if nothing clears. But that's a backstop, not a fix β the cardholder waits a week. The real answer is all three of:
Given a "reversal didn't work" message in hand, walk these in order β nine times out of ten it lands:
0400 or 0420 β is your case a request or a fait accompli? Is the fourth digit accidentally flagged as a repeat?00 means they took it (so your own state machine is the issue); 25 means the match failed (back to steps 2β3); 91 means their host is down (switch to advice and re-send).00 almost unconditionally.