Field notes
Payments · Oct 2025

Chargebacks Are an Engineering Problem

A chargeback lands in your inbox forty days after the sale. The buyer swears they never received the goods. Your support agent digs through logs, screenshots a delivery confirmation, writes three paragraphs of prose, and uploads it hours later. You lose anyway, because the evidence did not match the reason code. This is how most teams fight disputes: manually, late, and reactively. It does not scale, and it quietly bleeds margin.

The lifecycle is a state machine, not a mystery

A chargeback is not a random event. It is a well-defined flow with named states: authorization, capture, dispute, representment, arbitration. Each transition has a deadline measured in days and a required document set, and the card networks even publish the reason codes that drive it. Code 10.4 is fraud. Code 13.1 is merchandise not received. Code 13.3 is not as described. Each code demands specific evidence, and evidence that does not map to the code is worthless no matter how well written. Model the whole thing as a state machine and the work becomes obvious: deadlines become timers, and representment becomes a template selected by reason code.

Capture evidence at the moment of sale

The single biggest lever is timing. The evidence that wins a representment almost always exists at the instant of the transaction and almost never gets captured then. Device fingerprint, IP, AVS result, 3DS authentication token, the exact descriptor shown to the buyer, delivery confirmation, the signed terms they accepted. Collect all of it at authorization and bind it to the payment record. Then representment is a lookup, not an investigation: a dispute webhook arrives, your system reads the reason code, pulls the pre-assembled bundle for that transaction, formats it to the network template, and submits. No human writes prose, and the win rate climbs because the packet is complete.

Prevent what you can, measure the rest

The cheapest dispute is the one that never opens. A shocking share of chargebacks are not fraud at all but confusion: a buyer does not recognize a cryptic descriptor on their statement and calls the bank. Fix the descriptor first, make it legible and consistent with what the buyer saw at checkout, and a whole category of disputes disappears before any evidence is needed. Then stack the technical controls. AVS and 3DS shift liability and filter bad actors, and a fraud score at authorization lets you decline or step up the riskiest attempts before they settle. Tune them against real dispute data rather than fear.

None of this matters if you cannot see it. If disputes live only in a finance spreadsheet, engineering never feels them. Put dispute rate on the same dashboard as latency and error rate, sliced by descriptor, by product, by acquirer, by cohort, and watch it move when you ship. A spike after a release is a bug report in disguise, and a descriptor change that drops the rate is a feature you can point to.

When you engineer the dispute lifecycle instead of firefighting it, disputes become a metric you tune, not a crisis you survive.
— Protocore · Payments engineering

We built exactly this discipline into the payments stack that cleared 2.4 million euros across 80,000 attendees, and the number that mattered most was not throughput. It was zero disputes. That does not come from luck or a forgiving crowd. It comes from capturing evidence at the tap, from descriptors nobody has to decode, and from treating every reason code as a branch you already handle. Engineer the lifecycle once, and you stop paying for it forever.

Have a system to build?

Tell us the problem. We'll come back with an architecture and a plan.

Start a project