## TL;DR
Stripe rejects a second evidence submission that matches what is already attached. Fetch the dispute first and read its evidence object; only submit when something actually changed, and keep one submission per dispute id on your side. The fix is read-before-write: check what is attached before you post.

```text
duplicate dispute evidence rejected: how to fix
```

## Use this when
- An evidence POST is rejected as a duplicate.
- A retry loop submits the same pack twice.
- Two workers race to submit evidence for one dispute.

## Not for this skill when
- The dispute is closed. That is a deadline problem.
- Evidence is rejected on content, not on duplication.

## Steps
1. Retrieve the dispute and read the evidence object with its submitted timestamps. Verify: you can see exactly what is already attached.
2. Compare your new pack against the attached evidence field by field. Verify: you can name what changed, or admit nothing did.
3. If nothing changed, stop. The rejection is correct and resubmitting will not help. Verify: no second POST is sent.
4. If something changed, submit once and record the submission against the dispute id in your own store. Verify: your store shows one submission row for the dispute.
5. Put a lock or queue on evidence submission per dispute id so retries and workers cannot race. Verify: a simulated double-submit produces one API call.

## Variant phrasings
### stripe evidence already submitted
Common error-adjacent search.
### dispute evidence duplicate submission
Noun-form search.
### stripe evidence update rejected duplicate
Update-path wording.

Compatibility: Stripe Disputes API. The evidence object is readable on the dispute; submission is a single update call.

## Why it happens
Evidence submission is effectively an upsert with duplicate detection. A retried request, a double-clicked button, or two workers processing the same queue message all look like the same pack arriving twice, and Stripe says no to the second copy.

## Edge cases / pitfalls
- Retrying on timeout is the top cause. Make the submit call idempotent instead of blindly retrying.
- Updating evidence after submission replaces the pack. Know which fields you overwrote.
- Two different people submitting final packs is an org problem. One owner per dispute.
- If your queue redelivers the same job, the dedupe key must survive restarts. Keep it in a real store, not in memory.
- Log the dispute id with every submission attempt. Without it, dedupe is guesswork.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_NZ-s6-nhZTi67Jbjzt7jsg
