How do you bring back a cart without a coupon?
Saved-cart letters that work out the real gap to the next discount level.
What does this flow do?
Abandoned carts are the classic flow, and the classic answer is a coupon. We think that teaches people to abandon carts.
So our letters do the maths instead: they tell you exactly how far your cart is from the next automatic discount.
When does it start?
About an hour after a cart is left with something in it, above a small minimum.
How does it run, step by step?

- A cart is left; if a checkout is already underway, checkout takes over and this flow stops.
- The first letter shows the saved cart with a link straight back to it.
- For larger carts, a short WhatsApp follows a couple of hours later, if they have a phone number and haven’t had one this week.
- A day later: why Art Lounge, and the exact rupees to the next discount level.
- Two days later, a last note. Only bigger carts ever see a small coupon, and never in the subject line.
- An order or a recovered cart ends everything immediately.
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.
How close is this cart to the next discount?

No coupon. Just the real number, worked out the moment the email is sent.
{%- assign next = nil -%}
{%- assign current = nil -%}
{%- for tier in ladder -%}
{%- if cart.subtotal_paise < tier.min_paise -%}
{%- assign next = tier -%}
{%- break -%}
{%- endif -%}
{%- assign current = tier -%}
{%- endfor -%}
{%- if next -%}
{%- comment -%} 100.0, not 100: keep the paise, then round up {%- endcomment -%}
{%- assign gap = next.min_paise
| minus: cart.subtotal_paise
| divided_by: 100.0
| ceil -%}
{{ gap }} more gets you {{ next.label }}
{%- else -%}
top tier: {{ current.label }}
{%- endif -%}
What happens when two flows want the same person?
Cart abandonmentCheckout abandonmentCart abandonment has the customer to itself.
How do you build this on your platform?
These are the events the flow needs, and where each one comes from on your store.
Cart abandoned Needs a small recipe
A custom pixel for add-to-cart plus Bento.js on the storefront; works for visitors Bento already knows.
Cart abandoned Works out of the box
With site tracking on, the plugin sends $CartCreated and $CartUpdated.
Cart abandoned Works out of the box
Our plugin sends $cart_abandoned with the cart and its total.
How does it connect to the other flows?
- Checkout abandonment outranks cart, so a started checkout pre-empts this flow.
- An order hands the customer to post-purchase.
- While a cart flow runs, browse emails stay quiet.
What does one of the emails say?
You left a few things in your cart. They are saved for you, exactly as you left them.
Your cart is at ₹2,450, so ₹549 more gets you 5% off. No code needed, it applies by itself.
Kshitij, Art Lounge
An excerpt. The full emails change with each customer’s order and medium.
Questions people ask about this flow?
Should cart abandonment emails include a discount code?
We avoid it. Our discounts already apply automatically as a cart grows, so the email tells people how close they are. A small coupon appears only in the last note, only for bigger carts, and never in the subject line.
How many cart abandonment emails is too many?
We send three letters over about four days, plus one WhatsApp for larger carts. Every step stops instantly if they buy.
Can the tier-gap number be wrong?
It is worked out when the email sends, from the cart as it is then. We round the gap up to the next whole rupee, because Liquid’s integer division would otherwise drop the paise and show a number a rupee short.