The most reliably interesting thing you can put in front of someone is information about themselves. This is why Spotify Wrapped works, why annual review emails get opened, and why a usage summary outperforms a feature announcement.
Rendering that data into an image rather than body copy makes it shareable, harder to skim past, and more like a small event than a notification. Here is how to do it, including the part most teams find hardest - getting the data out of the product - and the mistake that turns a good idea into an unpleasant email.
Why it works
Personalized data images do something ordinary personalization does not. "Hi Sarah" proves you have a database. "You shipped 47 projects this quarter" proves you have been paying attention, and it tells Sarah something she did not already know.
Three effects worth naming:
It is genuinely new information. Most marketing email tells people something about you. This tells them something about themselves, which is a much lower bar for interest.
It creates a reason to return. A number that is going up invites you to make it go up further. A number that is incomplete invites you to complete it.
Some of it gets shared. People post their milestone graphics. That is not the primary goal, but a graphic designed with sharing in mind costs nothing extra and occasionally does real work.
What data to use
Not every field in your database deserves a graphic. The ones that work share a quality: the user cares about the number, and the number reflects something they did.
Usage and output. Projects created, messages sent, hours tracked, documents processed. Best when it reflects effort rather than consumption.
Progress toward something. Percentage of setup complete, steps remaining, distance to a goal. Strong for onboarding because it implies a next action.
Milestones. First hundred customers, one year as a subscriber, ten thousandth upload. These are inherently celebratory and the easiest to get right.
Streaks and consistency. Days active, weeks in a row. Powerful, and worth handling carefully - a broken streak framed badly reads as a scolding.
Value delivered. Hours saved, costs avoided, tasks automated. The most persuasive category at renewal, and the one most likely to need a caveat about how it is calculated.
Comparative position. "Top 5% of users by X." Effective, but only ever frame it upward - see below.
The lifecycle moments that suit it
Onboarding. A progress image showing how far through setup someone is, with the next step named. This converts better than a text checklist because the gap is visual.
Activation nudges. A user who has done some of the thing but not all of it. The image shows what they have built so far, which is more motivating than a reminder of what they have not.
Milestones. Triggered whenever the number is hit rather than batched. Immediacy is most of the effect.
Renewal and expansion. A value summary in the weeks before renewal, showing what they got for the money. This is the highest-commercial-value use of the technique.
Win-back. Showing a lapsed user what they built while they were active is a considerably better argument than a discount.
Annual or quarterly wrap. The big one. A summary of their year, designed to be shared. Expensive to do well and worth it if you have the data.
Getting the data out of your product
This is the part that stalls most implementations, and it is an engineering question rather than a marketing one.
The image needs the values at the moment the email is composed or opened, which means they have to reach your email platform or the image URL somehow. Three routes, in ascending order of effort:
Sync to your email platform as contact properties. Most ESPs let you store custom fields per contact. Push the numbers there on a schedule - nightly is usually enough - and then reference them as merge tags exactly like a first name. Simplest route, works with any ESP, and the numbers are as fresh as your last sync.
Pass them at send time from your application. If your product triggers the email itself, it already has the data. Build the image URL with real values as you compose the message.
Generate on an event. For milestones, fire the email from the event that created the milestone - the hundredth upload triggers the graphic. This gives you immediacy but requires the event to be instrumented.
Start with the first. A nightly sync of five numbers into contact properties unlocks most of the use cases above, and it does not require touching your email sending path.
Building the image
The template is simpler than most personalized images because the number is the design.
https://media.okzest.com/img?c=YOUR-COMPANY-ID&i=YOUR-DESIGN-ID&name=Sarah&metric=47&label=projects%20shipped
In the email, those become merge tags pointing at the contact properties you synced:
<img src="https://media.okzest.com/img?c=YOUR-COMPANY-ID&i=YOUR-DESIGN-ID&name={{ first_name }}&metric={{ projects_count }}"
alt="{{ first_name }}, you shipped {{ projects_count }} projects this quarter"
width="600" />
A few design points specific to numbers:
One number, prominently. The temptation is a dashboard. Resist it - a single large figure with a short label communicates instantly, and a grid of six statistics communicates nothing.
Format the number properly. 1,284 not 1284. 2.5 hours not 2.5. £1,240 not 1240. Unformatted numbers look like a database leaked into an email.
Design for the range. Your metric might be 3 or 14,892. A layout built around a two-digit number breaks at five digits. Test both ends.
Round sensibly. 7.6 hours saved is credible. 7.63847 hours saved is a bug.
Put the number in the alt text too. Images are blocked by default in many clients, and the whole message is the number.
The mistake that makes this backfire
A number about someone is not neutral. It can read as recognition or as criticism, and the difference is entirely in the framing.
Do not show low numbers as low numbers. "You used 2 of your 50 credits this month" is technically a usage summary and emotionally an accusation. The user is now aware they are wasting money, which is a thought that leads to cancelling rather than engaging.
For low-engagement users, either change the metric to something they did do well, or change the message entirely - show them what is possible rather than what they missed. The correct email to a barely-active user is help, not a scoreboard.
Do not use downward comparison. "You are in the bottom 20% of users" is never sendable. Comparative framing only works upward.
Be careful with broken streaks. "Your 40-day streak ended" is a loss notification. "You were active 40 days in a row - start a new streak" says the same thing usefully.
Check the number is right before it is a picture. A wrong figure in body copy is an error. A wrong figure rendered large in a designed graphic looks like a system that does not know its own data, and it undermines confidence in everything else you report.
A useful test: read the sentence aloud as if saying it to the person. If it would sound passive-aggressive in a meeting, it will read that way in their inbox.
Privacy and appropriateness
Two constraints worth stating.
Only show the recipient their own data. Obvious, but worth guarding in implementation - a mis-mapped merge field that shows someone another account's numbers is a serious incident rather than an embarrassing one.
Consider who else sees the inbox. Work email is often visible to colleagues, and shared or forwarded email more so. Data that is fine on a dashboard behind a login may be less fine rendered large in an email. Financial figures and anything performance-related deserve a second thought.
Testing
- Render the largest and smallest real values in your data, not sample numbers.
- Render a user with a zero or a null. Decide what appears and make sure it is not a blank space or the word
null. - Check the formatting - separators, currency symbols, decimal places.
- Check it with images blocked, since the alt text is carrying the whole message.
- Verify against the source of truth. Pull five users at random and confirm the numbers in the image match what the product shows them.
Frequently asked questions
How do I create personalized images showing a user's own data? Build a template with dynamic fields for the number and label, sync the values into your email platform as contact properties, then reference them as merge tags in the image URL. Each recipient's email renders their own figures.
How do I get the data out of my product and into the email? The simplest route is a scheduled sync that writes the numbers into contact properties in your ESP, then treating them like any other merge field. Alternatively, pass the values directly when your application triggers the email, or fire on an event for real-time milestones.
What data works best? Numbers reflecting something the user did - output, progress, milestones, value delivered. Data that reflects effort resonates more than data that reflects consumption.
What if a user's numbers are low? Do not render them as a scoreboard. Change the metric, or change the message to be helpful rather than evaluative. An email that makes someone feel bad about their usage encourages cancellation, not engagement.
How many statistics should one image show? One, prominently. A single large figure with a clear label communicates instantly; a grid of statistics reads as a dashboard and gets skimmed.
Can I do a "Wrapped"-style annual summary? Yes - it is the same technique with more data points and higher design investment, usually as a sequence of images rather than one. Worth doing when you have a year of meaningful data and a reason for people to share it.
Is there a privacy risk? Guard the mapping carefully so users only ever see their own data, and consider that work inboxes are often visible to others. Data that is appropriate behind a login is not automatically appropriate rendered large in an email.
How fresh does the data need to be? For summaries and progress, a nightly sync is fine. For milestones, trigger on the event so the email arrives while the achievement is still current.
Start with one number
The way in is not a Wrapped campaign. It is one metric, in one email, for one lifecycle moment - most usefully onboarding progress or a first milestone. Sync one value into your ESP as a contact property, build one template, and send it.
OKZest renders personalized images from a single template as a URL, so the numbers populate per recipient from data you already hold. It works with any email platform that supports custom image URLs, and connects through Zapier or the API for event-driven sends.
Create a free account, no credit card required.
Related reading: put every recipient's name inside your email image, personalized images in Klaviyo, generating images from a CSV via the API.