Invoice stays unpaid after a later payment attempt on the same invoice succeeds
Summary
When a subscription renewal fails and the customer retries, every attempt in that billing cycle shares the same invoice. If a later attempt succeeds, the invoice is not marked paid. It stays in an unpaid state, so merchants see a leftover unpaid invoice for a cycle that was in fact collected.
No duplicate invoice is created and the customer is not double charged. Only the invoice status is wrong.
Impact
Reported by Waveloop (Eran Kutner). Their finance view treats the unpaid invoice as an open debt against the customer, which creates duplicate revenue recognition and manual reconciliation every time a renewal fails and recovers. They report it happening consistently, not as a one-off.
Reproduction
- Let a subscription renewal fail (card declined).
- Have the customer retry and complete the payment.
- Observe the invoice for that cycle. It remains unpaid despite the successful charge.
Live example
Customer cus_0Nl4kJCXRTzPcpCerC1IP, subscription sub_0Nl4ketDQq7KlC9N0OYe1, billing cycle 18 Oct 2026. All three attempts share invoice inv_0Nq07l7H7jQenUO7d7ahA:
Time (UTC) | Payment ID | Status |
|---|---|---|
10:55 |
| failed, CARD_DECLINED |
13:09 |
| requires_payment_method |
13:39 |
| succeeded, 32084 ILS |
32084 ILS was collected once, at 13:39, against inv_0Nq07l7H7jQenUO7d7ahA. That invoice is still unpaid.
The same pattern appears on this subscription's two earlier cycles:
- 17 Sep, invoice
inv_0NnpCl0sTcRtsowJHm5Hs:pay_0NnpClRus8mkBkRJEoQbkfailed,pay_0NnrQ0phqzx48XUGXppq9succeeded 31544 ILS - 17 Aug, invoice
inv_0NlZrlP9r4knGEJlnHR8Z:pay_0NlZroPAsQZYLbNRCLCTVfailed,pay_0Nlc57CR32GvEysaCZGMEsucceeded 30342 ILS
Expected behaviour
Once any payment attempt against an invoice succeeds, that invoice should be marked paid.
Actual behaviour
The invoice remains unpaid, apparently tracking the status of the first failed attempt rather than the successful one.
0 Comments
Sign in to comment
No comments yet. Be the first to share your thoughts!
