---
title: "Comment by Paul Hartness on \"Payment failed but money deducted: how idempotency keys stop double charges\" | Hashnode"
description: "\"A timeout means I don't know, not failed\" is the line I'd pin above every payments handler. The same idea shows up on subscription renewals, where nobody taps"
url: "https://hashnode.com/posts/payment-failed-money-deducted-idempotency/6af2d4383c36fe3908d4fd5a/comment/6af439e92dce8ada2d19f134"
---

[Discussion](https://hashnode.com/posts/payment-failed-money-deducted-idempotency/6af2d4383c36fe3908d4fd5a)

Comment [Payment failed but money deducted: how idempotency keys stop double charges](https://hashnode.com/posts/payment-failed-money-deducted-idempotency/6af2d4383c36fe3908d4fd5a)

[Paul Hartness](https://hashnode.com/@retryfix)

[16h ago](https://hashnode.com/posts/payment-failed-money-deducted-idempotency/6af2d4383c36fe3908d4fd5a/comment/6af439e92dce8ada2d19f134)

"A timeout means I don't know, not failed" is the line I'd pin above every payments handler.

The same idea shows up on subscription renewals, where nobody taps Pay again: the gateway retries on its own schedule over days. So "not paid yet" needs its own state with its own rule for access, rather than being read as failed (cut them off) or as fine (ignore it). Otherwise the app either locks out a customer whose card is about to clear, or keeps serving one whose retries have all run out.
