EmailTimer.App

Countdown timers and personalized images for Omnisend email

Your subscribers see how long is left on the offer, counted from the moment they open the message, and it goes into the Omnisend campaign you have already built. One snippet, in the merge syntax Omnisend already uses.

Animated countdown in the digital style, reading 02 days 03 hours 34 minutes 12 seconds and counting down
A render from the engine at 600 by 200, the size that goes into a Omnisend image block.

Omnisend merge syntax

The tags you already use, around the image

The same merge fields that put a subscriber's name in your subject line go in the link and the alt text around the image, where Omnisend fills them in as it sends. They never go inside the image address, for the reason in the warning further down. A name or a deadline drawn inside the image itself comes from an address signed for each subscriber, held in a contact field.

Worth checking in your own account. Omnisend's personalization article writes a built-in contact field as [[contact.first_name]] and a custom property as [[contact.custom_properties.property_name]]. The coupon, deadline and image address tags on this page use the shorter [[name]] form, which that article does not show. Insert each custom field with Omnisend's own personalization picker, use the tag it gives you, and send yourself a test before the campaign goes out.

First name
[[contact.first_name]]
Coupon code
[[discount_code]]
Deadline
[[custom_deadline]]
Email address
[[contact.email]]

Checked against Omnisend's own documentation: Use Personalization in Omnisend (Omnisend Help Center), read on 17 September 2026.

The snippet to paste into Omnisend

Put it in html code block in omnisend builder. There are two shapes, and which one you want depends on whether every subscriber gets the same deadline or their own. The editor generates whichever you pick, already filled in with your ids.

One thing to know before you paste anything. A merge tag cannot go inside the image address. The address is signed, and the signature covers every part of it, so if Omnisend swaps a name into it after signing, the signature no longer matches and every subscriber gets the fallback graphic instead of your timer. It happens quietly, because the image service always answers with a valid picture rather than an error. Both snippets below put the merge tags in the link and the alt text, where they belong and where they work.

One image for the whole send

On every plan, including the free one. Everybody requests the same address, and the clock is worked out at the moment each person opens, which is what lets one address show a different time to every reader. The name and the code go in the link and the alt text.

<a href="https://yourstore.com/sale?code=[[discount_code]]" target="_blank" rel="noopener">
  <img src="https://img.emailtimer.app/i/k7mQ2pXd.gif?w=w_8ha3fq&v=3&sig=YOUR_SIGNATURE" alt="[[contact.first_name]], your 25% off ends at midnight tonight" width="600" height="200" border="0" style="display:block; width:100%; max-width:600px; height:auto; border:0;" />
</a>

A different image for each subscriber

On Growth and Agency. Generate one signed address per subscriber, import the column into Omnisend as a contact field called et_image_url, and point the snippet at that field. This is the only way a deadline that differs per subscriber can work, because the deadline is inside the signature too. A contact whose field is empty gets no image, so check the field is filled across the whole segment before you send.

<a href="https://yourstore.com/sale?code=[[discount_code]]" target="_blank" rel="noopener">
  <img src="[[et_image_url]]" alt="[[contact.first_name]], your 25% off ends at midnight tonight" width="600" height="200" border="0" style="display:block; width:100%; max-width:600px; height:auto; border:0;" />
</a>

The addresses come from the batch endpoint in the REST API, or from a CSV export if you would rather not write code.

Setting it up in Omnisend

Four steps, and the longest one is deciding what the timer should look like.

  1. 1

    Build your timer layout

    Set up countdown styling and recipient-specific merge fields.

  2. 2

    Copy Omnisend embed snippet

    Get HTML code with Omnisend bracketed tags like [[contact.first_name]].

  3. 3

    Insert into Omnisend campaign

    Add an HTML block in Omnisend email designer and paste the code.

  4. 4

    Test with sample contacts

    Send a test email from Omnisend to confirm appearance in your inbox.

Things that only matter in Omnisend

Omnisend writes personalization in double brackets, such as [[contact.first_name]] for a built-in contact field. For automated ecommerce cart recovery, you can combine countdown timers with dynamic discount code tags.

What your Omnisend subscribers will actually see

Apple Mail caching will show time remaining at message delivery. For short 4-hour flash sales, schedule emails to send close to launch time for optimal countdown accuracy.

What each client is documented to do

