EmailTimer.App

Countdown timers and personalized images for Shopify Email

Your subscribers see how long is left on the offer, counted from the moment they open the message, and it goes into the Shopify Email campaign you have already built. One snippet, in the merge syntax Shopify Email 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 Shopify Email image block.

Shopify Email 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 Shopify Email 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. Shopify's reference for Liquid in Shopify Messaging lists the customer fields a campaign can read, including {{ customer.first_name }} and {{ customer.email }}. It does not list customer metafields, and the per-subscriber field on this page is one, so send yourself a test before a campaign depends on it. The coupon and deadline tags are names for values you supply, not variables Shopify defines.

First name
{{ customer.first_name }}
Coupon code
{{ discount_code }}
Deadline
{{ custom_deadline }}
Email address
{{ customer.email }}

Checked against Shopify Email's own documentation: Customize your Shopify Messaging campaigns using Liquid (Shopify Help Center), read on 17 September 2026.

The snippet to paste into Shopify Email

Put it in shopify email custom html section or liquid code module. 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 Shopify Email 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="{{ customer.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 Shopify Email as a contact field called customer.metafields.emailtimer.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="{{ customer.metafields.emailtimer.image_url }}" alt="{{ customer.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 Shopify Email

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

  1. 1

    Set up timer in EmailTimer.App

    Choose your design, countdown deadline, and expiration state.

  2. 2

    Export Shopify Email code

    Copy the snippet containing Shopify Liquid tags like {{ customer.first_name }}.

  3. 3

    Paste into Shopify Email editor

    In Shopify Email app, insert a Custom Liquid or HTML section and paste the snippet.

  4. 4

    Send a test email to your store admin

    Trigger a test message from Shopify Email to confirm layout and live GIF playback.

Things that only matter in Shopify Email

Shopify Email templates use Liquid tags for customer attributes like {{ customer.first_name }} and {{ customer.last_name }}.

What your Shopify Email subscribers will actually see

Email client proxy caching affects all email timers. Fixed-date sale timers render accurate countdowns across all recipients.

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.

Shopify Email in practice

Shopify Email countdown timer setup guide

By Danish Mohammed, founder. 5 min read

A countdown bar on a product page runs in the shopper’s browser, and nothing like it runs in an inbox. An email needs the countdown drawn into an image, and Shopify’s own email tool will draw one.

Shopify’s help centre calls that tool Shopify Messaging, and its articles open it from your Shopify admin under Apps, then Messaging. If you know it as Shopify Email, it is the same place.

Does Shopify Email have its own countdown timer

Yes. Managing Shopify Messaging templates lists the section types a template can hold, and one of them is Countdown. Its editing options are an end date and end time, an optional URL, the font, the text colour, the background colour and the section padding. Then: “After you add an end date and time, a live countdown GIF automatically generates. There is built-in padding on the countdown GIF that can’t be adjusted.”

Shopify documents nothing further. Alt text, an image for after the deadline, and a deadline that differs per customer are not among the listed options. The same article does list alt text for its Image and GIF and Video sections. If you want one live deadline for the send, with a font and colours you pick, the Countdown section does that with nothing else installed. Use it.

A timer from elsewhere earns its place when you need something the section does not list. Alt text you write is one, since for a reader with images turned off it is the whole message. An image of your own for after the deadline is another, and so is a different timer family, or a preview of each mail client before you send.

Where the snippet goes

Not in an Image and GIF section. Shopify’s template article says that section takes “an image or GIF from your Shopify files”, or a new upload. An uploaded GIF is a finished file. It cannot count down from the moment somebody opens it, because nothing redraws it.

The snippet goes in a Custom Liquid section. Shopify’s custom Liquid article says these options “let you input custom Liquid or HTML”, with a limit of “Maximum 50 kilobytes (KB) for custom Liquid sections.” A timer snippet is well under one kilobyte. Shopify also notes that “You can only use a desktop device to create a custom Liquid section.”

The alternative is a whole email written as code, which Shopify calls Code your own. That route allows 500 KB, and it adds requirements. The unsubscribe_link or unsubscribe_url variable must be in the code, and so must open_tracking if open tracking is on.

Which Liquid the snippet can use

Shopify is specific here: “The variables that you include in your code need to be supported by custom Liquid.” The list for all email templates includes customer.first_name, customer.email, customer.tags and shop.name, among others. Abandoned checkout automations add an abandoned_checkout object with its own url.

Use those in the link and the alt text, and keep them out of the image address. That address is signed over every parameter it carries. A customer’s name written into it at send time would break the match for everyone, and each customer would get a grey “image unavailable” card, returned with HTTP 200. So Liquid appears only where nothing is signed:

<a href="https://yourstore.com/collections/sale" target="_blank" rel="noopener">
  <img src="https://img.emailtimer.app/i/k7mQ2pXd.gif?w=w_8ha3fq&v=3&sig=YOUR_SIGNATURE" alt="{{ customer.first_name }}, the sale ends at midnight" width="600" height="200" border="0" style="display:block; width:100%; max-width:600px; height:auto; border:0;" />
</a>

The ids in that address are examples. Your own comes from the publish screen, and this shape works on the free plan. Customers who open hours apart see different numbers, because the time left is drawn when their mail client fetches the image.

A deadline per customer

Elsewhere, a per-customer deadline means storing one signed address per customer in a contact field and pointing src at that field. Shopify Messaging’s supported variables include no field that could hold one, and metafields are not on its list for all email templates. The per-customer route therefore has nothing documented to read from, and I would not build a campaign on a variable Shopify does not list.

Two alternatives hold up. An evergreen timer counts from the first fetch of an address, but a campaign address is one clock for the send, started by the first person to open. A recurring timer, such as every Sunday at 09:00 in a named time zone, needs no customer data at all.

If your store sends its lifecycle email through Klaviyo, a Klaviyo profile property can hold a signed address per customer. The Klaviyo setup guide covers that route, which needs Growth or Agency here.

What your customers will see

Past the send, the customer’s mail client is in charge. Microsoft’s Outlook support page says “If only the first frame of the animation appears, you have animations, or animated GIFs, disabled.” Our first frame already shows the time left, so the Outlook reader gets a still countdown with the right number on it. Apple’s Protect Mail Activity “downloads remote content in the background by default”, which can fix the number at delivery rather than at the open.

Countdown timers in Outlook goes version by version, and the email client support page covers the others. Both describe what the vendors document. Neither is a report from a real inbox, because I have not run that test yet.

Test before you send

Shopify’s campaign article documents a test send from the campaign itself. Click Send test, then “enter up to five email addresses that you want to send the test to, one at a time.” Use two of the five on different mail apps.

Look at two things in what arrives. The timer should show the right time for the moment you opened it. And the alt text should read as a sentence, which you can check by turning images off in one client.

Questions and answers

Does Shopify Email have a countdown timer?

Yes. Shopify Messaging has a Countdown section with an end date and time, an optional URL, and font and colour options. Shopify generates the GIF itself.

Why would I use a different timer in Shopify Email?

For something the Countdown section does not list: alt text you write, your own image for after the deadline, a different timer family, or a preview of each mail client before the send.

Can I paste a timer image URL into an Image and GIF section?

Not by anything Shopify documents. Its Image and GIF section is described as taking files from your Shopify files or a new upload. Put the snippet in a Custom Liquid section instead.

Can each customer get their own deadline in Shopify Messaging?

Not through anything Shopify documents. Its supported Liquid variables include no field that can hold a per-customer image address. A store sending through Klaviyo can do it with a profile property.

Is the free plan enough for a Shopify store?

For one sale deadline, yes, as long as the images are fetched fewer than 5,000 times a month. Starter, at $19 a month, covers 250,000 opens a month. The tiers are on pricing.

Sources

Related

Campaigns to build in Shopify Email

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 Shopify Email send

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