An abandoned cart email goes to someone who already picked a product and left without paying. A countdown tells them how long they have for something specific: a coupon that expires, a price that goes back up, stock you've set aside for them. If none of that exists, the timer is making up a deadline.
Countdown timers in abandoned cart emails
A countdown in an abandoned cart email only makes sense when something really expires, such as a coupon with an end date. Use a per-recipient evergreen timer (Starter plan): each person's first open sets the start. On the free plan, an evergreen timer restarts on every open, so it can't mark a real deadline.
Make your own
The generator is already set up for this page. Change what you need and press Create timer.
Animated GIF. Recalculated every time the email is opened.
The generator comes set to a 24-hour evergreen timer. Change it to your offer's real length before you copy the code.
When it works and when it doesn't
It works when the deadline exists outside the email:
- An expiring coupon. You offer a discount code for 48 hours and it stops working after that. The timer shows those 48 hours.
- A sale with an end date. The item in the cart is marked down until Sunday. Here the deadline is the same for everyone, so a fixed-date timer is enough.
- Reserved stock. If your store holds the units for a while, the timer counts down that hold.
It doesn't work when the cart never expires. In many stores the cart is still saved days later at the same price. If you write "your cart expires in 24 hours" and the next day it's still there at the same price, the customer learns your deadlines aren't real, and they'll remember during your next sale.
It also adds nothing to a first reminder with no incentive. An email showing what they left behind doesn't need a clock.
Before you add a timer, check how your discount expires. According to Shopify's help center, a code with no end date never expires. In Klaviyo, unique coupons in a flow can expire after the hours or days you choose. You set the expiration in your platform; the timer only displays it.
Fixed or evergreen timer
Every person abandons their cart at a different moment, so a fixed date rarely fits. The natural choice is an evergreen timer, which counts a duration (say, 48 hours) instead of running to a date.
When that evergreen timer starts depends on your plan:
- Per recipient (Starter plan or higher). You add your platform's customer ID tag to the image URL (
?rid=). That person's first open sets the start, and later opens show what they have left. The same timer works for every email in the flow. - Without a recipient (free plan). It counts from every open. If the person opens the email on Tuesday and again on Thursday, they see 48 hours both times. With a coupon that really expires, that's telling them something false.
On the free plan you have two honest options. Write the expiration date in the copy, with no timer. Or, if the offer ends at the same moment for everyone, use a fixed-date timer, which is free. Plans are on the pricing page.
The coupon and the timer start at different times
A discount code counts from when your platform generates it, and a per-recipient timer counts from when the person opens the email. If someone opens the email a day after it was sent, the timer shows more time than the coupon has left.
Klaviyo's help center says unique coupons are assigned at send time and always expire 24 hours later than the expiration you set, to cover delivery delays. With a 48-hour coupon, the code is good for 72 hours after sending in practice. A 48-hour timer stays within that if the person opens the email during the first day. If late openers worry you, set the timer a little shorter than the coupon.
In Shopify, a discount's end time follows the store's time zone. If you use one code with the same end date for everyone, a fixed-date timer in that zone fits better.
Sample sequence
This is a suggestion. Adjust the timing to your store and to how long your offer really lasts.
| When | Timer | Why | |
|---|---|---|---|
| Reminder | A few hours after the cart is abandoned | None | There's no offer yet; showing what they left is enough |
| Incentive | The next day, if they haven't bought | Per-recipient evergreen, as long as the coupon | The coupon is created with this email and the timer starts at the first open |
| Last call | When the coupon has a few hours left | The same timer as the previous email | Because it runs per recipient, it shows what that person has left instead of starting over |
When the coupon expires, the GIF shows the message you choose, such as "Your discount has expired," or a 1-pixel transparent image if you'd rather it disappear. After the last call, stop emailing about that cart.
Things worth knowing
Apple Mail. With Mail Privacy Protection on, Apple downloads images in the background when the email arrives, whether or not it's opened. For a per-recipient timer, that download sets the start at delivery rather than at reading. For the coupon this is the safest case, because the timer and the code start at about the same time.
Editor preview. If your platform's preview loads the image with a real customer's ID, their window starts right then. Use a test profile of your own. If the tag arrives unreplaced, the engine ignores it and counts from that moment.
Repeat customers. The start is stored per timer and per recipient. Once 30 days have passed since their deadline ended, the next open starts a fresh countdown. If the same person abandons another cart a week later, they're still inside that margin and will see the timer as expired. For carts, a short margin works better: the generator lets you pick 1 or 7 days. You can also put a cart-specific variable in rid if your platform offers one.
Outlook. According to Microsoft, Outlook for Microsoft 365, 2021 and 2024 animate the GIF unless Windows animations are turned off. Then they show the first frame, which in our GIF already shows the time left.
Privacy. Put the customer ID in rid, not their email address. We store the value as a hash, never in plain text.
How to set it up in your ESP
The timer goes into the same block you'd use in a campaign. What changes is where the flow lives:
- Klaviyo. An HTML block inside the flow email, with
{{ person.KlaviyoID }}as the recipient tag. - Shopify Email. A custom Liquid section. Shopify says it works in its abandoned cart, abandoned checkout and abandoned browse automations. The variable is
{{ customer.id }}. - Mailchimp. A Code block in an automation email; for the recipient,
*|UNIQID|*. - HubSpot. An HTML module in a workflow's automated email. HubSpot limits those emails to Marketing Hub Professional or Enterprise.
Each guide covers how to test the timer before you turn the flow on. If your offer ends at the same time for everyone, see the flash sale use case.
Common questions
How long should the timer run?
As long as your offer. If the coupon is good for 48 hours, the timer counts 48 hours. If nothing expires, leave the countdown out.
Can I use the free plan for abandoned cart emails?
You can create a free evergreen timer, but without a recipient it counts from every open: someone who opens the email the next day sees the full window again. A real per-customer deadline needs the Starter plan.
Does the timer end at the same time as a Klaviyo coupon?
Not exactly. The coupon is assigned when the email is sent and the timer starts at the first open. According to Klaviyo's help center, coupons stay valid 24 hours past the expiration you set, which covers anyone who opens the email on the first day.
Can I use the same timer in every email of the flow?
Yes, and you should. With the recipient tag, the first open sets the start and later emails show what that person has left.
What happens if the same person abandons another cart weeks later?
The start is stored per timer and per recipient. If their deadline ended more than 30 days ago, the new open starts a fresh countdown; if not, they'll see the timer as expired. You can shorten that margin to 1 or 7 days in the generator, or put a cart-specific variable in rid if your platform has one.
Why does the window start before the customer reads the email in Apple Mail?
With Mail Privacy Protection, Apple downloads images when the email arrives, whether or not it's opened. That download counts as the first open, so the timer starts at about the same time as the coupon.
Does it work in Outlook?
According to Microsoft, Outlook for Microsoft 365, 2021 and 2024 animate GIFs unless Windows animations are turned off. In that case readers see the first frame, which already shows the time left.
Sources
- Per-recipient evergreen restart: the start is stored; if the person opens after duration + restart_after (30 days by default, 1, 7, 30 or 90 days or never in the generator), their start becomes that moment. Kauntodaun technical documentation, accessed on
- Klaviyo unique coupons: in flows they can expire after a number of days or hours; assigned at send time; actual expiration is always 24 hours after the one you set. help.klaviyo.com, accessed on
- Shopify: if you don't choose an end date, the discount doesn't expire. help.shopify.com, accessed on
- Shopify: discount start and end times follow the time zone selected in the admin. help.shopify.com, accessed on
- Custom Liquid in abandoned checkout, abandoned cart and abandoned browse automations; customer.id variable. help.shopify.com, accessed on
- Klaviyo: countdown with an HTML block, also in flows; Apple Mail may not render countdowns correctly because of preloading; Outlook 2007, 2010 and 2013 show the first frame. help.klaviyo.com, accessed on
- {{ person.KlaviyoID }} returns the profile's Klaviyo ID. help.klaviyo.com, accessed on
- *|UNIQID|* returns the contact's unique ID. mailchimp.com, accessed on
- HubSpot automated emails require Marketing Hub Professional or Enterprise. knowledge.hubspot.com, accessed on
- Apple Mail Privacy Protection downloads remote content in the background, whether or not the email is opened. apple.com, accessed on
- Outlook for Microsoft 365, 2021 and 2024 play animated GIFs by default; with animations off, only the first frame. support.microsoft.com, accessed on
- Engine: evergreen with rid on a paid plan, first open sets the start, stored per timer and hashed rid with no expiry; on the free plan it counts from each request; unreplaced tag ignored; expired state as text or 1x1 transparent. Kauntodaun technical documentation, accessed on
- Per-recipient evergreen from Starter up. Kauntodaun technical documentation, accessed on