At a glance

Dispute Defence answers a PayPal chargeback with evidence the merchant can actually prove, before the response deadline passes.

An agent gathers what exists, scores it out of 100, and drafts a response. A rules gate then rejects any figure, tracking number or date that does not appear in the gathered evidence, so the draft cannot improve on the record.

One dispute in the app is genuine, filed by a sandbox buyer through PayPal's own Resolution Centre against a payment we captured.


The default judgment problem

A dispute arrives with a clock on it. PayPal gives the seller a window to respond, and the window is the whole game: a dispute that gets no response is decided for the buyer automatically. Not on the merits. On the silence.

For a small merchant this is a brutal shape. The evidence usually exists — a carrier scan, a signature, an email thread confirming delivery — scattered across three systems and nobody's job to assemble at eleven at night. So the deadline passes, the money goes, and the record shows a loss that was never argued.

The queue, against the clock

The app opens on what matters: how many disputes are on the clock, and how long each has left.


Assembling a case

Every dispute

For each dispute, the agent gathers what the merchant can actually prove, scores it out of 100, and drafts a response.

The evidence

The scoring is the useful part. A dispute with a signed delivery to the billing address is not the same as one with a tracking number that stops at "in transit", and a merchant deciding where to spend an hour needs to know which is which.

The rule that keeps it honest

A drafted response is checked before it is filed. Any figure, tracking number or date that does not appear in the gathered evidence is rejected. The agent can argue from the record; it cannot improve on it.

That matters more here than almost anywhere else. A fabricated tracking number in a dispute response is not an embarrassing hallucination — it is a merchant submitting false evidence to a payment processor.

Surrender or defend

And sometimes the honest answer is to stop. When the evidence will not carry a defence, the app says so and offers to accept the claim rather than spending the deadline on a losing argument. A tool that only ever advises fighting is not advising.


The real dispute

There is a genuine PayPal dispute in this app.

PP-R-IQQ-10190238 was filed by a sandbox buyer through PayPal's own Resolution Centre, against a payment we captured — 84M12857JS087152G, $229.00. It carries a real reason code, a real response deadline, and a two-way message thread: the buyer's complaint, and a seller reply this application sent through POST /v1/customer/disputes/{id}/send-message.

Getting it was harder than it should have been, and the difficulty is worth recording:

PayPal's sandbox offers no API that creates a dispute. Only a buyer can open one, in a browser, against a payment they made. We created the order, approved it as the buyer, captured it, and then filed the complaint by hand. PayPal's own Resolution Centre errored out twice before it took.

A new dispute is not in the list endpoint immediately. For the first minutes GET /v1/customer/disputes returns an empty array and every dispute_state filter returns nothing, while a direct fetch by id returns the full object. We fetch by id because of it.

What is real


Under the hood

Agent Claude Sonnet 4.5 on Amazon Bedrock, gathering evidence, scoring it, drafting the response
Guard A rules gate rejects any draft containing a figure or tracking number absent from the evidence
PayPal Disputes v1 — read, provide-evidence, accept-claim, send-message. Signed webhooks with certificate-host and transmission-age checks, so a replayed or re-hosted delivery is refused with a 401.
Platform AWS Lambda, DynamoDB, S3 and CloudFront

Where PayPal's sandbox stops

The sandbox never adjudicates. No application can show PayPal ruling for the buyer or the seller, because that outcome does not exist in sandbox. Everything up to and including the filing is real; the verdict is labelled as simulated wherever it appears. We would rather say that than imply a win we cannot produce.


Built With

Share this project:

Updates

Submission history