- Home
- Guides
- Power Automate
- How to send birthday emails to Outlook contacts with Power Automate
How to send birthday emails to Outlook contacts with Power Automate
Build a scheduled Power Automate flow that checks your Outlook contacts every morning and sends a personal birthday email to anyone whose birthday is today, with a BCC to you as a record.
Jump to a step (9)
Small business owners and office managers want to send birthday greetings to clients and staff, but keeping track of dates and remembering to write each email is easy to miss. The birthdays are often already saved in Outlook contacts and nobody is using them.
The flow runs once a day at 9:00 AM. It reads your Outlook contacts, drops anyone without a birthday, converts today's date and each birthday to local time in MM-dd format, and sends an email when they match.
Everything uses standard connectors: Office 365 Outlook plus the built-in Date Time, Data Operation and Control actions. No SharePoint and no premium connectors.
What you need
- Microsoft 365 Business Basic or Standard with Power Automate
- Outlook contacts with the Birthday field filled in
- An email address saved on each contact
- Your local time zone, for the date comparison
Step by step
0 of 9 done-
01
Create a scheduled cloud flow
Open Power Automate from the Outlook web app launcher, or go to make.powerautomate.com. Select Create > Scheduled cloud flow.
Name the flow, keep the start date, set the start time to
9:00 AMand set Repeat every to1 Day. Click Create. The flow will check for birthdays every morning. -
02
Get your Outlook contacts
Add the Office 365 Outlook action Get contacts (V2). For Folder id, select
Contacts(or a custom contacts folder if you only want to email certain people).Under Advanced parameters, add Top Count and set it to
1000. By default the action returns only 10 contacts, so set this higher than the number of contacts you have. -
03
Filter out contacts without a birthday
Add Filter array from Data Operation. For From, select
body/valuefrom Get contacts (V2).Click Edit in advanced mode, delete the default, and insert this expression:
not(empty(item()?['birthday']))item()is the current contact,empty()checks whether the birthday field is missing or blank, andnot()flips the result so only contacts with a birthday are kept. -
04
Get today's day and month
Add Current time from Date Time. It returns UTC, so add Convert time zone next:
- Base time: output of Current time
- Source time zone:
(UTC) Coordinated Universal Time - Destination time zone: your local time zone
- Time unit: Enter custom value and type
MM-dd
Uppercase
MMis the month and lowercaseddis the day. Rename the actionCurrent Day Month. -
05
Loop through each contact's birthday
Add Apply to each from Control. For the input, select Body from Filter array.
Inside the loop, add a Compose action with this expression to pull the current contact's birthday:
item()?['birthday']The birthday comes back as a long UTC date and time.
-
06
Convert each birthday to day and month
Inside the loop, add another Convert time zone:
- Base time: output of the Compose action
- Source time zone: UTC
- Destination time zone: your local time zone
- Time unit: custom value
MM-dd
Rename it
Birthday Day Month. Converting to local time first stops a birthday from shifting to the day before. -
07
Compare the birthday with today
Add a Condition inside the loop. Left side: output of
Current Day Month. Operator:is equal to. Right side: output ofBirthday Day Month. -
08
Send the birthday email
In the True branch, add Send an email (V2) from Office 365 Outlook.
For To, switch to advanced mode and insert:
item()?['emailAddresses'][0]['address'][0]picks the first email address if the contact has more than one.Write a subject and replace the first-name placeholder with
item()?['givenName']. In the body, useitem()?['displayName']for the full name, or any other contact field.Under Advanced parameters, add BCC and enter your own email so you get a copy of every birthday email the flow sends.
-
09
Save and test
Save the flow. Click Test > Manually > Test > Run flow. In the video, two contacts have a birthday today and both get an email with their first name in the subject and full name in the body. After that, the flow runs by itself every morning.
Tips and common problems
- Get contacts (V2) returns only 10 contacts unless you set Top Count. Set it higher than your total number of contacts.
- Convert both today's date and the birthday to your local time zone before comparing. Outlook stores birthdays in UTC, which can move them to the previous day.
- Use uppercase MM for month. Lowercase mm means minutes and the comparison will never match.
- Add yourself in BCC so you can see exactly who received a birthday email each day.
- Contacts with more than one email address get the email at the first one, because the expression uses [0].
Expressions used in this flow
| Where | Expression | Purpose |
|---|---|---|
| Filter array | not(empty(item()?['birthday'])) | Keep only contacts with a birthday |
| Compose (in loop) | item()?['birthday'] | The current contact's birthday |
| Convert time zone (both) | MM-dd | Custom format: month and day only |
| Send an email (V2): To | item()?['emailAddresses'][0]['address'] | First email address on the contact |
| Subject | item()?['givenName'] | First name |
| Body | item()?['displayName'] | Full name |
Related builds
Questions
Can Outlook send birthday emails automatically?
Outlook cannot do it on its own, but a scheduled Power Automate flow can. It reads the Birthday field on your Outlook contacts each morning and sends an email to anyone whose birthday matches today.
Do I need a premium Power Automate licence for this?
No. The flow uses the Office 365 Outlook connector and built-in actions, which are included with Microsoft 365 business plans.
Can I send birthday emails to only some of my contacts?
Yes. Put those people in a separate Outlook contacts folder and select that folder in Get contacts (V2).
