The one I would split out before picking a channel: a slice of what shows up as an abandoned cart is not an abandoned cart. It is a card that got declined at checkout.
Both land in the same bucket in most setups, and they want opposite messages. Someone who wandered off is being asked to come back and decide.
Someone whose card failed already decided, already tried to pay, and got stopped. Sending that second person “still thinking it over, here is 10 percent off” is the worst message available, because you just discounted a sale you had already won and you did not fix the thing that blocked it.
Telling them apart is a payment provider question rather than a cart app question.
The decline reason is the useful part.
A soft decline, insufficient funds or a generic issuer decline is worth retrying, and when you retry matters more than what the message says.
A hard decline, card reported lost or stolen or the account closed, will never succeed no matter how many times you send it, and the only thing that works is asking for a different card.
Two practical things fall out of that.
Retry a soft decline on a different day, not a few hours later.
Insufficient funds on a Tuesday is often not insufficient funds on Friday.
Three attempts on the same card in one afternoon runs up fees and does nothing else.
Never send a discount to a payment failure. Send the same cart at the same price with a working payment link. If your recovery flow cannot tell the two cases apart it will discount both, and that cost is invisible, because it shows up in your margin rather than in your recovery rate.
On the holdout point further up, agreed, with one addition: hold out the payment failure segment separately. It behaves nothing like the browse and leave segment, and averaging them together will make whatever you conclude wrong in both directions at once.
Disclosure: I build payment recovery tooling, so I am biased toward the payments half of this question.