Email client Fetch moment Cache lifetime GIF animation What EmailTimer.App does Basis
Apple Mail (iOS 15+, macOS Monterey+) Apple Mail Privacy Protection (MPP) Delivery time (pre-fetched by Apple server) Testing reports 2 to 3 days Full 30-second live animation The timer counts down from the time remaining at delivery. A fixed deadline, such as 23:59 UTC, is still the right deadline. Documented by Apple
Gmail (web, iOS, Android) Google image proxy First open by recipient Not published by Google Full 30-second live animation First open displays a real-time countdown. A re-open can be served from the copy the proxy already holds. Documented by Google
Outlook on Windows (2016 to 2024) Word rendering engine Open time Not documented First frame only (static image) Frame 1 is a complete image with the time left at the fetch, so a reader who sees only that frame sees a correct still countdown. Expected, not yet documented or tested
Outlook on the web and mobile (iOS, Android) Native browser or app engine Open time Not documented Full 30-second live animation Expected to play the animation, 30 frames at one frame per second by default. Expected, not yet documented or tested
Yahoo Mail and AOL Yahoo image proxy Open time Not documented Full 30-second live animation Expected to fetch the image when the message is opened and play the animation. Expected, not yet documented or tested

The Apple and Gmail rows rest on Apple's and Google's published documentation and on third-party testing. Neither company publishes a cache lifetime: Apple documents the prefetch, Google documents the proxy, and the two to three days is FreshInbox's 2021 testing. The Outlook and Yahoo rows are what we expect those clients to do, with no vendor document behind them. No row comes from a test by us yet, and we will publish dated screenshots when we have them. Sources: Apple on Mail Privacy Protection, Google on the Gmail image proxy, FreshInbox on Mail Privacy Protection image caching.

Omnisend in practice

Omnisend countdown timer setup guide

By Danish Mohammed, founder. , updated 6 min read

Omnisend ships a countdown timer, and for a lot of stores it is the right answer. Two documented limits decide whether it is yours: the plan it needs, and the single end time it gives every recipient.

Does Omnisend have its own countdown timer

Yes. Omnisend’s help article Add Countdown Timer to Your Emails describes a Countdown timer you drag into a campaign or into an email block inside an automation. You set a date and time, choose one of three formats (DD:HH:MM:SS, HH:MM:SS or MM:SS), pick a font and a colour, and add alt text. When the countdown expires, a fallback image replaces it. Left at the default, that image says “THIS OFFER HAS ENDED”.

The first limit is the plan. The article says “The Countdown timer is available only on the Standard and Pro plans.” If you are on a Free or legacy plan, it tells you to upgrade.

The second limit is the clock. Omnisend’s timer “uses a single fixed end date and time for all recipients.” The next sentence rules out the other reading: “It does not create an individual countdown from send time.” The article’s FAQ asks “Can I create an evergreen Countdown timer?” and answers “No.” The end time follows the time zone in your store settings, under Store information.

So the native block covers one deadline for everybody, on a paid Omnisend plan. If that describes your campaign, use it. What it leaves out is a Free or legacy Omnisend account, and a deadline that differs per shopper.

Where the snippet goes

Omnisend’s answer to the second case is in the same FAQ: “use an HTML block with a third-party countdown timer and Omnisend personalization tags.” The HTML block is documented in Add & Configure Custom HTML Item. That article does not say which Omnisend plans include the HTML block, so check yours before you plan around it.

In the Email Builder, open Add Elements, drag the HTML block into your email, and click it to open the editor on the right. The markup goes in the HTML input. CSS rules go in the separate Styles input, because CSS pasted into the HTML input “may be stripped or ignored”. Two details from Omnisend’s checklist apply directly to a timer. Image URLs must start with https:// and be publicly accessible. And if you copied the snippet out of a visual editor, paste it through a plain text editor first.

The image tag is on Omnisend’s supported list, with the note “Images must use absolute URLs”. The snippet here uses an anchor, an image and inline styles, so it stays inside what the block accepts. Omnisend also says its support team “cannot assist with custom code issues”, so a problem inside the block is yours to debug.

Omnisend’s send-time trick and a signed address

The HTML block article includes a way to make a third-party timer count from send time. It appends [[ current_date | date: '%s' | plus: 86400 ]] to the timer’s image URL, so Omnisend writes the send time plus one day into the address.

