EmailTimer.App

Countdown timers and personalized images for HubSpot email

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

HubSpot 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 HubSpot 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.promo_code }}
Deadline
{{ contact.trial_end_date }}
Email address
{{ contact.email }}

The snippet to paste into HubSpot

Put it in hubspot drag and drop html module or custom rich text. 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 HubSpot 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.promo_code }}" 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 HubSpot 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.promo_code }}" 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 HubSpot

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

  1. 1

    Create your countdown or personalized graphic

    Set your deadlines, text styling, and custom contact properties in the EmailTimer.App designer.

  2. 2

    Export the HubSpot token snippet

    EmailTimer.App provides HTML containing HubSpot HubL tokens such as {{ contact.firstname }} and {{ contact.email }}.

  3. 3

    Add an HTML module in HubSpot email builder

    Drag an HTML module or click Source Code inside any text module, then paste the provided embed code.

  4. 4

    Preview as specific contact

    Use HubSpot preview pane to select an existing contact record and review the rendered dynamic values.

Things that only matter in HubSpot

HubSpot allows HubL expression formatting in the link and the alt text. A per-contact deadline for B2B lifecycle and demo reminders needs one signed image address per contact, held in a contact property such as {{ contact.et_image_url }}, because a token placed inside a signed address breaks it.

What your HubSpot subscribers will actually see

Corporate Outlook desktop installations will display the first static frame of the countdown animation. EmailTimer.App renders the first frame with the current calculated time so the visual information is preserved.

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.

HubSpot in practice

HubSpot countdown timer setup guide

By Danish Mohammed, founder. 6 min read

HubSpot has a countdown timer. It is in the wrong tool, and the gap between the two tools is the whole reason this page exists.

Does HubSpot have its own countdown timer

Not for marketing email. HubSpot’s calls-to-action documentation mentions a timer once, in a rule about module limits: “Certain modules can only be added once, such as the countdown timer or video modules.” That is a CTA module, rendered on a page by the browser, where a script can tick a clock every second.

Marketing email has no such module. HubSpot’s default module reference lists what ships with an email template. The one that matters for this job is plain: “The main email body module is a standard rich text module that is included by default in every email template.” No timer appears anywhere in the email set.

Customers have asked for one. A HubSpot Ideas post from January 2025, Countdown Timer Module for Emails, opens: “I noticed that we currently have a countdown timer feature available for CTAs and pop-up boxes, but not for emails.” It names early bird pricing and event registrations as the uses, the kind of deadline a launch or a webinar runs on. In December 2025 a HubSpot reply moved the idea to Not Currently Planned, saying “this isn’t something we’ll be addressing in the next quarter”. That was its status when this page was checked on 17 September 2026.

The reason is the same as everywhere else. A CTA runs in a browser. An email runs inside a mail client that will not execute your JavaScript, so a countdown in an email has to arrive as an image that was already correct when the server drew it.

Where the snippet goes

Start from the module you already have. HubSpot’s rich text documentation gives the exact gesture for getting raw markup into one: “To access the module’s source code, click the Advanced dropdown menu and select Source code.” Paste the snippet into that dialog and save changes.

If you would rather keep the timer in its own block, the drag-and-drop editor behaves the way you expect. HubSpot documents it as a single motion: “To add a new module to the email, click and drag the module from the sidebar editor into position in your email.” Drop a second rich text module where the timer belongs and use the same Advanced menu inside it, so the countdown can be moved or deleted without touching your body copy.

Personalization uses HubL double braces. HubSpot’s token article shows the coded form as {{contact.firstname}} and documents a fallback field: “Enter a fallback value for the personalization token. The fallback value will be used when the contact does not have a value for that specific property.”

A per-recipient deadline rides in the image source rather than in a token appended to it. The signature on a timer URL covers every query parameter, so a token substituted after signing breaks verification for the entire send. Create a contact property to hold a pre-signed URL and reference it directly:

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

Tokens in the surrounding link and in the alt text are safe, because neither attribute is part of the signed input.

