Why did the payment not go through?
A note that reads how the checkout ended, from a UPI app that didn’t open to a page that was closed.
What does this flow do?
Most checkout emails assume people changed their minds. In India, a lot of them simply had a UPI app that never opened.
This flow reads how the checkout ended and writes for that, starting on WhatsApp when it can.
When does it start?
About half an hour after a checkout ends without payment: either the payment window was dismissed, or the page was closed after contact details were entered.
How does it run, step by step?

- A checkout ends unpaid; the event says how it ended.
- Any cart flow for this person stops: checkout outranks cart.
- WhatsApp goes first, if they have a phone number. If they read it, the first email is skipped.
- Otherwise the first email goes out, written for how the checkout ended.
- A day later, a note with the cart still saved and the gap to the next discount.
- A payment at any point ends the flow.
What happens before every send?
Every email in every flow passes the same quiet check first. Is the customer still in this flow? Have they bought since it started? Have we emailed them in the last couple of days? If any answer says wait, the flow waits a day and asks again, rather than piling another email on top.
After the send, the flow marks a short cooldown, so the next flow that wants this person knows to give them a breather.
Want to try the decision yourself?
Checkout startedPayment trouble emailSaved cart emailThe payment window closed, so the email talks about a UPI app that didn’t open or an OTP that never arrived, and reminds them: don’t pay twice.
{%- assign how = src | default: last_source -%}
{%- if how == "dismissed" -%}
payment
{%- else -%}
closed
{%- endif -%}
How do you build this on your platform?
These are the events the flow needs, and where each one comes from on your store.
Checkout abandoned Needs a small recipe
Native checkout: Shopify Flow “Customer abandons checkout”. Razorpay Magic Checkout, GoKwik or Cashfree: their abandonment webhook through a relay.
Checkout abandoned Works out of the box
The plugin sends $StartedCheckout; the flow waits and checks no order arrived.
Checkout abandoned Works out of the box
Our plugin sends Magic Checkout’s abandon events, including whether the payment window was dismissed.
How does it connect to the other flows?
- It pre-empts cart abandonment for the same person.
- A successful payment hands them to post-purchase.
What does one of the emails say?
It looks like your payment didn’t go through. Sometimes the UPI app doesn’t open, or the OTP never arrives.
Your cart is still saved. You can try again, or pick a different way to pay. Please don’t pay twice: if money left your account, reply and we’ll sort it out.
Kshitij, Art Lounge
An excerpt. The full emails change with each customer’s order and medium.
Questions people ask about this flow?
What is the difference between cart and checkout abandonment?
A cart is a list. A checkout means someone entered their details and was about to pay. Checkout drop-offs are often payment trouble, not second thoughts, so we write to them differently and let checkout outrank cart.
Can you tell why an Indian payment failed?
Partly. With Razorpay Magic Checkout we know whether the payment window was dismissed or the page was closed. A dismissed window and a UPI app that never opened look the same, so the email covers both kindly.
Why send WhatsApp before email here?
A failed payment is urgent and personal, and WhatsApp gets read fast. If the WhatsApp is read, we skip the first email so nobody gets told the same thing twice.