A birthday email template is a reusable message your platform sends on, or just before, each subscriber’s birthday: a subject line with their name, a short greeting, a gift and a date it ends. Below are four to copy. The best ones draw the name and the gift’s deadline into one image, so the greeting looks the same in every inbox.
Each template has a subject, a preheader, the body and the image. The image is image personalization for email: one design, with each subscriber’s name and their own deadline drawn into the pixels when they open it. The rest of the page covers the names that break a greeting, when to send, and how the per-person deadline reaches the picture.
Birthday email templates you can copy
The tags below are Klaviyo’s. Mailchimp writes the first name as *|FNAME|*, and the image source is whichever contact field holds the image address. Never put a tag inside an image address: the whole address lives in the field.
The birthday gift, sent on the day
Subject: Happy birthday, {{ first_name|default:'friend' }}. Your gift is inside
Preheader: It is yours for the next seven days
[Image: src = {{ person.birthday_image }}
alt = "Happy birthday, {{ first_name|default:'friend' }}. 15% off, yours for seven days"]
Hi {{ first_name|default:'there' }},
Happy birthday from all of us. Here is 15% off anything in the
store, yours for the next seven days.
[Button: Use my birthday gift]
The reminder, sent on day 5 to anyone who has not used it
Subject: Two days left on your birthday gift
Preheader: 15% off, then it is gone
[Image: the same address as the birthday gift email. The clock
now shows two days.]
Hi {{ first_name|default:'there' }},
A quick reminder that your birthday 15% ends in two days.
[Button: Use it now]
The birthday month offer, sent on the 1st to everyone born that month
Subject: It is your birthday month, {{ first_name|default:'friend' }}
Preheader: A gift that lasts all of March
[Image: one countdown to the last day of the month, the same for
everyone in this send]
Hi {{ first_name|default:'there' }},
March is your month, so the whole month gets a gift: free
shipping on every order until 31 March.
[Button: Start shopping]
A greeting with no offer, for a service business or a member community
Subject: Happy birthday, {{ first_name|default:'friend' }}
Preheader: From everyone at Northfield
[Image: src = {{ person.birthday_image }}, the name only, no clock]
Hi {{ first_name|default:'there' }},
No sale, no code. Just happy birthday, and thank you for being
with us.
Northfield
The birthday month offer is the cheap one to build. Everyone born in March shares one deadline, the end of March, so the image needs no per-person address: one countdown per month does the job, and the free countdown timer generator can make it. A timer from the free generator works for 500 opens without an account, and for 1,000 once you sign in and claim it. The gift and the reminder need a deadline per person, which is the harder build covered further down.
If the gift is a code rather than a link, give each subscriber their own: unique coupon codes covers single-use codes drawn into the image. If you run a points program, the birthday gift can be bonus points instead, and the loyalty email page shows the balance image.
Birthday email subject lines that fit each template
| Template | Subject | Preheader |
|---|---|---|
| Gift on the day | Happy birthday, Sarah. Your gift is inside | It is yours for the next seven days |
| Reminder | Two days left on your birthday gift | 15% off, then it is gone |
| Birthday month | It is your birthday month, Sarah | A gift that lasts all of March |
| No offer | Happy birthday, Sarah | From everyone at Northfield |
| Before the day | Your birthday is coming up, Sarah | Your gift arrives on the day |
Name in the subject, the gift or the date in the preheader. Set a default for the name in both, because a subscriber with no first name otherwise gets “Happy birthday, .” in the subject line.
When should a birthday email be sent?
On the day, with one reminder before the gift ends. The day is when the email is expected, and the reminder is the one that gets the gift used.
| Send | When | Who gets it |
|---|---|---|
| Greeting with the gift | On the birthday, in the morning | Everyone with a birthday on file |
| Reminder | Day 5 | Only those who have not used the gift |
| Birthday month offer | The 1st of the month | Everyone born that month, as one campaign |
| Before the day | A week before | Only if the gift starts before the birthday |
Both big platforms are built for this. Klaviyo’s date property flows let recipients “qualify to enter this flow on a yearly recurring basis on the same month/day”, and you can start “any number of days, weeks, or months in advance”. Mailchimp’s birthday automation stores the date in an audience field “in MM/DD (Month/Day) format”, and by default it is “a 3-email series that sends before, on, and after your subscriber’s birthday”. Mailchimp’s automations are on paid plans only.
Two details the platform guides leave out. Ask for the month and the day, not the year: you do not need the subscriber’s age to wish them a happy birthday, and Mailchimp’s field does not store one. And put a test profile with a 29 February birthday through your flow before it goes live, because neither guide says what happens to it in a year without that date.
Why draw the name instead of merging it into text
A merge tag in body text is plain text styled by HTML and CSS, and every client applies that differently. Web fonts fail in the Word engine. Colored text can invert in dark mode. A greeting that has to sit over a photograph cannot be done with HTML at all in a way that survives Outlook.
Drawn into the image, the name is pixels. It can be positioned, kerned, masked, set in a brand face and placed over artwork, and it arrives identical everywhere. It is also readable by nobody with images turned off, which is why the alt text in the templates above repeats the greeting and the gift.