Centring is the question that comes up next. In a HubSpot Community thread a user who pasted a countdown into an event email reported “there is no automatic centre alignment for the module”. The accepted answer wraps the image in a paragraph styled text-align: center, calls that quick fix “not recommended anymore”, and suggests a custom module centred with CSS for Marketing Hub Professional or Enterprise. Neither is needed for this snippet. The image carries display:block, which text-align does not move anyway, so put it inside a table cell with align="center", the attribute classic Outlook’s Word engine reads. The full table-wrapped version is in the HTML for an email countdown timer.

What breaks in automations and flows

A workflow email lives far longer than the offer that prompted it. HubSpot will happily keep sending a trial-expiry email for two years, and a fixed deadline inside it goes negative on day two. Set the expired frame when you publish, so the worst case is a graphic saying the window has closed.

The B2B failure mode here is property coverage rather than caching. Lifecycle workflows enrol contacts who arrived by every route your CRM has, and a property written by only one of those routes is empty for everyone who came in another way. A token with no value renders nothing, which turns into an empty src and a broken image. HubSpot’s fallback field solves this for text, and for an image source the equivalent is to gate the module with smart content or to make the workflow write the property as an enrolment action.

The third thing to watch is who owns the module. A rich text module edited at template level propagates; one edited inside a single email does not. Teams that discover a timer problem after a send often fix it in the wrong place, and then find the same stale snippet in nine other emails a month later.

What your recipients will see

HubSpot hands the message to the recipient’s mail client, and the client decides what happens to the picture. Classic Outlook on Windows renders through the Word engine and shows one frame of an animated GIF instead of playing it, so frame one has to be a finished countdown rather than a title card. Apple Mail with Mail Privacy Protection fetches remote images at about the time the message is delivered, so the figure reflects delivery rather than the open. Gmail routes images through its own proxy and may return a copy it already holds on a second open.

HubSpot acknowledges the general shape of this in its own troubleshooting note on custom-coded emails, which warns you “may notice discrepancies in the way your email renders in Outlook, such as positioning or spacing issues”. The countdown-specific version, with the Outlook builds separated out, is on the email client support page. It is documented behaviour rather than something I have photographed, and it argues strongly for a days-and-hours display on a corporate list.

Test before you send

HubSpot puts both checks behind one menu. Click the Preview and test dropdown and select Send test email, then “click the Send test to dropdown menu and select a recipient”. To watch personalization resolve, “click the Preview as contact dropdown menu and select a contact”.

Read HubSpot’s two warnings on that page before you trust the result. “Only verified email addresses can receive test emails”, so an unverified address produces silence rather than an error. And the test arrives “with a from address of noreply@hubspot.com and from name of Marketing Email Preview Send”, which is not the envelope your real recipients get. Send to one Gmail address and one Outlook address, because those two clients disagree about animation and you want to see both.

Questions and answers

Does HubSpot have a countdown timer module for marketing emails?

No. HubSpot documents a countdown timer module in the calls-to-action tool, and its default module list for email templates contains no timer.

Can I reuse the CTA countdown timer in an email?

No. That timer renders in a browser, and mail clients do not run the scripts it needs. An email countdown has to be a server-rendered image.

Where exactly do I paste the snippet in a HubSpot email?

Into a rich text module, through the Advanced dropdown and the Source code option. Every email template already includes a rich text module as the main email body.

Why does my timer image not appear for some contacts?

Usually because the contact property holding the image URL is empty for them, which renders an empty source attribute. Populate the property as a workflow enrolment action so every enrolled contact has one.

Is HubSpot adding a countdown timer module for email?

Not on its current plans. The Ideas post asking for one was marked Not Currently Planned by HubSpot in December 2025, and it still was when this page was checked on 17 September 2026.

How do I centre the timer in a HubSpot email?

Put the snippet inside a table cell with align="center", rather than a paragraph styled text-align: center, because the image is display:block. The table-wrapped snippet is in the HTML for an email countdown timer.

Do I need Marketing Hub Enterprise for this?

No. The snippet goes into a standard rich text module, and on this side the free plan covers 5,000 image opens a month with no watermark. The API your team would use to mint per-contact URLs is on Growth and Agency, and the tiers are on pricing.

Sources

Related

Campaigns to build in HubSpot

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

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