REPLAYA recorded finder pass, before and after the fix: runs, ids, counts and the change are real. Nothing here is live.

Finder report · duplicate-webhook

The finder reproduces the classic duplicate-delivery bug with PayPal's real redelivery, then proves the one-line fix.

Same scenario, same check, run before and after the change. Each verdict rests on the store's own rows, not on the absence of an error.

Before
1bug
BUG
run 20261023231552-60ea96 · 2026-10-23 23:15 UTC
After
0bugs
OK
run 20261024011812-208f4e · 2026-10-24 01:18 UTC

Report

A redelivered capture event fulfills the order twice duplicate-webhook · PAYMENT.CAPTURE.COMPLETED

CheckExpectedBefore60ea96FlagAfter208f4eFlag
Deliveries of the resent eventat least 2: the resend has to arrive2in range2in range
Fulfillments for that event idexactly 1, however many deliveries2too high1in range
Redeliveries recognized and ignoredevery delivery after the first0too low1in range
Deliveries verified as PayPal'sall of them2 of 2in range2 of 2in range
before the fix20261023231552-60ea96
Order
3Y2144672G186725Y
Capture
80644537PH409550V · card order USD 25.00
Event
WH-23242717T8452430B-4FP87531JX1278159
Report
evidence/finder/2026-10-23-duplicate-webhook-before-fix.md
  1. 23:16:17fulfilled · verified · signing certificate from api.sandbox.paypal.com
  2. 23:17:51fulfilled again · verified · signing certificate from api.sandbox.paypal.com
Order
9XW82145R0198523E
Capture
7FK80862277639113 · card order USD 25.00
Event
WH-1XN5343594084053N-3NH67648AD6825106
Report
evidence/finder/2026-10-24-duplicate-webhook-after-fix.md
  1. 01:18:37fulfilled · verified
  2. 01:19:21recognized as a repeat and ignored · verified

The change between the two runs

commit d6b8ff6 · fix(store): dedupe webhook events by event id · merged in PR #6

How a verdict is decided

  1. BUG only when one event id was fulfilled twice.
  2. OK only when the event was fulfilled once and a redelivery reached the store and was ignored.
  3. Anything else, including a redelivery PayPal never sent, is INCONCLUSIVE, never OK.
Run this check againA live finder run needs the judge passcode, at /live. These two runs took about 70 seconds and 2 minutes, mostly waiting on PayPal's redelivery.