Menu

Image personalization for email, one picture per subscriber

Each subscriber's name, code, points or deadline, drawn into the picture at the moment the email opens.

Free for 5,000 opens a month. Pictures drawn for each recipient come with Growth and Agency.

Priya, your Gold discount ends in. Use PRIYA20 at checkout. 1 day 23 hours 45 minutes 34 seconds left, in gold on navy.
Maya, your Gold discount ends in. Use MAYA20 at checkout. 23 hours 45 minutes 34 seconds left, in gold on navy.
Lucas, your Bronze discount ends in. Use LUCAS10 at checkout. 2 days 8 hours 45 minutes 34 seconds left, in soft orange on slate.
Tom, your Silver discount ends in. Use TOM15 at checkout. 1 day 2 hours 45 minutes 34 seconds left, in ice blue on navy.

What image personalization can put in an email

Anything you hold per subscriber can be set into the pixels, in your fonts and colors, and look the same in every mail app. These are real renders from the engine, one template each, and every one has its own guide.

Hi Maya, your rewards: a gold badge, 1,240 points, member 20418, next tier Platinum at 2,000 points, with a blue progress bar 62 percent full

Loyalty points and tiers

Each member's tier, points and number, with a bar to the next tier. A rule draws each tier in its own color.

Loyalty program emails
Hi Maya, your code is SAVE20-7QX2K, 20% off, one use, ending in 4 days 13 hours 59 minutes, with a QR code to scan at the till

A coupon code that is theirs

One single-use code per subscriber, a QR code of it for the till, and the clock to its own end date.

Unique coupon codes
An event ticket for Maya, ticket number TKT-48213, with a QR code to show at the door

Tickets with a QR code

Each attendee's ticket number as text and as a QR code, ready to scan at the door.

QR codes in email
Hi Maya, here is your course: 3 of 5 lessons done, with a blue progress bar 60 percent full

Progress bars

Lessons done, a goal raised or a profile completed, drawn as a bar from each person's own number.

Progress bars in email
Maya, 2 of 3 friends have joined, a progress bar two thirds full, and her code MAYA-K7Q2

Referral progress

Each referrer's own code and how many friends have joined, with the reward still to come.

Referral emails
A certificate of completion for Maya Fernandes, Email Deliverability Basics, with a credential ID and a QR code to check it

Certificates in bulk

A named certificate of completion for every attendee, with a credential ID and a QR code to check it.

Certificates by email
Here is your 2026, Maya: 14 orders, Knitwear as your favorite, 2,340 points earned, 660 points to Gold

Their year in review

Each customer's own orders, favorite category and points for the year, in one picture.

Year in review emails
An event pass for Priya Shah, Harbor Goods, seat B14, with a QR code of her ticket number

Name badges from a list

One row per guest becomes one pass, with the name, company, seat and a code, the way a mail merge would.

Image mail merge
Hi Maya, 840 points expire in 4 days 12 hours, with a bar to the next reward at 1,000

Points that are about to expire

The balance, the clock to the day it lapses, and how far they are from the next reward.

Hyper personalization
Happy birthday, Sarah, above a countdown of 07 days 11 hours 59 minutes, drawn from the value SARAH

Birthdays and names

Their name in the artwork, set in your typeface, with a fallback for the rows that have none.

Birthday email templates
The linen overshirt: your size is nearly gone, fewer than 20 left in size M

Stock in their size

A low-stock line for the size or variant each person looked at, from the value on their row.

Real time personalization

How each subscriber's values reach their picture

Nothing about the person travels in the image address. The values stay in EmailTimer.app, and the picture is drawn from them when the mail app asks for it.

  1. Design one template

    Add text, image, QR code, progress bar and timer layers, and declare a variable for each value that changes, with its fallback.

  2. Bring the values

    Upload a recipient list of up to 500,000 rows, or send the values through the API. Each row is checked, and a bad date is reported by its line.

  3. Send one address per person

    Each row gets its own signed image address, carrying an opaque token rather than a name. Add it to a contact field in Klaviyo, Braze or whichever platform sends.

Built for large campaigns

Lifecycle teams send millions of personalized pictures a month. The limits and the failure modes are written down, so you can plan a send rather than discover them during one.

