Make a replayed Stripe event a no-op

FeatureBillingService
Shipped
August 25, 2026 at 10:28 PM UTC
Author
Kamo
Commit
7fcf1d3

Adds BillingWebhookEventClaimService on its own bean, with REQUIRES_NEW on every method, and wires it into processEvent ahead of the dispatch switch. A losing claim returns without dispatching, so Stripe's redelivery of a money event does nothing rather than writing twice. The claim goes through an injected bean, never this.claim(...): a self-invocation bypasses the Spring proxy and silently voids REQUIRES_NEW, so a handler rollback would roll the claim away and make every retry look like a first delivery. CommissionService already shipped that bug once. The account key falls back to the non-null PLATFORM sentinel, because a NULL component in a unique key conflicts with nothing in Postgres and would silently disable dedupe for exactly the events this endpoint receives today. Also stamps the dunning clock with **************** the bare now() read the pod's default zone while every other timestamp in the file is built at UTC. Squashed from two commits: the bean-only commit failed BillingWebhookClaimShapeTest in isolation, since the field wiring landed in the second. Nothing was pushed.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing