You can embed each recipient's name into an email image automatically, without opening a design tool for a single one of them. You build one template with a placeholder layer, and your email platform fills in each subscriber's details as it sends. Sarah receives an image that says Sarah. James receives one that says James. You made one image.
If you are currently duplicating a Canva design and retyping names, this replaces that job entirely.
How it actually works
The mechanism is simpler than most people expect, and it relies on something your email platform already does perfectly.
An image in an email is just a URL. Your email client requests it and displays whatever comes back. Your email platform will also substitute merge tags inside a URL, exactly as it does in body text.
So instead of a fixed image file, you use a URL with the name as a parameter:
https://media.okzest.com/img?c=YOUR-COMPANY-ID&i=YOUR-DESIGN-ID&name=Sarah
c is your company ID, the same for every design in your account. i identifies this specific design. Everything after them is a dynamic layer you defined in the template.
Then you swap the value for your platform's merge tag:
<img src="https://media.okzest.com/img?c=YOUR-COMPANY-ID&i=YOUR-DESIGN-ID&name={{ first_name }}" alt="A message for {{ first_name }}" />
That is the entire integration. One image tag, one template, any number of recipients.
Why nothing is generated in advance
Worth understanding, because it explains why this scales when manual editing does not.
The image is not created when you hit send. It is created when the recipient opens the email. There is no batch job producing 50,000 files, nothing to store, and no wait before your campaign can go out - the send is ready the moment the template is saved.
It also means the image can show information that is current at the moment someone looks at it rather than frozen at send time: a live price, a real countdown, an up-to-date points balance.
Setting it up
Step 1 - Build the template
Create a design at your email image dimensions. 600 x 300px works for most email banners; design at 2x (1200 x 600px) so it stays sharp on high-density screens.
Add your background, logo, brand colors, and any fixed copy. Then add a dynamic text layer where the name should appear and give it a field name - name is the obvious choice. This is the layer that will change per recipient.
You can add more than one: name, company, city, product, whatever your data supports.
Step 2 - Check your data
Your email platform already holds the fields you need. Before you use them, look at what is actually in there:
| Field | Watch for |
|---|---|
| First name | Blanks, full email addresses, "N/A", all-lowercase entries |
| Company | Very long names that will overflow the layout |
| Any field | Inconsistent capitalization from different import sources |
Real subscriber data is messier than sample data. It is worth ten minutes sorting your list by name length and skimming both ends.
Step 3 - Build the URL with merge tags
Take the image URL and replace the sample values with your platform's merge tags. The syntax differs slightly by platform:
- Klaviyo:
{{ first_name|default:'there' }} - Mailchimp:
*|FNAME|* - HubSpot:
{{ contact.firstname }} - ActiveCampaign:
%FIRSTNAME%
Always set a fallback. In Klaviyo that is the |default:'there' part above. Without one, a subscriber with no first name on file sees a blank space inside an otherwise finished graphic. Most platforms support a default value; use it every time. This single step prevents the most common failure in live sends.
Step 4 - Add it to your email
In your email builder, add an image block and set its source to your URL. If you are working in HTML, it is a standard tag:
<img src="https://media.okzest.com/img?c=YOUR-COMPANY-ID&i=YOUR-DESIGN-ID&name={{ first_name|default:'there' }}"
alt="A personalized message for {{ first_name|default:'you' }}"
width="600" />
Set an explicit width, and write alt text that carries the message on its own. Many clients block images by default, Outlook among them, so the email needs to still make sense without them.
Step 5 - Test before you send
Use your platform's preview feature with real subscriber profiles, not sample data. Check specifically:
- The longest name on your list. Does it overflow or shrink awkwardly?
- A subscriber with a missing field. Does the fallback appear as intended?
- Gmail and Outlook. Send yourself a test in both; Outlook's rendering differs most.
- Mobile. Most opens happen on phones.
Testing with five real profiles catches nearly everything that would otherwise surface at 10,000.
What usually goes wrong
Mismatched field names. If your template layer is name and your URL parameter says first_name, nothing renders. They have to match exactly, including case.
No fallback value. Covered above, and worth repeating because it is the most common cause of an embarrassing send.
Long names breaking the layout. "Jo" and "Bartholomew" need very different amounts of space, as do "IBM" and a long German company name. Design with the long cases in mind or use auto-fitting text.
Low resolution. Design at 2x your display size or the image looks soft on modern screens.
Over-personalizing. Name, company, city, job title and last purchase all in one graphic reads as surveillance rather than attention. Start with first name, measure, then add.
Where Canva fits, and where it stops
Canva is genuinely good at what it does. If you need a beautiful one-off graphic, or a handful of variations, it is a fine tool and there is no reason to change.
The problem is not quality, it is arithmetic. Personalizing images in Canva means one design per recipient. At twenty subscribers that is a tedious afternoon. At 5,000 it is not a task anyone can do, at any price. Canva's bulk create feature helps with batches, but it produces a folder of static files that you then have to host somewhere and match to the right recipients - and if you change the design, you regenerate all of them.
Dynamic image generation removes that arithmetic. The design work is fixed at one template regardless of list size, the images are never stored, and changing the template updates every future render without regenerating anything.
A reasonable way to think about it: use Canva when the image is the deliverable, and a personalization tool when the image needs to be different for every person who sees it.
Frequently asked questions
Do I need a developer? No. Building the template is a no-code editing task, and adding it to your email is pasting a URL. A developer is only needed if you want to generate images programmatically from your own application.
How many recipients can I personalize for? There is no per-recipient work, so list size does not change the effort. One template serves twenty people or two hundred thousand.
Will it work with my email platform? If your platform lets you set a custom image URL and use merge tags - which covers Mailchimp, Klaviyo, HubSpot, ActiveCampaign, Campaign Monitor, ConvertKit and most others - then yes. There is no integration to install, because an image tag behaves the same everywhere.
What happens if a subscriber has no first name on file? Use your platform's default-value syntax in the merge tag so it falls back to friendly wording. Always test with an incomplete record before sending.
Will personalized images affect deliverability? No. They are ordinary image URLs and mailbox providers treat them like any other image. Standard practice still applies: a sensible text-to-image ratio, an authenticated sending domain, and meaningful alt text.
Will they display in Gmail and Outlook? Yes, when served as a standard image format from a plain URL. Set an explicit width and alt text so the email still works when images are blocked, which is common in Outlook.
Can I personalize with more than the name? Yes - company, city, job title, discount code, deadline, points balance, or an image that changes per recipient. Add fields gradually and watch how your audience responds rather than using everything at once.
Which file format is best? PNG for graphics with text overlays, since it keeps edges sharp. JPG for photographic backgrounds, where the file is smaller. Personalized image services generally handle this for you.
How is this different from Canva bulk create? Bulk create produces a folder of static files you then have to store, host, and match to recipients, and any design change means regenerating the lot. A dynamic image URL resolves to the right image per person automatically, with no files to manage.
Try it on your next send
The quickest way to find out whether this works for your audience is one test. Build a single template with one dynamic name layer, put the URL in your next welcome or abandoned-cart email, and compare the click-through rate with your last generic send. That is about ten minutes of setup.
OKZest generates personalized images this way - one template, one URL, a different image for every recipient, rendered when they open it. It works with any email platform that accepts a custom image URL, and connects through Zapier or the API when you want to automate it further.
Create a free account, no credit card required.
Related reading: personalized images in Klaviyo, personalized images explained, image generation API.