Uncovered dispute loss

Automating Stripe Connect dispute clawbacks

A $600 order is disputed and lost. Stripe debits your platform $600 plus a $15 fee. The seller who received $540 is untouched. Unless you reverse that transfer, you funded a chargeback on a sale you took $60 from.

Liability depends on your charge type

Destination charges and separate charges & transfers: the platform is merchant of record. Disputes debit the platform balance. This is where clawback applies.

Direct charges: the connected account is merchant of record and Stripe debits them. The loss never reaches you and there is nothing to recover.

Check whether your charges carry transfer_data[destination]. Note that on_behalf_of does not move liability — teams set it believing it does and find out during their first significant dispute month.

A lost $600 dispute on a destination charge
Disputed amount debited from you
−$600.00
Dispute fee, not recoverable
−$15.00
Application fee you kept
+$60.00
Your position before recovery
−$555.00
Recoverable from the seller
$540.00
Net loss after recovery
−$15.00

Calculating the right amount

The recoverable figure is transfer.amount − transfer.amount_reversed. It is not the disputed amount.

The transfer is the charge minus your application fee, so building a reversal from dispute.amount overstates it by exactly your own fee and Stripe rejects it for exceeding the transfer. Adding the dispute fee guarantees failure on every single dispute.

On partial dispute wins, read the actual debit from the dispute's balance transactions rather than dispute.amount — the two differ, and over-recovering from a seller is a complaint you will lose.

const transfer = await stripe.transfers.retrieve(charge.transfer as string);
const recoverable = transfer.amount - (transfer.amount_reversed ?? 0);

await stripe.transfers.createReversal(
  transfer.id,
  { amount: recoverable },
  { idempotencyKey: `dispute-clawback-${dispute.id}` },
);

Automating it without damaging seller relationships

Automation here moves real money out of a third party's account, so the gating matters more than the mechanism.

Never automate an open dispute. It may still be won, and debiting a seller for a dispute they go on to win is unrecoverable goodwill.

Never automate an ambiguous charge. Where both reverse_transfer and an explicit fee refund were applied, the two levers disagree and an automatic reversal risks taking money already returned.

Set a floor. The conversation costs the same at $40 as at $4,000. Most platforms absorb below a threshold.

Put it in your terms first. Recovering under an agreed term is administration. Recovering under no term is a dispute of your own.

How FeeGuard gates it

Automated clawback is off by default. When enabled it runs only on realised losses with an unambiguous net position and a risk score of 70 or above; open disputes and suspected double refunds are always left for a human.

Every reversal carries an idempotency key derived from the finding, so a retried job returns the original response instead of reversing twice — which matters because a reversal cannot itself be reversed.