500,000
rows in one recipient list, each validated with a per-row error report
5,000,000
opens a month on Agency, with images served from domains that carry your name
No names
in the image address: an opaque token, looked up when the picture is drawn
Fallbacks
for every variable, so a missing value draws a default or hides its layer

Image personalization in email, in detail

By Danish Mohammed. , updated 7 min read

Image personalization in email means each picture is generated at the moment a recipient’s mail client asks for it, with that person’s own values drawn into the pixels rather than laid over the top in HTML. EmailTimer.app renders these on the same engine that renders its countdown timers, so a name, a voucher code and a live deadline can arrive as one picture on one plan. The free plan covers 5,000 opens a month and carries no watermark.

What “renders at open” actually means

Nothing is baked at send time. The email carries an image address, the recipient’s client requests that address when the message is displayed, and the renderer composes the picture in that request.

Drawing at the request is what makes a countdown possible at all, and it is the same mechanism that lets an image reflect a value you uploaded minutes before the send. It also means the picture is subject to whatever the mailbox does between the send and the read. Apple’s privacy page states that “Protect Mail Activity downloads remote content in the background by default”, regardless of engagement, so for those recipients the fetch happens at delivery. Google Workspace documents that “Gmail uses Google’s secure proxy servers to serve images”. Neither of those changes a name or a price, which do not move. They matter for a clock, and the email client table covers what each one does.

Postcards hung on a string with wooden pegs
Every card on the line is a different picture. Drawing at the request lets one image address work the same way: one design, composed for each person as they open it. Photo: Pixabay, Pexels

What a merge value can change

What a merge value can change
What you want to change How it is done Example
Text in the picture A text layer bound to a variable A greeting with the subscriber’s first name
Which picture appears An image layer whose source is chosen from your uploaded assets A product shot that matches the category they browsed
A colour A rule that swaps a colour by value A loyalty tier drawn in its own brand colour
Whether a layer appears at all A rule that shows or hides a layer An early-access pass that only VIPs see
A whole layer set A named variant, selected by rule or by a parameter A different composition per market
A scannable code A QR layer whose payload comes from a variable A per-person claim link
A measured value A progress bar or a star rating driven by a number Points to the next reward, or an average review score
A live deadline A timer layer Hours left in the offer

Rules are an ordered list, each reading IF <variable, country, device or date> <is, is not, greater than, less than, contains, empty or not empty> <value> and then acting. Values pass through transforms before they are drawn: date and number formatting, currency, upper, lower and title case, truncation with an ellipsis, simple arithmetic, and string concatenation.

Every variable is declared with a type and a fallback behaviour, so a missing value can draw a default, hide its layer, or hide the whole personalization group it belongs to. That declaration is the difference between a template that degrades and one that ships a gap where a name should be.

Hi Maya, here is your month: a gold badge reading GOLD, 840 points, and a progress bar most of the way to the next reward at 1,000 points Hi Tom, here is your month: a grey badge reading SILVER, 310 points, and a progress bar about a third of the way Hi there, here is your month, with the line Join the club and your points show up here
One template and three subscribers. The name, the tier, the points and the bar come from merge values, and a rule draws Silver in grey. The third subscriber has nothing on file, so the name falls back to there and the member group is hidden.

Country and device conditions are marked best-effort in the editor. An image proxy sits between you and the reader on several major clients, so the signal is not reliable. The editor says so on the screen where you set the rule, rather than in a footnote.

The opaque token, so no name travels in the address

A personalized image needs the recipient’s values at request time, and the obvious way to supply them is to put them in the address. That means an email address or a name sitting in plain text in a URL, in a message, in a proxy log, and in whatever forwards it.

The alternative here is a recipient set. Upload a CSV of up to 500,000 rows, and the job parses and validates it with a per-row error report, so a file with three bad dates in 40,000 lines tells you which three. Each row gets an opaque token. The address then carries r=tok_… and nothing else about the person, and the renderer looks the values up server-side.

Tokens are available on every plan that includes recipient sets from the first day, and the documentation states the trade-off plainly rather than burying it. The full parameter reference is in the merge tags documentation.

One plan for timers and images

This category has historically sold the clock and the picture as two subscriptions. A marketer who wants a flash sale deadline and the subscriber’s first name and a voucher code in the same image was paying twice for one idea.