The names that break a birthday greeting
| Problem | What you see without handling | What to configure |
|---|---|---|
| No name on the profile | A visible gap where the greeting was | A fallback: a default value, a hidden layer, or a hidden group |
| A very long name | Overflow past the canvas edge, or a shrunk line that looks wrong | The truncate transform, with an ellipsis, plus a layer width |
| All capitals, or all lower case | “Hi SARAH” or “hi sarah” | The title case transform |
| A name with an accent or a non-Latin script | A tofu box if the font lacks the glyph | A digit and text font that covers the script you send to |
| A right-to-left script | Text running the wrong way against the layout | The RTL layout support on the text layer |
| A name that is actually an email address | “Hi sarah.k@example.com” in 40 point type | A rule that hides the layer when the value contains an at sign |
The last row is not hypothetical. Signup forms without a name field leave the local part of an email address in the first-name column on a surprising number of lists.
Every variable in an EmailTimer.app template is declared with a type and a fallback behavior, which is where the first row is handled. Transforms run before the value is drawn, which covers case, truncation and formatting. A conditional rule reads a value and then shows, hides, swaps or recolors, which covers the rest.
The fallback also belongs on your platform
Set it in both places, because they catch different failures. The template fallback handles a value that arrives empty. The platform fallback handles a merge tag in the subject, the link or the alt text, which your platform substitutes rather than the renderer.
Klaviyo documents {{ first_name|title|default:'there' }}, which applies both the case transform and the fallback in one tag. Mailchimp’s example is that “when you use ‘Hello *|FNAME|*,’ subscribed contacts whose first names are not in your audience will see ‘Hello Friend’”, set as a default merge value in audience settings. Customer.io documents the same filter, in the form {{ customer.plan_name | default:"custom" | capitalize }}. GetResponse takes the fallback as a second backticked argument. ActiveCampaign sets a default on the custom field, and notes that its tags do not work in the text-only builder.
The full per-platform table, including the field that carries a signed address, is on the merge tag guide.
Birthdays, which are a deadline problem
A birthday image is a name image with a clock attached, and the clock is what makes it harder. The window starts on each subscriber’s own date, so every recipient has a different deadline, and each deadline has to reach the image through an address signed for that recipient.
That means one signed address per recipient: either POST /urls/batch at up to 10,000 per call, or a recipient list uploaded as a CSV with one address exported per row. The address goes into a contact field and the image src is that field’s merge tag. Both need Growth or Agency, and pricing has the tiers. The birthday use case walks through the same build from the campaign side.
Give the gift a week rather than a day. A birthday is a busy day, and the point is that the reward gets used rather than that it gets used immediately. A seven-day window is also comfortably longer than any caching behavior. FreshInbox’s 2021 analysis reports Apple Mail holding images for two to three days, so a stale copy is still showing a figure the reader can act on. A 48-hour gift does not have that margin.

If the field is missing, do not send the email. The image still renders, because the service never returns a broken picture, but a birthday greeting counting down to nothing is worse than silence. Segment on the field being present.
How to set up the image
- Open the gallery, pick a design and open it in the editor.
- Add a text layer for the greeting and position it. Set the layer width so the text has a boundary to respect.
- Declare the name variable with type text, a default value, and a fallback behavior of your choosing.
- Add the title case transform, and the truncate transform with a character limit that fits the layer.
- Add a rule to hide the layer if the value is empty or contains an at sign.
- For a birthday gift, add a timer layer set to per-recipient deadline, and set the unit labels. They are editable and ship in 44 languages.
- Under When it expires, choose An image and enter the key of your standard banner, so an old greeting becomes that banner rather than a dead clock.
- Preview with the worst name on your list rather than a short one. The editor preview calls the same renderer that serves the inbox.
- Publish, then take the campaign snippet for a whole-send image, or mint one address per recipient for a birthday window.
The parameter reference is in the merge tags documentation, the batch endpoint is in the API reference, and the Klaviyo page shows where the HTML block sits in that builder. In December, the same name handling carries over to a year in review email, which draws each customer’s own year into one picture.
Questions and answers
What should a birthday email say?
Happy birthday, their name, what the gift is and when it ends, and one button. Keep it short: the image carries the greeting and the clock, and the text repeats them for anyone with images off.
When should I send a birthday email?
On the birthday, in the morning, with one reminder on day 5 to anyone who has not used the gift. A birthday month offer goes on the 1st of the month instead.
Does the name have to be in the image address?
No, and it should not be. Either it is fixed at publish for a whole-send image, or it travels as an opaque recipient token whose values are looked up server-side, so no name appears in a URL.
What happens to a subscriber with no first name?
Whatever the variable’s fallback says. Drawing a default like “there” is the safest choice for a greeting, and hiding the layer is better when the name sits inside a sentence that would read oddly without it.
Can I use a brand font?
Yes. Fonts upload as assets and are embedded when the template is published, so the rendered image uses your face rather than a substitute. Check that it carries the glyphs for every script on your list.
How long should a birthday reward last?
Seven days is the workable answer. It respects that the day itself is busy, and it leaves enough margin that a cached image from two days earlier still shows something actionable.
Sources
- Create a date property triggered flow (Klaviyo Help Center), read on 4 November 2026
- Create an automated birthday email (Mailchimp), read on 4 November 2026
- How to add a first name to an email, SMS, or push message (Klaviyo Help Center)
- Getting Started with Merge Tags (Mailchimp)
- Personalize messages with liquid (Customer.io Docs)
- How to personalize my emails? (GetResponse Help)
- Personalization Tags overview (ActiveCampaign Help)
- A Technical Take on iOS15 Mail Privacy Protection (FreshInbox, 29 July 2021)
- Photo by Helena Jankovičová Kováčová on Pexels
- Photo by Olga Lazurenko on Pexels
- Photo by Thirdman on Pexels
Related
Put a countdown in the campaign you are writing now
The free plan covers 5,000 opens a month with no card. Starter is $19 a month for 250,000.