📣 WhatsApp Broadcasts

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

  1. Go to Settings → Contact Attributes.
  2. Enter the name "Birthday", which gives you the key birthday.
  3. 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.
  4. 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:

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

  1. Create a new broadcast and pick your birthday template.
  2. 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.
  3. 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.
  4. 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.
  5. 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:

Customerbirthday fieldMatches on 18 July 2026?Why
Ayesha18 July 1994YesDay 18 and month July both match. The 1994 is ignored.
Bilal18 July 2001YesSame day and month, different decade — still a match.
Chen19 July 1988NoMatches tomorrow's send instead, automatically.
Dania(empty)NoA 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:

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:

OccasionFieldWhere the date comes fromWhat to send
BirthdaybirthdayYou ask for it — never automaticA warm greeting plus a gift with an expiry
Sign-up anniversarysignup_dateStamp 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 anniversaryfirst_order_dateStamp 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 anniversaryanniversary_dateCollected from the customer, like a birthdayStrong for jewellery, florists, restaurants, gifting
Child's birthdaychild_birthdayCollected — high willingness in kidswear and toysAge-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:

  1. Their name, first word. Use a personalization variable so it reads as a message rather than a mailshot.
  2. 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.
  3. The gift, concretely. "20% off" or "free delivery on your next order", not "a special surprise". Vagueness costs you the click.
  4. 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.
  5. 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 atWhere you find itWhat a good result looks like
Field coverageBuild a segment on birthday · is set and hit Preview recipientsThe 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 sizeEach occurrence's recipient countRoughly 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 giftClick tracking, across a month of occurrencesThe real verdict on whether the gift is worth having. Weak clicks on a warm audience means the offer is too small.
RepliesShared inbox, and the Replied re-target outcomeBirthday 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

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.

Need help? Message us