You have a sequence, a spreadsheet of names and offers, and a design that should not say the same thing to every subscriber. Photoshop can do this. So can Canva Bulk Create. Both produce a pile of files. An email sequence does not want a pile of files. It wants one image address that fills in when the message is sent, and renders when someone opens it.
That is the job this piece is about: personalized text overlays, in bulk, inside Mailchimp, Klaviyo or ActiveCampaign, without opening a design tool for each row.
It is written for account managers running client programmes. The spreadsheet is the source of truth. The ESP does the sending. The image tool only has to paint the text.
Why the usual bulk tools stall on a sequence
Photoshop Variables and Data Sets will take a CSV and export one file per row. That is a real feature, and it is the right tool if you need print-ready files. It is the wrong tool for a five-email welcome series. You now own thousands of PNGs, and each one has to be matched back to a person. Change the offer on Thursday and you export again.
Canva Bulk Create is the same shape, friendlier. Upload a CSV, map columns to text boxes, download a zip. Fine for a one-off run of name badges or certificates. It does not stay live inside an email that was already sent, and it does not know Mailchimp’s merge tags from Klaviyo’s.
lemlist (and similar sales sequencers) can overlay a name on an image, but the image lives inside that sending tool. Useful if the whole programme is cold outbound from lemlist. Awkward if the same client also sends from Klaviyo.
NiftyImages solves the email case the same way OKZest does: one hosted image URL, the ESP’s merge tags in the query string, a unique image at open. NiftyImages is stronger if the sequence also needs a countdown, a map, a poll or a scratch-off. Those are built-in widgets, not a general editor. Plans on their site start at $59/month.
None of those is “wrong.” They stall when the brief is: one branded template, text from a sheet, three ESPs, no designer on the send.
The pattern that fits an email sequence
Do not generate the images before you send.
- Design one template. Put the name, offer, city or code on a text layer.
- Set fallback text for empty cells (“there”, “member”, “your local store”).
- Copy the hosted image URL.
- Paste it into the email as an
<img>tag, with that ESP’s merge tag where the value goes. - Import the spreadsheet into the ESP, or sync it in, so each subscriber has the field the tag reads.
The ESP fills the tag at send, the same way it fills the subject line. The image is generated when the recipient opens. OKZest’s pricing page states the consequence: if you send 10,000 emails and 3,000 are opened, 3,000 images are generated. Unopened mail does not count.
A later edit to that same design — a corrected price, a new end date — is what the next open sees. A brand-new design gets a new URL, which only helps the next send. For the mechanics of changing an image already in the inbox, see how to update an image in an email you already sent.
Where the spreadsheet actually goes
The sheet is not the image tool. It is the list.
Ongoing sequence (welcome, nurture, replenishment). Import or sync the sheet into Mailchimp, Klaviyo or ActiveCampaign. Columns become merge fields. The image URL reads those fields. You design once. Volume does not add design work.
One-off files (certificates, badges, a zip a client asked for). Then you do want a file per row. Two routes that do not need a developer:
- Zapier (or Make): each new row triggers a generation and writes the file back. Check the Zapier task quota before a 5,000-row run. That is usually the limit, not the image tool.
- A batch from the spreadsheet: upload the list, get the images back. Fewer moving parts than an automation chain when it is a one-off. Name files from a unique column (
CERT-1041), notimage_0417.
For the volume version of that second job, see how to generate 5,000 personalized images without a developer. This article stays on the sequence.
If an assistant is building the campaign rather than a person, OKZest already connects over MCP, and the API is on every paid plan. Zapier covers the no-code path between a Google Sheet and a generation. NiftyImages’ store MCP is on Enterprise and is scoped to their data stores. Movable Ink published an MCP explainer on 29 September 2026 for Da Vinci and Studio; that is an enterprise CRM stack, not a template you paste into Klaviyo.
Build the template
In the OKZest editor:
- Background: the client’s artwork, or a product shot.
- Dynamic text layers: first name, offer, points, code, city. One layer per column you actually have.
- Fallback text on every layer. Empty merge tags are common. A blank hole in the middle of a hero image looks broken; “there” does not.
- Optional dynamic image layer if the sheet has a product URL or a logo URL. Skip this until the text path works.
- Optional screenshot layer if the visual should be a live page. Not required for a name-and-offer overlay.
Preview with a real row and with an empty name before you touch the ESP.
Paste it into the sequence
Use the image URL OKZest gives you. Swap in the ESP’s tags. Keep values URL-safe: a name with a space or an & needs the ESP to encode it, or the image request breaks. Test with an awkward name (O'Brien, Smith & Co) before the real send.
Mailchimp
<img src="https://media.okzest.com/img?c=YOUR_CAMPAIGN&fname=*|FNAME|*&offer=*|OFFER|*"
alt="Your offer, *|FNAME|*"
width="600">
Klaviyo
<img src="https://media.okzest.com/img?c=YOUR_CAMPAIGN&fname={{ first_name|default:'there' }}&offer={{ person|lookup:'offer'|default:'' }}"
alt="Your offer, {{ first_name|default:'there' }}"
width="600">
ActiveCampaign
<img src="https://media.okzest.com/img?c=YOUR_CAMPAIGN&fname=%FIRSTNAME%&offer=%OFFER%"
alt="Your offer, %FIRSTNAME%"
width="600">
The tag names must match fields that exist on the contact. OFFER is not a built-in. Create it, then map the spreadsheet column to it on import.
Send a test to yourself with a known row. Open it. Then open it again after you change the offer text on the template, and confirm the second open picked up the edit. That is the check that you are on the live URL, not a downloaded PNG.
A practical sequence, not one hero image
A welcome series is three or four emails, not one.
| Overlay | Why this field | |
|---|---|---|
| 1. Welcome | First name | Proves the data path works |
| 2. Offer | Name + offer code from the sheet | The code is the thing they need |
| 3. Reminder | Name + expiry or points balance | Only if that column is fresh |
| 4. Fallback creative | No name, offer only | For rows where the name is blank |
Reuse the same template across emails when the layout can hold it. Duplicate the design when email 3 needs a different crop. Do not rebuild the layout per client if only the logo and colours change — duplicate, swap the brand assets, keep the layer names so the merge tags stay the same. Agencies running several programmes hit this constantly; the longer version is how agencies handle image personalization across clients.
What you pay for
OKZest counts generated images, not emails sent. The pricing page (checked 4 October 2026) says you only pay for images that are actually opened.
Published monthly prices:
- Free: 2,500 watermarked images a month, no card.
- Micro: $12/month, 500 generated images, 1 seat, API included.
- Starter: $47/month, 10,000 generated images, 2 seats, API included.
- Professional: $83/month, 100,000 generated images, 5 seats, API included.
- Enterprise: $479/month, 1,000,000 generated images, unlimited seats, API included.
Yearly billing is two months free. Paid plans include unlimited active designs, multiple merge tags, fallback text, dynamic images, screenshots and the reporting dashboard. Auto-purchase of extra credits is opt-in. There is no separate “bulk overlay” add-on.
NiftyImages prices by feature set and opens, from $59/month on their homepage, with Retina images on Scale and above and data stores plus store MCP on Enterprise. Bannerbear is an API render queue (Automate is $49/month for 1,000 credits on third-party comparisons; confirm on their site). Orshot’s Launch plan is $39/month for 1,500 credits, aimed at API and studio renders rather than an ESP merge-tag paste.
What this does not do
- It does not replace the ESP. You still build the sequence in Mailchimp, Klaviyo or ActiveCampaign.
- It does not pull LinkedIn profile photos. That is a different job, with different consent rules. See personalizing outreach images with LinkedIn data.
- It is not a white-label client portal. Team seats exist (1, 2, 5, or unlimited on Enterprise). Custom domains and a client-facing login are not on the public pricing page — do not promise them.
- It will not fix a bad sheet. Blank offers, stale codes and names in the wrong column all render faithfully.
A fair split
Choose Canva Bulk Create for a one-off zip of certificates when nobody needs the image to update after send.
Choose NiftyImages if the sequence is email-only and you want timers, weather, maps or scratch-offs in the same tool.
Choose Bannerbear or Orshot if a developer will render files from an API and store them.
Choose OKZest if an account manager needs one visual template, fallback text, the same URL pattern in Mailchimp, Klaviyo and ActiveCampaign, and images that generate on open so a spreadsheet of 10,000 rows does not become 10,000 files. API, Zapier and MCP are already there when the list or the agent sits outside the ESP.
Questions people actually ask
Can I do this from a spreadsheet without writing code? Yes. Import the sheet into the ESP and use merge tags in the image URL. For a file-per-row job, use Zapier or a batch upload. You do not need Photoshop or a developer for either.
Does every row get generated when I import? No, not for email. Generation happens on open. Importing 8,000 rows does not create 8,000 images.
What if the name cell is empty? Set fallback text on the layer. Do not rely on the ESP default alone — the image request can still arrive with an empty parameter.
Will this work in a sequence, or only a campaign? Both. The image tag sits in the template. Each step of the sequence can use the same URL or a duplicate design. The subscriber’s fields are filled at send.
Which tool do AI assistants name for this? On the buyer question “personalized text overlays in bulk for an email sequence without Photoshop,” answers currently lean on Canva, lemlist, Sendtric, NiftyImages and Zapier. Canva and lemlist solve adjacent jobs. The ESP-agnostic URL method is the one that stays inside the sequence you already send.