How to add an evergreen countdown timer to a Klaviyo flow
Published September 26, 2026 · Klaviyo steps checked against its help center on September 26, 2026
A fixed-date timer fails in a flow: people enter it on different days, so a shared deadline is already over for some of them. An evergreen timer gives each recipient their own deadline. With DynaMail you pass that deadline in the image URL, and Klaviyo fills it in for each person when it sends the email.

How it works
A DynaMail countdown reads its deadline from the widget, unless the image URL carries a referenceDate= parameter, which wins. So the trick is to let Klaviyo write a different date into each recipient’s image URL. Klaviyo fills in template tags when it sends the email, which means the date is fixed for that recipient from then on: reopening the email later shows less time left, not a fresh countdown.
This is a long-standing request. In a 2021 Klaviyo Community thread (opens in a new tab), a flow builder asked for “the specific Klaviyo timestamp so that the timer starts from the time the email is sent”. Method 1 below does that with tags from Klaviyo’s own date reference.
Method 1: a deadline a few days after the email is sent
Create and save a countdown widget
Make a countdown in DynaMail with the design you want and any date; the saved widget supplies the look and the timezone. The free countdown generator works, and a free account lets you edit the design later.
Open the flow email
For a new email, Klaviyo’s flow article says to drag the email component from the sidebar onto the flow canvas, click the card, then click Select template to create the content. For an existing flow email, click its card on the canvas.
Add an HTML block and paste this
Add an HTML block where the timer should go (Klaviyo’s documented block for timers), clear it, paste the code below and apply the change.
Deadline 3 days after send
{% today "%Y-%m-%d" as today %} <img src="https://img.dynamail.io/widgets/YOUR-WIDGET-ID/render.gif?referenceDate={{ today|days_later:3 }}T23:59:59&r={{ email|urlencode }}" alt="Time left on your offer" width="600" height="196" style="display:block;border:0;" />What each part does:
{% today "%Y-%m-%d" as today %}is Klaviyo’s documented date tag. Klaviyo says it must come before any use of{{ today }}.{{ today|days_later:3 }}prints the date three days after the message is sent, asYYYY-MM-DD. Change 3 to the number of days you want.T23:59:59is plain text that completes the date, so the offer runs to the end of that day in the widget’s timezone. As long as Klaviyo’s date and the widget share a timezone (see the note below), everyone gets at least three full days.r=is optional open tracking: the recipient’s email, URL-encoded with Klaviyo’surlencodefilter.
Preview with a recent event, then send a live test
Klaviyo’s preview can use a real profile and, for flow emails, a recent event. Check that the timer shows the time left to the date you expect, then send a live test to yourself before switching the email to Live.
Method 2: a deadline you already store
If the deadline already lives on the profile (a trial end, a coupon expiry) or on the event that triggers the flow, put that value in the URL instead. Klaviyo’s personalization reference uses dot notation, {{ person.property_name }}, for names without spaces; an event property is {{ event.property_name }}.
Deadline from the offer_expires_at profile property
{% if person.offer_expires_at %}
<img src="https://img.dynamail.io/widgets/YOUR-WIDGET-ID/render.gif?referenceDate={{ person.offer_expires_at|urlencode }}&r={{ email|urlencode }}" alt="Time left on your offer" width="600" height="196" style="display:block;border:0;" />
{% endif %}- The
{% if %}wrapper, from Klaviyo’s conditional logic reference, skips the timer for profiles without the property. Without it, an emptyreferenceDatecounts as missing, and those profiles see a countdown to the date saved on the widget instead. - Keep the property name free of spaces. Klaviyo’s lookup form for other names needs quote marks, which do not belong inside an HTML attribute.
urlencodeprotects characters such as spaces and the+in a timezone offset.- DynaMail reads ISO 8601 dates and times, such as
2026-11-27T09:00:00or2026-11-27T09:00:00-05:00. A value without an offset is read in the widget’s timezone.
What this cannot do
- It cannot start the clock when the email is first opened. The deadline is set when Klaviyo sends the email, or by the date you store.
- Klaviyo’s documented date filter works in whole days. For a window in hours, store the exact deadline and use Method 2.
- The usual image caveats apply: Apple Mail may load the image early, and classic Outlook may show only the first frame. The basic Klaviyo countdown guide covers both.
Sources
Every Klaviyo step above comes from these pages, read on September 26, 2026. Apps rename menus often; if a step no longer matches what you see, the source page is the place to check.
- Klaviyo: How to add a countdown timer to an email (opens in a new tab)
- Klaviyo: Date personalization in templates reference (opens in a new tab)
- Klaviyo: Message personalization reference (opens in a new tab)
- Klaviyo developers: Django filter glossary (opens in a new tab)
- Klaviyo: Conditional logic reference for templates (opens in a new tab)
- Klaviyo: How to add an email to a flow (opens in a new tab)
- Klaviyo: How to preview and send test emails in Klaviyo (opens in a new tab)
- Klaviyo Community: Dynamic Timers To Flows (2021 thread) (opens in a new tab)
Frequently asked questions
What is an evergreen countdown timer?
A timer whose deadline is different for each recipient, usually a fixed time after they enter a flow or after the email is sent. Everyone gets the same amount of time instead of racing one shared date.
Does the deadline reset when someone opens the email again?
No. Klaviyo writes the date into the image URL once, when it sends the email. Every later open requests the same URL, so the deadline stays put and the time remaining keeps shrinking.
Which timezone does the deadline use?
DynaMail reads the date in the timezone saved on the widget (or the one you pass as timezone=). Klaviyo does not document which timezone its today tag uses, so check the printed date in a test send before the flow goes live.
Can the deadline be a number of hours instead of days?
Not with Klaviyo’s documented tags: days_later works in whole days. For an hours-based window, store the exact deadline on the profile or event and use the stored-date method in this guide.