EmailTimer.App

Countdown timers and personalized images for Brevo email

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

Brevo 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 Brevo 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.

First name
{{ contact.FIRSTNAME }}
Coupon code
{{ contact.COUPON }}
Deadline
{{ params.deadline }}
Email address
{{ contact.EMAIL }}

The snippet to paste into Brevo

Put it in brevo html block in drag and drop editor. 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 Brevo 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={{ contact.COUPON }}" target="_blank" rel="noopener">
  <img src="https://img.emailtimer.app/i/k7mQ2pXd.gif?w=w_8ha3fq&v=3&sig=YOUR_SIGNATURE" alt="{{ contact.FIRSTNAME }}, 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 Brevo 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={{ contact.COUPON }}" target="_blank" rel="noopener">
  <img src="{{ contact.ET_IMAGE_URL }}" alt="{{ contact.FIRSTNAME }}, 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 Brevo

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

  1. 1

    Configure template in EmailTimer.App

    Choose your timer style, colors, and dynamic contact parameters.

  2. 2

    Copy Brevo merge snippet

    Copy the generated image tag formatted with {{ contact.FIRSTNAME }} syntax.

  3. 3

    Add HTML block in Brevo

    In Brevo email designer, drag an HTML block into the template and paste your code.

  4. 4

    Preview campaign data

    Use the Brevo Preview and Test tab to view tag substitution with test contact data.

Things that only matter in Brevo

Brevo attributes are case-sensitive and formatted as {{ contact.ATTRIBUTE_NAME }}. Transactional parameters arrive via {{ params.custom_variable }}.

What your Brevo subscribers will actually see

Apple Mail pre-fetching caches images upon receipt. The Gmail proxy caches per recipient for a lifetime Google does not publish, so a re-open can be served from the cached copy. EmailTimer.App serves proper Cache-Control directives to minimize stale proxy storage.

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.

Brevo in practice

Brevo countdown timer setup guide

By Danish Mohammed, founder. 5 min read

The pages competing for this search repeat the same two claims about Brevo automations. I went looking for the source of both. What I found comes before anything else here.

Does Brevo have its own countdown timer

Brevo’s help centre refused every automated request I made while writing this, so I cannot quote it, and I will not pretend otherwise. What I can show you is Brevo’s own community, where the question has been asked and answered in public.

The thread How to insert a Countdown? opens on 13 November 2024 and runs to September 2025. A Brevo moderator takes part. Every answer in it points somewhere outside Brevo: a JavaScript tutorial first, then NiftyImages, then CleverTimer, then an integration called Mailix. Nobody in the thread, including the moderator, replies that Brevo has a countdown block you could drag in.

Read that for what it is. It is strong evidence of absence rather than a statement of absence, and it is the most I can honestly claim without a page from Brevo I can quote.

Where the snippet goes

The mechanics are settled in the same thread. The answer from the Mailix representative describes the route exactly: “generate a custom countdown with HTML that you can then add as a html block in the Brevo editor.” Drag the HTML block into your design and paste the image tag into it.

Contact attributes use double braces and an uppercase attribute name. Brevo’s campaign API reference documents both forms side by side. A classic campaign uses the single-brace shape, so a first name is {FNAME}. With the newer template language, the reference says to “use {{contact.FNAME}} {{contact.LNAME}} for personalization”, which is the form to use in a drag-and-drop campaign. Transactional variables arrive separately as {{params.variableName}}, documented in Brevo’s transactional email guide with examples such as {{params.trackingCode}}.

A per-contact deadline does not go in the query string. Every parameter on a signed timer URL is inside the signature, so an attribute substituted after signing breaks verification for the whole send. Store a pre-signed URL on a contact attribute and reference the attribute as the image source:

<img src="{{ contact.ET_IMAGE_URL }}" width="600" height="200" border="0" alt="Your offer ends soon" />

Create the attribute exactly as you will type it. The attribute name has to match the one on your Contact attributes page, and an uppercase convention is what Brevo’s own examples use throughout.

What breaks in automations and flows

Here are the two claims every competing page makes, with their actual provenance.

The first is that timers cache on Brevo’s servers inside automated workflows. The source I can find for it is a competitor’s how-to page, CountdownMail’s Brevo guide, which states: “In automations (automated workflows), the timers can get cached on Brevo’s servers and fail to update. This means the timer might display the same time over and over instead of counting down.” No Brevo documentation I could reach says this. Treat it as a vendor’s field report worth testing on your own account rather than as a documented platform behaviour.

The second is a setting. The same page says to “Go to Campaigns > Settings > Default Settings” and confirm that “the ‘Hide Image URL’ option is set to ‘No’”, on the grounds that images “might not load” otherwise. Again, that is a third party describing Brevo’s interface. It costs you thirty seconds to check the setting, and it is the first thing to look at if your image renders in preview and not in the inbox.

I would rather hand you a weak source labelled as weak than a confident sentence with nothing behind it. If you hit either behaviour, write to me with the campaign type and I will publish what I find.

Separately from those two, the ordinary automation problem applies here as everywhere. A workflow email outlives the offer it was written for, so a fixed calendar deadline inside one goes negative. Set the expired frame at publish time.

What your recipients will see

Brevo hands the message to the recipient’s mail client, and from there the picture is that client’s business. Classic Outlook on Windows renders through the Word engine and shows one frame of an animated GIF rather than playing it, so frame one has to carry the real numbers by itself. Apple Mail with Mail Privacy Protection fetches remote images at about the time the message is delivered, which pins the number to delivery rather than to the open. Gmail fetches through its own image proxy and can serve a copy it already holds when the same recipient opens the mail again.

This is documented client behaviour rather than a render I have watched in a real inbox, and the version with each Outlook build named is on the email client support page. It also explains the shape of the two claims above. A timer that appears frozen inside an automation has several possible causes, and a proxy holding an old copy is a far more common one than a sending platform caching an image.

Test before you send

Use the Preview and Test tab on the campaign before you schedule it, with a real test contact selected so the attribute resolves to a URL rather than to an empty string. Then send yourself the campaign as a test.

Do the second half in two inboxes. A preview proves the markup is right and the attribute has a value. Only a delivered message proves that the recipient’s client fetched the image, which is the step where Outlook and Gmail behave differently from each other and from the editor.

Questions and answers

Does Brevo have a built-in countdown timer block?

Not one I can point you at. Brevo’s own community thread on the question, with a moderator taking part, sends every asker to a third-party tool.

Where do I paste countdown timer code in Brevo?

Into an HTML block in the drag-and-drop editor, which is the route described in that community thread. The image tag goes in whole, including the link and the alt text.

Why does my Brevo timer stop updating inside an automation?

A competitor’s guide blames caching on Brevo’s servers, and no Brevo documentation I could reach confirms it. Before accepting that explanation, rule out the recipient’s own mail client, which caches images far more often than a sending platform does.

What is the Hide Image URL setting?

A default campaign setting that a third-party guide says must be set to No for timer images to load. Check it under Campaigns, then Settings, then Default Settings if your image previews correctly and does not arrive.

Brevo used to be Sendinblue. Does anything differ?

No, the attribute syntax and the HTML block are the same product under a new name. Older guides on a /sendinblue slug describe the same editor. What it costs on this side is 5,000 image opens a month free, and the rest is on pricing.

Sources

Related

Campaigns to build in Brevo

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 Brevo send

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