Most of the abandonment you're staring at in Shopify analytics comes down to four things: the total went up at checkout, the payment failed, the address form was painful on a phone, or the customer never intended to buy in the first place. In that order, roughly. Before you spend a rupee on an exit-intent popup, work out which of the four you actually have, because the fixes have nothing in common and three of them are free.
The last one matters more than people admit. A large share of "abandoned carts" are people using the cart as a wishlist, comparing your price against a marketplace, or checking whether you deliver to their pincode. No email flow rescues that.
First, check what your abandonment number is measuring
Shopify's abandoned checkout report counts sessions that reached checkout and entered contact details without completing an order. Add-to-cart drop-off is a different, usually much larger leak, and it sits in your behaviour reports, not your checkout reports. Teams routinely quote one number and diagnose the other.
Split it before you go further:
- Sessions that added to cart but never opened checkout — a price, trust or delivery-clarity problem on the product page.
- Sessions that opened checkout and bailed at shipping — a cost surprise.
- Sessions that reached payment and bailed — a payment or trust problem, and the most recoverable of the three.
The third bucket is where the money is. Someone who typed their full address and then left didn't change their mind about the product.
Why Shopify customers abandon carts at the shipping line
The cart says ₹1,180. Checkout says ₹1,259. That ₹79 is the single most common reason a warm buyer walks, and it's worse in India than in the US or UAE because the average order value is lower, so the shipping charge is a bigger percentage of the total.
The reflex fix is free shipping everywhere. Run the numbers before you do it, because the arithmetic is unkind more often than not.
Take a store doing 1,000 initiated checkouts a month, AOV ₹1,180, 45% gross margin — so ₹531 of contribution per order. Checkout completion is 62%, meaning 620 orders and ₹329,220 of contribution. Now make shipping free at ₹79 a shipment. Contribution per order drops to ₹452. Suppose free shipping lifts completion to 68%: 680 orders × ₹452 = ₹307,360. You've raised conversion by six points and lost about ₹22,000 a month.
Break-even is 329,220 ÷ 452 = 728 orders, or 72.8% completion. That's an eleven-point lift, which we've almost never seen from removing a ₹79 charge alone. What does work: a threshold set just above AOV — free shipping over ₹1,299 on a ₹1,180 AOV — plus a cart-drawer line showing how much more is needed. You lose margin only on the orders that grew, and some baskets get bigger to reach it.
The cheaper fix, and the one we start with: show the delivery cost on the product page and in the cart drawer, not for the first time at checkout. Abandonment isn't caused by ₹79. It's caused by ₹79 appearing after the customer already decided the price was ₹1,180.
In India, an abandoned checkout is often a failed payment
UPI intent flows break in ways nobody sees from the admin. The app switch fails on some Android builds. The collect request expires while the customer hunts for their PIN. Bank downtime on a Sunday evening does what bank downtime does. From Shopify's side, that session looks identical to a change of heart.
What we look at, in this order:
- Gateway-side success rates by method. Razorpay and the other Indian gateways report attempt-versus-success per method. If UPI is materially below cards, you have a technical problem, not a persuasion problem.
- Retry behaviour. After a failure, does the customer land back on a usable payment screen with the basket intact, or on a dead-end error? A store with a clean retry path recovers a meaningful chunk of failures on the second attempt within the same session.
- Method order. If UPI is 60% of your successful volume, it should not be the fourth option down behind two card fields and a wallet nobody uses.
- Failed-payment follow-up. A message within fifteen minutes that says the payment didn't go through, with a link straight back to a pre-filled checkout, converts better than any generic "you left something behind" email. The intent is still fresh and the customer already believes they bought it.
Multiple payment apps stacked on one checkout also create their own failures. We've had to strip two gateways down to one on stores where the second was there for a promotion that ended a year earlier.
COD fixes abandonment and creates a different problem
Removing COD will raise your abandonment rate. There's no arguing with it in most Indian categories, and in tier-2 and tier-3 pincodes the gap is wide. But COD carries RTO, courier fees on both legs, blocked inventory and a working-capital drag that a checkout-completion chart never shows.
The middle path we set up most often: keep COD, add a small COD handling fee, and offer a prepaid discount roughly equal to what you save. Show both totals side by side. Enough customers move to prepaid to change your cash cycle, and the ones who won't still convert.
Two things to get right if you do this. Run a serviceability check so COD only appears for pincodes your courier actually accepts — nothing burns goodwill faster than offering COD and then cancelling the order. And on high-value carts, gate COD above a limit. A ₹14,000 COD order in jewellery or electronics is a loan you didn't agree to make.
The mobile address form is where more carts die than anyone expects
Watch three session recordings of mobile checkouts and you'll stop reading conversion blogs. The pincode field opens an alphabetic keyboard. Autofill drops the flat number into the wrong line. The customer types their address, gets an OTP, switches to Messages, comes back and the page has reloaded empty. On a mid-range Android on a patchy 4G connection, that last one is common.
Fixes that take an afternoon:
- Correct input types on phone and pincode so the numeric keypad opens.
- Pincode-driven city and state autofill, so people type six digits instead of two words they'll misspell.
- Shop Pay or an accelerated wallet button above the form for repeat buyers.
- Cut optional fields. Company name and address line 2 can go.
If you're on Plus and running checkout extensibility, most of this is a UI extension rather than a hack, and it survives Shopify's updates. That's the kind of small, contained work we'd hand to one developer for a week rather than scope as a project — if you don't have that resource in-house, a Shopify developer on retainer is the cheaper route than a full engagement.
Speed is an abandonment cause, and it shows up before checkout
A product page with a 4.1s LCP on mobile loses people who would have bought. They never reach the cart, so they never appear in your abandonment report, which is exactly why speed gets blamed too late. Get LCP under 2.5s on the templates that carry your traffic — home, top collection, top three product pages — and measure it on real mobile field data, not a desktop Lighthouse run in an office with fibre.
Usual culprits in the stores we audit: four review apps where one would do, a hero image served at 2400px wide, a currency converter loading on every page for a store that sells in one currency, and a chat widget with a render-blocking script. Removing dead apps is free and often worth more than a theme rebuild. If you want a baseline before you touch anything, SwiftStore will scan the store and track the score as you make changes, and our speed work goes after the theme and app weight underneath it.
The discount code box is a leak you built yourself
A visible "Have a coupon?" field tells the customer a better price exists somewhere. They open a new tab, land on a coupon aggregator, and a decent share of them don't come back. If you don't run public codes, collapse the field. If you do, put the working code in the cart or on a banner so nobody has to leave to find it.
Same logic for exit-intent popups offering 10% off. They train your buyers to abandon on purpose. We've seen this become self-sustaining on stores where the popup ran for a year: abandonment stayed high because leaving was the cheapest way to buy.
Recovery: worth doing, worth sizing honestly
Recovery flows are not a fix for a broken checkout. They're a way to collect the orders you were always going to lose some of.
Size it before you build it. On 1,000 initiated checkouts with 62% completion, you have 380 abandoned checkouts a month. A three-touch flow — email at 45 minutes, WhatsApp at 20 hours, email at 48 hours — recovering 8% gives 380 × 0.08 = 30 orders, or about ₹35,400 at a ₹1,180 AOV. Real money, and roughly a tenth of what fixing the shipping-surprise problem is worth on the same store. Do both, but in that order.
A few things that move recovery rates: name the product and show its image; include the delivery cost so the reminder isn't a second surprise; skip the discount on the first message. If message one always carries 10% off, your repeat buyers learn to wait for it. And on WhatsApp, keep it to one message and make the opt-out obvious, because a template block hurts far more than the orders it wins.
The half hour we'd spend first
Open your own store on your own phone, on mobile data, and buy something. Pay with UPI. Then do it again and deliberately fail the payment. Then do it as a first-time visitor with no saved address. Most of what's wrong will be obvious inside ten minutes, and it's usually not the thing the team has been arguing about in Slack.
After that, pull checkout completion by device and by payment method for the last 90 days. Mobile-versus-desktop and UPI-versus-card will point at the real problem faster than any heatmap.
If you'd rather someone else did the digging, send us the store URL and we'll run a free audit of the cart and checkout path and tell you which of the four causes you have, and what each one is costing per month.


