Fix payment webhook retries
The problem
A failed payment can send the same event twice. Check whether it has already been handled before updating the subscription.
Linked code 2 files
src/api/ webhooks/ stripe.ts src/billing/ subscriptions.ts
What done looks like
- Duplicate events leave the subscription unchanged.
- A failed attempt can be retried safely.
The brief, linked files, and acceptance criteria travel together.