The single biggest mistake in LLM-assisted dispute work is asking the model to read everything and write a rebuttal. A rebuttal is only persuasive if it answers the specific claim the cardholder made, and that claim arrives as a reason code. Visa organizes its codes into four categories (Fraud, Authorization, Processing Errors, Consumer Disputes), and Mastercard uses an equivalent four-category structure with four-digit codes such as 4837 for no cardholder authorization and 4853 for a cardholder dispute, as catalogued in this guide to chargeback reason codes. Each code also dictates the evidence the issuer expects and the deadline attached to it.
This gives you your first design decision: the reason code is the agent's input, and it selects the evidence checklist before any document is read. Stripe's dispute documentation groups hundreds of payment-method-specific codes into eight categories based on the type of claim and the evidence required to challenge it, which is a useful mental model even if you do not process on Stripe. The categories collapse into a small number of evidence shapes:
| Dispute shape | Typical claim | Evidence the pack must lead with |
|---|---|---|
| Fraud, card absent | I did not authorize this | Authentication results, AVS/CVV match, IP and device data, prior undisputed orders |
| Merchandise not received | It never arrived | Carrier tracking, delivery confirmation, address match to billing |
| Not as described | It is not what I ordered | Product page as shown at purchase, policy screenshots, chat records |
| Credit not processed | I returned it and got no refund | Return receipt, refund transaction record, correspondence |
| Processing error | I was charged twice | Authorization log, settlement records, duplicate detection |
A checklist from Chargeblast makes the same point from the merchant side: evidence must match the reason code, and the wrong evidence for the code loses automatically. Your agent should treat a mismatch between the pack and the reason code as a hard failure, not a quality nudge.
There is one more decision rule worth encoding early. If the dispute is fraud-coded and the transaction was fully authenticated with 3D Secure, liability generally shifts to the issuer, and you are representing with authentication artifacts rather than arguing about delivery. Stripe's support notes are explicit that liability shift applies to fraudulent-type disputes only, and that bank-approved exemptions do not move liability. A US-focused breakdown of 3DS liability adds the detail that matters for the pack: you need the ECI, the CAVV/AAV and the ACS transaction identifiers, and Data-Only 3DS grants no shift at all. So the first branch in your workflow is not what the chat logs say but whether this is a fraud-coded, authenticated transaction, and if it is, whether you hold the artifacts.



