- Home
- Guides
- Power Automate
- How to send automatic follow-up emails in Outlook when nobody replies
How to send automatic follow-up emails in Outlook when nobody replies
Build a Power Automate flow that checks Outlook for replies every morning and sends up to three follow-up emails at 3, 7 and 14 days, tracked in a simple Excel table. When someone replies, their follow-ups stop automatically.
Jump to a step (14)
If you email leads, clients or partners and wait for answers, you have to remember who you contacted, when, and how many times you already followed up. With 10, 20 or 50 people that turns into a spreadsheet you update by hand every day. Follow-ups get sent late, twice, or not at all.
This flow runs once a day. It reads the Active contacts from an Excel table, checks a dedicated Outlook folder for a reply from each one, and if there is no reply it works out how many days have passed since the last email. When enough days have passed, it sends the next follow-up and writes the new count, date and status back to Excel.
An Outlook rule copies every prospect reply into one small folder, so the flow never has to search your whole inbox. Everything uses the standard Excel Online (Business) and Office 365 Outlook connectors, so no premium licence and no SharePoint are needed.
What you need
- Microsoft 365 Business Basic or Standard (Outlook, Excel for the web and Power Automate)
- An Excel table in OneDrive for Business with the columns
Name,Email,First Contact Date,Last Follow Up,Follow Up CountandStatus - An Outlook folder for replies (the video uses
Prospects) and an Outlook rule that copies replies into it - The text for your three follow-up emails
Step by step
0 of 14 done-
01
Build the Excel tracking table
Create a workbook in OneDrive for Business (the video uses
recipients.xlsx) with a table namedTable1and six columns:Name: used to personalize the email.Email: the contact's address. The flow also uses it to find replies, so it must be correct.First Contact Date: the day you sent the original email.Last Follow Up: leave empty. The flow fills it in.Follow Up Count: start at0. The flow raises it to 1, 2 and 3.Status: set toActive. The flow changes it toRepliedorCompleted.
For each new contact you fill in five things: name, email, first contact date, count
0and statusActive. You can add rows at any time and the flow picks them up the next morning. -
02
Create an Outlook rule that copies replies to a Prospects folder
In Outlook, create a folder called
Prospects(any name works). Then open Rules and add a new rule:- Condition:
From, and paste all your prospects' email addresses separated by commas. - Action:
Copy totheProspectsfolder. - Check
Stop processing more rules.
This is for speed. The flow checks every contact for a reply, and searching one small folder is much faster than searching an inbox with thousands of emails. When you add a contact to Excel, add their address to this rule too.
- Condition:
-
03
Create a scheduled flow with a Recurrence trigger
In Power Automate, create a scheduled cloud flow. Set the Recurrence trigger to run every
1day at a fixed time and pick your time zone. The video uses 9:30 AM. Choose a time when your recipients are likely to be reading email. -
04
List only the Active contacts
Add the Excel Online (Business) action List rows present in a table and select your file and table. Under Advanced parameters, turn on two settings:
Filter Query:Status eq 'Active'. This OData filter returns only rows that still need follow-ups, so Replied and Completed contacts are skipped here and the flow stays fast.DateTime Format:ISO 8601. Without this, Excel dates come through as serial numbers such as46066that you cannot use in date expressions.
-
05
Loop through each contact and look for a reply
Add an Apply to each (For each) loop and select the
valueoutput of List rows present in a table. Everything below runs once per contact.Inside the loop, add the Office 365 Outlook action Get emails (V3) with these settings:
Folder:ProspectsFrom: theEmailcolumn from dynamic contentTop:1. You only need to know if at least one reply exists.Fetch Only Unread Messages:No. You may already have read the reply, and it still needs to count.
-
06
Check whether the contact replied
Add a Condition. On the left, enter this expression:
length(body('Get_emails_(V3)')?['value'])Set the operator to
is greater thanand the right side to0. Thevalueproperty is the list of emails found, andlengthcounts them. One or more means the person replied (true). Zero means no reply (false). -
07
Mark replied contacts in the True branch
In the True branch, add Update a row (Excel Online (Business)). Use the same file and table, set
Key ColumntoEmail, the key value to theEmailcolumn from dynamic content, and setStatustoReplied. Because the filter only reads Active rows, this contact is skipped from the next run onwards. -
08
Work out the reference date
In the False branch, add a Compose action named
Reference Datewith this expression:if(equals(int(items('For_each')?['Follow Up Count']),0),items('For_each')?['First Contact Date'],items('For_each')?['Last Follow Up'])If no follow-up has been sent yet, the flow measures from the first contact date. Otherwise it measures from the last follow-up, because each waiting period starts from the most recent email.
-
09
Calculate the days elapsed with ticks
Add a Compose named
Days Elapsed:div(sub(ticks(utcNow()),ticks(outputs('Reference_Date'))),864000000000)Power Automate has no function to subtract one date from another.
ticksturns a date into a position on a very long ruler that starts on January 1 of year 0001, where each mark is 100 nanoseconds. Subtract the two positions, then divide by864000000000, the number of ticks in one day (10,000,000 per second x 60 x 60 x 24). If the reference date is February 14 and today is February 21, the result is7. -
10
Set the required waiting interval
Add a Compose named
Required Intervalwith a nestedif:if(equals(int(items('For_each')?['Follow Up Count']),0),3,if(equals(int(items('For_each')?['Follow Up Count']),1),7,if(equals(int(items('For_each')?['Follow Up Count']),2),14,999)))Count 0 waits 3 days, count 1 waits 7 days, count 2 waits 14 days. Anything else returns
999, a safety net that can never be reached, so the flow can never keep sending emails. Change 3, 7 and 14 to suit your business. -
11
Decide whether to send today
Add a second Condition. On the left, pick the output of
Days Elapsedfrom dynamic content. Set the operator tois greater than or equal to, and on the right pick the output ofRequired Interval.Use greater than or equal, not equal. The flow runs once a day, so if a day is missed (for example during a service outage) the email still goes out on the next run. Leave the False branch empty. The contact is simply checked again tomorrow.
-
12
Send the right follow-up with a Switch
In the True branch, add a Switch with
Onset to:int(items('For_each')?['Follow Up Count'])Add cases
0,1and2, and in each one add Send an email (V2) (Office 365 Outlook). Put theEmailcolumn inToand useNamein the subject and body for personalization. Case 0 is a friendly check-in, case 1 a gentle nudge, case 2 the final reach-out. Write the text in your own voice. -
13
Update the row after sending
After the Switch, add Update a row with
Emailas the key column and set three fields:Follow Up Count:add(int(items('For_each')?['Follow Up Count']),1)Last Follow Up:utcNow(). This writes an ISO date, the same format the List rows action reads.Status:if(equals(int(items('For_each')?['Follow Up Count']),2),'Completed','Active')
The status check looks for
2, not3, because both fields are written in the same action and the count you read is still the old value. Count 2 means the third and final follow-up just went out. -
14
Test the flow and follow the contact lifecycle
Select Test, choose manual, and run the flow. Check your sent items and the Excel table: rows that were due now show a count of
1and today's date.A contact added on February 4 gets follow-up 1 on February 7, follow-up 2 on February 14 and follow-up 3 on February 28, and then the status becomes
Completed. If they reply at any point, the status becomesRepliedand nothing else is sent.
Tips and common problems
- When you add a new contact to Excel, also add their address to the Outlook rule. If you forget, their reply never lands in the Prospects folder and the flow keeps following up.
- Set
DateTime FormattoISO 8601in List rows present in a table. Otherwise dates arrive as Excel serial numbers and the ticks expression fails. - Set
Fetch Only Unread MessagestoNoin Get emails (V3). A reply you already read still has to stop the follow-ups. - Action names in expressions must match your flow. If your loop is called
Apply_to_eachor your Compose has a different name, changeitems('For_each')andoutputs('Reference_Date')to match. - The
999in the Required Interval expression is a safety net. It stops the flow from sending a fourth email if the count ever goes above 2.
Expressions used in this flow
| Action | Expression | What it does |
|---|---|---|
| List rows filter | Status eq 'Active' | Reads only contacts that still need follow-ups |
| Reply condition | length(body('Get_emails_(V3)')?['value']) | Counts replies found (greater than 0 means replied) |
| Reference Date | if(equals(int(items('For_each')?['Follow Up Count']),0),items('For_each')?['First Contact Date'],items('For_each')?['Last Follow Up']) | Picks the date to measure from |
| Days Elapsed | div(sub(ticks(utcNow()),ticks(outputs('Reference_Date'))),864000000000) | Whole days since the reference date |
| Required Interval | if(equals(int(items('For_each')?['Follow Up Count']),0),3,if(equals(int(items('For_each')?['Follow Up Count']),1),7,if(equals(int(items('For_each')?['Follow Up Count']),2),14,999))) | Days to wait before the next email |
| Switch On | int(items('For_each')?['Follow Up Count']) | Chooses follow-up 1, 2 or 3 |
| Follow Up Count | add(int(items('For_each')?['Follow Up Count']),1) | Adds one after each send |
| Last Follow Up | utcNow() | Saves today in ISO format |
| Status | if(equals(int(items('For_each')?['Follow Up Count']),2),'Completed','Active') | Closes the contact after the third email |
Example timeline
| Date | What happens | Count after |
|---|---|---|
| February 4 | First email sent, contact added as Active | 0 |
| February 7 | Follow-up 1 (3 days after first contact) | 1 |
| February 14 | Follow-up 2 (7 days after follow-up 1) | 2 |
| February 28 | Follow-up 3 (14 days after follow-up 2), status set to Completed | 3 |
If you would rather review each follow-up before it goes out, see how to create follow-up drafts instead.
Questions
How do I automatically send a follow-up email in Outlook if there is no reply?
Outlook has no built-in feature for this. Use a scheduled Power Automate flow that reads your contacts from Excel, checks a replies folder with Get emails (V3), and sends the next email with Send an email (V2) once enough days have passed.
How do I subtract two dates in Power Automate?
Convert both dates to ticks and divide the difference by the ticks in one day: div(sub(ticks(utcNow()),ticks(yourDate)),864000000000). The result is the number of whole days between them.
Does this flow need premium connectors or SharePoint?
No. It uses Recurrence, Excel Online (Business) and Office 365 Outlook, which are standard connectors included with Microsoft 365 business plans. The Excel file lives in OneDrive for Business.
Can I change the follow-up intervals?
Yes. Edit the numbers 3, 7 and 14 in the Required Interval expression, for example to 2, 5 and 10, and update the email text in the Switch cases.
