Late to this, and one thing that has not come up in eighteen months of it: before comparing recovery rates across apps, it is worth asking what is in the denominator, because “abandoned cart” is at least three different populations with very different ceilings.
There is the browser who was never going to buy.
A cart got created, intent was near zero, and no channel and no discount changes that.
In most stores this is the largest group by far, and it is the group that drags every recovery rate down regardless of which app is running.
There is the person who wanted it and stopped for a reason. Shipping cost appeared at the last step, the total was more than expected, they wanted to check a size or a delivery date.
This is the group every recovery app is actually designed for, and it is the group where the free shipping versus discount question is a real question.
And there is the person whose payment failed at checkout. They decided, they tried to pay, and something stopped them.
Card expired, bank declined, address check failed.
This one behaves nothing like the other two, and most cart tools do not distinguish it, so it gets the same “still thinking it over, here is 10 percent off” as the browser. That message discounts a sale you had already won and does nothing about the thing that actually blocked it.
Two practical things follow.
Testing free shipping against a discount on a mixed population tells you very little, because the winner depends mostly on which group happened to dominate that week. Split first, test second.
And on the payment failure group specifically, the decline reason decides everything. Insufficient funds is worth another attempt, and moving that attempt across a pay boundary matters more than the wording.
A card reported lost or stolen should never be retried at all, because repeated attempts against a flagged card are visible to your processor and they are not visible to you.
None of that is an argument against any app named above. It is an argument for knowing which of the three you are looking at before you decide the channel, because otherwise you are optimising a number whose bottom half you do not control.
Disclosure: I build payment recovery tooling, so I am biased toward the payments third of this.