How to Add a Countdown Timer to Klaviyo Emails
October 12, 2026 · 5 min read
Klaviyo doesn't have a built-in countdown timer block, but its drag-and-drop editor has a dedicated HTML block. Klaviyo's own docs literally list "third-party features like countdown timers" as the use case. A countdown timer for email is just an image URL that renders fresh on every open, so the whole job is: design the timer, copy one snippet, paste it into an HTML block. You can have this running in about five minutes.
What you need
- A Klaviyo account with a campaign or flow email to edit.
- A Countello countdown (free plan works, no credit card needed).
- Five minutes and one test send to yourself.
Step 1: Design the timer in Countello
Create a countdown and pick a mode that matches your send: Fixed gives everyone the same deadline (a launch, a sale end); Evergreen starts the clock when each email goes out; Personalized lets each recipient get their own deadline via a merge tag in the URL. Set colors, shape and unit labels to match your email, and choose what happens at zero (show zeros, a custom message like "Sale ended", or your own image). The style gallery shows every look the editor can produce.
Step 2: Copy the embed snippet
Open the countdown's Embed panel and choose Klaviyo as the provider. Countello gives you a small table-wrapped <img> snippet. The table keeps it centered and portable across email clients. The image URL looks like this:
<img src="https://img.bestcountdownapp.com/t/your-timer.gif" alt="Countdown timer" width="600">If you set a click-through URL, the snippet wraps the image in an <a> tag so the timer itself is clickable. Send it to your sale page.
Step 3: Paste it into Klaviyo
- Open your campaign or flow email in the Klaviyo drag-and-drop editor.
- Drag an HTML block into the layout where the timer should appear, right above your call-to-action works well.
- Click the block and paste the snippet into the code panel.
- Save, then send yourself a test email.
Step 4: Optional: a personal deadline per recipient
For personalized timers, Countello appends ?end= to the image URL and Klaviyo fills it per recipient. Store the deadline in a custom profile property (for example countdown_deadline) formatted as ISO 8601 UTC (like 2030-01-31T12:00:00Z) or Unix seconds, then reference it in the URL as a template variable:
<img src="https://img.bestcountdownapp.com/t/your-timer.gif?end={{ person.countdown_deadline }}&sig={{ person.countdown_sig }}">Klaviyo renders {{ person.property_name }} inside HTML blocks per recipient. If you require signed URLs in Countello, the &sig= value must be precomputed by your own backend (Klaviyo can't compute HMAC signatures) and stored as another profile property. Official docs on profile properties in templates: https://help.klaviyo.com/hc/en-us/articles/4408802648731
Where to place it, and how many to use
One timer per email is the rule. Two ticking images compete instead of compounding. The highest-leverage position is immediately above your main call-to-action, so the eye lands on the deadline and the button in one glance. If your email opens with a full-width hero image, the timer can also work directly under it, before any copy.
In Klaviyo the HTML block can sit anywhere a normal block can, including inside a two-column layout. But a centered, full-width placement reads better on mobile, which is where a large share of opens typically happens. Keep the image width at or under 600px so it doesn't force horizontal scrolling in narrow preview panes.
Flows vs campaigns
In a campaign, a Fixed countdown to a shared deadline is the usual fit. Paste the snippet once and every recipient sees the same end time. In a flow (abandoned cart, post-purchase, welcome series) emails send continuously, so a Fixed deadline would expire for later recipients. Use Evergreen (each email starts the same duration from its send time) or Personalized (a deadline stored per profile). The merge-tag step above covers the personalized case; evergreen swaps ?end= for ?start=.
A note on deadlines and honesty
A countdown only works if readers trust it. Keep the deadline real (an offer that quietly extends makes the next countdown inert) and design the expired state so late openers see a finished message (zeros, "Sale ended", or a swapped image) rather than a timer frozen mid-flight. The trust is the asset; the timer just displays it.
If something doesn't work
- Timer shows a stale time on re-open. Gmail and other clients cache images through proxies. Countello serves the GIF with fresh-per-request caching, but a proxy may still hold a copy. Put the deadline as plain text next to the timer so the message survives a cached image.
- Timer is frozen in the test send. The animated GIF plays its frames once (up to 60) and then holds on the last frame; that's by design. Re-open or re-send to see it animate again.
- Outlook desktop shows a static image. Outlook's desktop apps render only the first GIF frame. Countello's first frame shows the real time remaining at fetch. Design it to look finished on its own.
- Personalized timer shows the expired state. Check that the profile property exists, is a text property (not a date), and contains an ISO 8601 UTC or Unix-seconds value. A '+' timezone offset must be %2B-encoded.
Related reading
Using another platform? See how to add a countdown timer to Mailchimp, or check which clients actually support countdown timers. Ready to try it? Create a free countdown. Three active timers and 5,000 image views a month included.
Free includes 3 active countdowns and 5,000 image views a month.
Create a free countdownKeep reading
- How to Add a Countdown Timer to MailchimpMailchimp has no countdown block, but its Code block takes custom HTML. Design a timer in Countello, copy the snippet, paste it into a Code block. Done.
- Email Countdown Timer Compatibility: The Full GuideHow countdown timers behave in Gmail, Apple Mail, Outlook, dark mode and image-blocking clients. What actually happens to the GIF, and a design checklist.
- Evergreen Countdowns for Abandoned Cart EmailsAn abandoned-cart deadline should start when each email goes out, not on a fixed date. Evergreen countdowns with ?start= do exactly that, here's how.
