Do not create a second independent payment while the first Lightning payment is still in flight or its outcome is unknown. A waiting screen, disconnected app or expired interface timer is not a final failure. Recover the existing payment’s status using its record and payment hash, then reconcile it with the recipient before deciding whether to retry.
One purchase can acquire two different payment obligations
Imagine a fictional sender, Evan. He approves a Lightning invoice, sees a spinner and loses mobile connectivity. The seller suggests a new invoice while Evan’s original record still says pending. If he pays the new request from another wallet, the first operation has not thereby disappeared. He has introduced a separate payment that must be reconciled if the original later completes.
The useful question is therefore not how many times the Pay button was pressed. It is which payment each action refers to. Keep the original invoice, the wallet’s payment identifier and the seller’s order reference together. A renewed invoice, a second wallet and a seller’s new checkout link can each change the context. Do not assume their anti-duplicate protections are shared.
For a refresher on the request itself, see Lightning invoices versus Bitcoin addresses. The present task starts after a payment was initiated: it is a reconciliation problem, rather than an explanation of invoice formats or a recommendation to try another route.
Read the state at the right level
An individual routing attempt may fail while the wallet continues working on the payment. Conversely, losing the connection that delivered status updates tells you about that connection, not the result of every attempt. Keep an app-level error, a payment-level outcome and a routing-part outcome separate when describing the incident to support. This distinction is especially helpful when a technical log contains several apparently contradictory entries.
For an LND-based system, TrackPaymentV2 tracks updates for a payment identified by its payment hash. Its payment states distinguish an in-flight payment from a settled success or failure. You do not need to become a node administrator to use this distinction: ask the wallet operator to retrieve the existing payment, rather than interpreting a missing notification as authorization to send again.
| Evidence available | What remains unresolved | Action for this payment |
|---|---|---|
| Spinner or app connection timeout only | Whether the original payment settled | Reopen its saved record and refresh through the official wallet |
| Payment-level pending or in-flight state | Final success or failure | Continue tracking the same payment; avoid a fresh invoice payment |
| One failed route inside a still-running payment | Outcome of the other attempts or parts | Ask for the aggregate payment status |
| Final successful payment | Possibly the seller’s allocation to your order | Reconcile invoice and order with the recipient instead of paying again |
| Final failure of the original payment | Cause of failure and current usability of the invoice | Review the failure and recipient’s current request before a deliberate retry |
| Wallet and recipient disagree | Whether the same invoice and amount are being compared | Match payment hash and order reference in a private support conversation |
A blank history is also inconclusive if you have opened a different wallet profile, switched networks or not finished synchronizing. Record which account actually initiated the payment. Reinstalling the app or restoring a wallet to another device merely to clear the spinner can make that investigation harder. Preserve the current history and use the wallet’s supported reconnection process first.
There are several clocks, and none is a refund receipt
A request’s expiry tells a payer when the invoice should no longer be used for a new payment. It is different from a mobile app’s waiting timer and from the conditions governing a payment already forwarded. An invoice passing its expiry while your screen is still pending is therefore not sufficient evidence that the payment failed or that its funds are immediately available for another attempt.
The current LND SendPaymentV2 reference expressly warns that cancellation can stop additional attempts while existing in-flight attempts can still settle. Its timeout description likewise does not promise to abort forwarded HTLCs immediately. Treat those as implementation-specific meanings, not a universal cancel button. Do not close channels, increase fees or start unrelated recovery operations merely to make a pending label disappear.
A different example comes from the Breez SDK sending guide. For its documented Lightning flow, a completion timeout can return a pending object, followed by later completion information. That is a product-specific API design, not a claim that every wallet uses Breez or Spark. It demonstrates why the caller finishing its wait and the payment reaching its final result must not be treated as the same event.
Ask for a status lookup, not another send
- Save the original invoice, initiating wallet account, payment hash if exposed, amount, initiation time and merchant order reference.
- Reconnect the same wallet and inspect that payment’s current detailed record. Keep screenshots of any change in state.
- Ask the recipient to check the matching invoice, not just the overall account balance or a different order.
- If pending remains, request an explicit status investigation from the wallet operator. Ask what evidence will establish final success or failure.
- If successful, resolve any missing order credit with the recipient. If definitively failed, review the error and agree on the current invoice or a replacement before another payment.
Node operators have dedicated status queries as well. Core Lightning’s listpays documentation describes aggregate payment states and a lookup by invoice or payment hash. Its waitsendpay reference distinguishes a timeout while still waiting from a completed result. These references support the investigation; they are not instructions for a retail user to expose node credentials or run a payment command found in a forum.
When discussing a retry, distinguish returning to the wallet’s supported handling of the same payment from creating a new commercial obligation. Do not rely on the slogan that Lightning can never pay twice. Behaviour depends on the request format, wallet implementation and whether you have actually created a new request. Another wallet does not automatically know what the first wallet is still doing.
The recipient says unpaid, but the wallet says successful
Compare the payment hash, intended amount and exact invoice before comparing screenshots of balances. A successful payment to one request does not pay a different request merely because both were issued for the same purchase. Ask the seller to investigate its invoice and order mapping. Keep the proof available through your wallet’s supported interface; share it only with the party resolving the dispute, rather than publishing it as a public troubleshooting post.
A useful private message reads: ‘My wallet’s original payment is still pending. The order reference is attached, and the payment hash and initiation time are below. Please check this specific invoice and tell me whether you see it settled. I will hold off on a replacement payment until we reconcile the result.’ Once the state changes, update the message with the new evidence rather than starting another disconnected ticket.
If you ultimately agree on an alternative route, retain both the old and replacement references until the order is settled. A no-account swap has its own order and accepted destination requirements, while the Bitcoin asset page is background information. Neither is a status lookup for the pending Lightning payment. Resolve the original operation before treating another service as a replacement path.
FAQ
What does a Lightning payment hash help me check?
It helps the wallet operator and recipient identify the payment being investigated. It is not by itself proof of final settlement or evidence that a merchant allocated the money to your order.
Can I retry from another Lightning payment app while the first app waits?
Avoid creating a new independent payment until you know the first result. Another app does not automatically share the original wallet’s payment state or duplicate handling.
Does an expired Lightning invoice mean the pending payment failed?
Invoice expiry is not evidence of the outcome of a payment already initiated. Retrieve the original payment’s final status before agreeing on and paying a replacement request.
Related on KOT.CASH
Sources
- lightning.engineering/api-docs/api/lnd/router/track-payment-v2/
- lightning.engineering/api-docs/api/lnd/router/send-payment-v2/
- sdk-doc-spark.breez.technology/guide/send_payment.html
- docs.corelightning.org/reference/listpays
- docs.corelightning.org/reference/waitsendpay
- github.com/lightning/bolts/blob/master/11-payment-encoding.md