How to Send Automatic WhatsApp Birthday Offers
One daily send that greets each customer on their birthday, every year, using the one date filter that ignores the year — plus the advance-notice limit you should know about first.
An automatic birthday campaign is a single daily WhatsApp broadcast whose audience filter is "birthday · day & month is today" — a comparison that deliberately ignores the year, so a customer born on 11 July 1990 matches every 11 July, forever. You build it once, in about ten minutes, and it greets that day's birthday customers every morning without anyone touching it again.
That year-ignoring filter is the whole trick, and it is the thing that separates this from every other date campaign you'll build. A win-back counts days backwards from today; a reminder counts days forwards to a one-off event. A birthday isn't a countdown at all — it's a calendar square that comes round annually, and it needs its own operator.
Why birthdays are worth the setup
The message arrives on a day the customer is already in a good mood and already being messaged by people who like them, which is unusual company for a marketing message to keep. It is also the one promotional send where the recipient cannot reasonably think "why are you messaging me" — the reason is self-evident in the first line.
Commercially, it spreads your sending evenly. If you have 3,000 contacts with birthdays on file, roughly 8 per day match — a rounding error against your daily messaging limit, versus a 3,000-person blast that would take several days to clear on a Tier 2K number. Small daily sends are also the healthiest possible pattern for your number's standing.
How it works
Three pieces. A Date field holding each customer's birthday. A segment with one condition: birthday · day & month is today. And a recurring broadcast set to repeat daily. Because every occurrence of a recurring broadcast rebuilds its audience from the segment at send time, each morning's send resolves to exactly that morning's birthdays — usually a handful of people, sometimes zero.
Step 1 — Create the birthday field
- Go to Settings → Contact Attributes.
- Enter the name "Birthday", which gives you the key birthday.
- Set the type to Date — not Text. Only a Date field offers the day & month is today operator; a text field will only let you match words, and "11 July" typed as text is invisible to every date filter.
- Click Add Field.
Step 2 — Get the birthdays (the hard part, honestly)
This is where birthday campaigns actually die, and it's worth saying plainly: your store does not know your customers' birthdays. Unlike a last-order date, there is no order event to stamp it from — nothing fills this field automatically. Every birthday in your database got there because somebody asked. Four workable ways to ask:
- At signup or checkout — a "date of birth (for your birthday gift)" field on your account-creation form. The parenthetical roughly doubles the willingness to answer, because it explains what you want it for.
- In chat — when a conversation is already going well in the shared inbox, ask, and save the answer to the contact's birthday field then and there.
- A dedicated collection broadcast — one campaign to your list saying "tell us your birthday and we'll send you something on the day". Replies come into the inbox and your team fills the field. Low-tech, but it works and it self-selects for people who want the gift.
- Import or push what you already have — if birthdays sit in your CRM, loyalty app or a spreadsheet, they can be pushed into the field through your account's API in one job.
Contacts without a birthday on file are simply skipped — an empty or unreadable date never matches a date filter — so a half-populated field is not a problem, it's just a smaller campaign. Expect to collect birthdays for months. That's normal, and the campaign gets better on its own as the field fills.
One thing to get right at collection time: store a full date, including a year. If you don't know the birth year, use any consistent placeholder year — the filter throws the year away regardless, but the field still needs a complete, parseable date to read.
Step 3 — Build the daily send
- Create a new broadcast and pick your birthday template.
- In the schedule, switch from One-time to Repeat, choose Daily, and set a time — 9am or 10am is the sweet spot. Times are in your own timezone. Avoid anything before 8am; a 6am marketing message on someone's birthday is a block waiting to happen.
- Under Audience → By segment, add one condition: attribute birthday, operator day & month is today. This operator takes no value — there's nothing to type, which is how you know you've picked the right one.
- Click Preview recipients. Today's count will be small, and that is correct. If it's zero, don't panic — check it again on a day you know somebody has a birthday, or temporarily set your own birthday to today to prove the wiring.
- Test-send to your own number, then activate the series. Leave the Until end date empty so it runs indefinitely.
A worked example, with real dates
The daily send runs on 18 July 2026. Its only condition is birthday · day & month is today, so the filter compares day and month only and discards the year entirely:
| Customer | birthday field | Matches on 18 July 2026? | Why |
|---|---|---|---|
| Ayesha | 18 July 1994 | Yes | Day 18 and month July both match. The 1994 is ignored. |
| Bilal | 18 July 2001 | Yes | Same day and month, different decade — still a match. |
| Chen | 19 July 1988 | No | Matches tomorrow's send instead, automatically. |
| Dania | (empty) | No | A contact with no date on file never matches any date filter. |
Ayesha and Bilal get today's message. Nobody had to build tomorrow's list — Chen is picked up by the same series, 24 hours later, because the audience is rebuilt on every occurrence rather than stored.
The limitation nobody mentions: you can't send a birthday message in advance
This is the honest caveat, and it's better to know now than after an hour of fiddling. day & month is today is the only date operator that ignores the year. The forward-looking operators — is in exactly … days and is within the next … days — do real arithmetic against the full stored date, so a birthday of 18 July 1994 is calculated as roughly 11,700 days in the past, and "is in exactly 7 days" will never, ever match it.
So a "your birthday is coming up next week" campaign is not buildable from a birth-year date field. Your options:
- Send on the day. Recommended, and what almost everyone wants anyway.
- Send on the day, with a gift that lasts. "Your birthday code is valid for the next 14 days" gets you the advance-notice benefit — time to plan a purchase — without needing an advance send.
- Keep a second field holding the next occurrence as a real future date, and filter that with is in exactly … days. This works, but something has to roll the date forward each year, so treat it as an integration job rather than a no-code build.
Which occasions this pattern fits
The same daily-plus-day & month is today shape covers any annual event, and each one is a separate Date field and a separate broadcast. The useful distinction is whether the date fills itself:
| Occasion | Field | Where the date comes from | What to send |
|---|---|---|---|
| Birthday | birthday | You ask for it — never automatic | A warm greeting plus a gift with an expiry |
| Sign-up anniversary | signup_date | Stamp it with an Update Customer Attribute step set to {{date.today}} when a contact is first created | "One year with us" — thanks, plus a loyalty perk |
| First-order anniversary | first_order_date | Stamp it on the first order only, and never overwrite it | "A year since your first order" — works well with a repeat-purchase nudge |
| Wedding / event anniversary | anniversary_date | Collected from the customer, like a birthday | Strong for jewellery, florists, restaurants, gifting |
| Child's birthday | child_birthday | Collected — high willingness in kidswear and toys | Age-appropriate offer; the parent is the buyer |
Note the difference between rows one and two. A sign-up anniversary can be automated end to end, because the date is an event your system witnesses. A birthday can't. If you want an annual campaign running this month rather than next year, start with the sign-up anniversary — it needs no data collection at all.
What to put in the message
Five short lines beat a paragraph. A structure that consistently works:
- Their name, first word. Use a personalization variable so it reads as a message rather than a mailshot.
- The wish, on its own. Say happy birthday before you sell anything. A gift offered in the same breath as the greeting reads as a transaction.
- The gift, concretely. "20% off" or "free delivery on your next order", not "a special surprise". Vagueness costs you the click.
- An expiry, stated as a date. "Valid until 1 August" outperforms "valid for 14 days" because the reader doesn't have to do arithmetic on their birthday.
- One tap. A single button or link, with click tracking so you can measure it.
Make the gift generous enough to be worth interrupting someone's birthday for. A 5% code is arguably worse than sending nothing: it costs you a message fee and tells the customer exactly what their loyalty is worth to you.
Costs, limits and approval
A birthday greeting with an offer in it is a marketing template — the category is set by content, not by intent, and a discount code makes it promotional however warmly it's phrased. Marketing templates need Meta's approval before sending and are charged on delivery; since 1 July 2025 WhatsApp bills per delivered message and you are only charged when a template message is actually delivered (Meta's pricing documentation). Rates vary by the recipient's country.
Volume is a non-issue here. Meta's messaging limits run 250 → 2,000 → 10,000 → 100,000 → unlimited unique recipients in a rolling 24 hours, with new business portfolios starting at 250 (Meta's messaging limits documentation). Roughly 1/365th of your list has a birthday today, so even a 20,000-contact list produces about 55 birthday messages a day — comfortably inside the lowest tier.
Two operational details worth knowing. The frequency cap on the Opt-outs page counts marketing messages, so a birthday send can in principle be skipped if that customer already hit their cap from another campaign that week — a reason to keep marketing pressure low around the start of a month. And opted-out contacts are skipped by every broadcast, birthdays included; that's correct behaviour, not a bug to work around. See opt-outs, frequency caps and quality.
What to measure
A daily send of five people produces useless day-by-day numbers. Judge it monthly, by exporting and adding up:
| What to look at | Where you find it | What a good result looks like |
|---|---|---|
| Field coverage | Build a segment on birthday · is set and hit Preview recipients | The most important number in the whole campaign. Rising month over month means your collection is working; flat means it isn't, and no amount of message tuning will fix that. |
| Daily audience size | Each occurrence's recipient count | Roughly your coverage number ÷ 365. If it's wildly off, birthdays are clustered on a placeholder date like 1 January — a data-entry problem. |
| Click rate on the gift | Click tracking, across a month of occurrences | The real verdict on whether the gift is worth having. Weak clicks on a warm audience means the offer is too small. |
| Replies | Shared inbox, and the Replied re-target outcome | Birthday messages get "thank you!" replies at a rate no other campaign does. Each one opens a 24-hour window in which your replies are free — a good moment for a human to answer personally. |
Read counts undercount by design: recipients who turn off read receipts in WhatsApp's privacy settings report only as "delivered" no matter how carefully they read it. Use clicks and replies as your signal. Every past occurrence keeps its own delivery report, so a month's worth can be exported and totalled.
Common mistakes
- Storing the birthday in a Text field. The single most common failure. The date operators never appear, and the segment silently matches nobody.
- Building the campaign before collecting any dates. It runs perfectly and reaches zero people, which is indistinguishable from being broken.
- Expecting an advance nudge. is in exactly … days cannot work on a birth-year date. Send on the day and extend the gift's validity instead.
- A weekly or monthly schedule. The filter means "today". Anything other than Daily and you miss most of the year's birthdays entirely.
- An offer too small to matter. If the gift is 5% off, the message reads as a coupon dressed up as a greeting.
Frequently asked questions
Can WhatsApp send birthday messages automatically?
Yes. Store each customer's birthday in a Date field, then run a daily recurring broadcast whose segment filters 'birthday: day & month is today'. That operator ignores the year, so a birthday of 18 July 1994 matches every 18 July. Each morning's occurrence rebuilds its audience, so it reaches exactly that day's birthdays — for a 3,000-contact list, roughly 8 people a day.
Where do the birthdays come from?
You collect them — your store data doesn't contain them, and nothing fills this field automatically. Ask at signup or checkout (say it's for a birthday gift), ask in chat and save the answer, run one collection broadcast, or push an existing list in via your account's API. Contacts with no birthday on file are simply skipped.
Does the birthday filter care about the year?
No — 'day & month is today' compares only the day and month and discards the year, which is exactly what an annual campaign needs. Store a full, complete date anyway (use a placeholder year if you don't know the real one), because the field still has to be a readable date.
Can I send a reminder a week before someone's birthday?
Not from a birth-year date. 'day & month is today' is the only operator that ignores the year; 'is in exactly 7 days' does real arithmetic against the full stored date, so a 1994 birthday reads as about 11,700 days in the past and never matches. Send on the day instead and make the gift valid for 14 days, which gives the customer the same time to plan.
What else can I run on the same daily pattern?
Any annual date: sign-up anniversaries, first-order anniversaries, wedding anniversaries or a child's birthday — each as its own Date field and its own daily broadcast. Sign-up and first-order anniversaries are the easy wins because an Update Customer Attribute step can stamp them automatically with {{date.today}}, so they need no data collection at all.