Here the prices are published in US dollars, with no sales call. Free covers 5,000 opens a month. Starter is $24 for 250,000. Growth is $54 for 1,000,000 and adds the API and per-recipient addresses. Agency is $164 for 5,000,000 and adds white-label image domains. Going over does not break a campaign: warnings arrive at 80 and 100 percent of the allowance, and past 110 percent new renders carry a small corner watermark. The current figures are on pricing.

For context on what the rest of the market publishes. NiftyImages, read on 23 September 2026, prices Starter, Growth and Scale against a slider of opens a month: Starter is $59 monthly for 25,000 opens a month, or $564 a year, rising to $549 monthly at 500,000. Its developer API sits on an Enterprise tier priced as a custom annual quote with no published number. The rest of this paragraph was checked on 17 September 2026. Zembula’s pricing page is headed “BUILT FOR THE ENTERPRISE” and quotes “$0.07 per 1,000 emails sent annually (paid annually)”, gated on “Sending 1+ billion emails annually”. Movable Ink publishes no pricing at all; its pricing path returns a 404, and every call to action on the product pages is a demo request or a contact form. Each of the three has a page of its own here: NiftyImages, Zembula and Movable Ink.

Those are three different businesses, and two of them are aimed at buyers this product is not aimed at. The comparable number is the one at the bottom of the range, which is where the gap sits.

What this does not do

Personalized images here are composed from values you supply and assets you have uploaded. There is no arbitrary external fetch at render time, which is a deliberate security position rather than a roadmap gap. Live values come from places you set up: a data store or your own web endpoint, the weather, a map and a live counter. The live data page says exactly what the honest version of that looks like.

There is also no SOC 2 report and no ISO 27001 certificate, and the security page lists what the product actually does instead, in enough detail to be checked.

How to set it up

  1. Open the gallery and pick a design, or start a blank canvas at 600x200, 600x300 or 300x250.
  2. Add your layers. Background, text, image, shape, QR code, progress bar, star rating and timer are all available.
  3. Declare a variable for each value you want to change per recipient, with its type and its fallback behaviour.
  4. Add conditional rules for anything that should appear only sometimes, and name a variant if a whole layer set changes.
  5. Preview with sample values. The editor preview calls the same renderer that serves the inbox, so what you approve is what gets sent.
  6. Publish. The readiness checks report the image size, the frame count and the version going live, and a publish that cannot render is refused rather than shipped.
  7. Copy the snippet for your platform, or upload a recipient set and export one signed address per row for a genuinely per-person image.
  8. Paste into an HTML block in your builder, send a seed email, and view the source to confirm the address is unchanged.

Try a timer without an account in the countdown timer generator. The per-platform syntax is in the merge tag guide, and the batch endpoint is in the API reference.

Questions and answers

How is this different from a merge tag in the email body?

A merge tag in body text is plain text styled by HTML and CSS, which mail clients render inconsistently and which cannot sit inside a designed composition. A value drawn into an image is pixels, so it looks identical in every client and it can be positioned, styled and masked like any other element.

Can I put a name and a countdown in the same picture?

Yes, and that is the reason this product exists as one product. A template with a timer layer and text layers renders as an animated GIF carrying both.

Does personalizing an image slow the email down?

The digits and the fixed artwork of a timer are drawn once and reused, so an open copies those pieces into the frames rather than drawing every letter again. There is no render time measured in production to quote yet, so this page does not quote one. The image service also answers every request with a valid picture rather than an error, so a slow dependency degrades to a fallback rather than to a broken image icon.

Do I need a developer for this?

Not for a whole-send image or for a CSV-driven one, both of which are editor and upload work. You need code only if you want to mint addresses from your own systems, which is what the API is for.

What happens to a recipient whose data is missing?

The variable’s fallback decides: a default value, a hidden layer, or a hidden group. Set it while you are building rather than after somebody reports a gap.

Sources

Personalized images, drawn at open

Drawing a recipient name, a code or a balance into the pixels, and what survives a proxy cache.

Related

Every hub on this site is listed on guides and articles.

Put a countdown in the campaign you are writing now

The free plan covers 5,000 opens a month with no card. Starter is $24 a month for 250,000.