That works for an image address nobody has signed, which is what the article was written for. A timer address from here is signed before it ever reaches Omnisend, and the HMAC covers every parameter. Once Omnisend writes a timestamp into it, the signature describes an address that no longer exists. Every contact in the send gets a grey “image unavailable” card, served with HTTP 200, so no report or log flags it.

Getting a clock that starts per shopper takes a different route. An evergreen timer counts from the first fetch of an address, so a single campaign address starts one clock for the whole list. One clock per shopper means one signed address per shopper, made before the send by the batch endpoint in the REST API or by a recipient set, on Growth or Agency.

The tag form for a per-shopper address

Omnisend’s personalization guide is strict about syntax. It says “Personalization syntax must use double square brackets”, gives [[contact.first_name]] as the example, and warns that other formats display as raw text. A custom property is written with its full path, as [[contact.custom_properties.name_of_custom_property]].

A property called et_image_url that holds a complete signed address therefore goes in as the src:

<a href="https://yourstore.com/sale" target="_blank" rel="noopener">
  <img src="[[contact.custom_properties.et_image_url]]" alt="[[contact.first_name]], your offer ends soon" width="600" height="200" border="0" style="display:block; width:100%; max-width:600px; height:auto; border:0;" />
</a>

Omnisend’s fallback filter is written [[contact.first_name | default: "there"]], and its FAQ confirms that single and double quotes both work. Inside a double-quoted HTML attribute, use single quotes or leave the filter out, or the attribute closes early.

The same guide separates two kinds of data, and the difference decides where the address lives. Custom properties “are stored permanently on contact profiles and work in all campaigns and automations.” Event variables only work in automations triggered by that event, and “Campaigns cannot access event variables.” Put the signed address in a custom property, and write it before the automation reaches the email.

What your recipients will see

The mail client takes over at delivery. For Outlook, Microsoft’s support page says “If only the first frame of the animation appears, you have animations, or animated GIFs, disabled.” A GIF from here puts the real time left in its first frame, so a shopper whose Outlook does not animate still reads a correct deadline.

Apple Mail is the other one to plan for. Its Protect Mail Activity setting “downloads remote content in the background by default”, which can fix the number at delivery rather than at the open. The email client support page covers the rest. These are the vendors’ documented behaviours, not results from an inbox test, because no timer here has been through one yet.

Test before you send

Omnisend’s test emails are the wrong tool for a timer held in a property. The personalization guide says “Test emails do not include real contact data”, and that a tag with a default: fallback shows the fallback. Its troubleshooting section adds that editor test emails “will always show raw personalization tags”. The src tag has no fallback, so a broken image in a test email is expected either way.

Omnisend points to two tools that do use real data. Use Dynamic Preview with a contact selected, or send the campaign live to your own address with the property filled in. For an automation, the HTML article is plain: “You can only test Automation Workflows by triggering them yourself”. Place a test order, or fire the trigger event, from a contact whose property you have filled in.

Questions and answers

Is Omnisend’s countdown timer available on the free plan?

No. Omnisend’s help article says the Countdown timer is available only on the Standard and Pro plans, and tells Free and legacy accounts to upgrade.

Can Omnisend’s own timer count down separately for each contact?

No. Omnisend documents that it uses one fixed end date and time for all recipients and cannot create an evergreen timer. For a deadline per contact, Omnisend itself points to an HTML block and a third-party timer.

Can I add current_date to the timer URL the way Omnisend’s article shows?

Not with a signed address. The value would be written in after signing, and every contact would get the grey “image unavailable” card. For a clock per contact, store one signed address per contact in a custom property.

Why does my Omnisend test email show a broken timer image?

Because test emails do not use real contact data, so the property holding the address never resolves. Check it with Dynamic Preview or a live send to yourself.

What does this cost next to Omnisend’s native timer?

The campaign snippet, with one deadline for everybody, is on the free plan here with 5,000 image opens a month. An address per contact needs Growth at $49 a month. Every tier is on pricing, and the free generator makes a one-deadline timer without an account. A timer from the free generator works for 500 opens without an account, and for 1,000 once you sign in and claim it.

Sources

Related

Campaigns to build in Omnisend

Each playbook says which timing model the campaign needs, which snippet it takes, and what to get right before you send it.

Setting this up on another platform

The snippet is the same everywhere. Only the merge syntax changes, and each page below carries the exact syntax that platform expects.

All 21 platform setup guides

Put a timer in your next Omnisend send

Free for 5,000 opens a month, $19 for 250,000, and the snippet above is the whole integration.