1. Home
  2. Guides
  3. Power Automate
  4. How to send automatic follow-up emails in Outlook when nobody replies
Power Automate

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.

  • By Nur Islam
  • 24:46 video
  • 14 steps
  • 5K views
Jump to a step (14)
Who this is for

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 Count and Status
  • 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
  1. 01

    Build the Excel tracking table

    Create a workbook in OneDrive for Business (the video uses recipients.xlsx) with a table named Table1 and 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 at 0. The flow raises it to 1, 2 and 3.
    • Status: set to Active. The flow changes it to Replied or Completed.

    For each new contact you fill in five things: name, email, first contact date, count 0 and status Active. You can add rows at any time and the flow picks them up the next morning.

  2. 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 to the Prospects folder.
    • 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.

  3. 03

    Create a scheduled flow with a Recurrence trigger

    In Power Automate, create a scheduled cloud flow. Set the Recurrence trigger to run every 1 day 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.

  4. 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 as 46066 that you cannot use in date expressions.
  5. 05

    Loop through each contact and look for a reply

    Add an Apply to each (For each) loop and select the value output 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: Prospects
    • From: the Email column from dynamic content
    • Top: 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.
  6. 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 than and the right side to 0. The value property is the list of emails found, and length counts them. One or more means the person replied (true). Zero means no reply (false).

  7. 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 Column to Email, the key value to the Email column from dynamic content, and set Status to Replied. Because the filter only reads Active rows, this contact is skipped from the next run onwards.

  8. 08

    Work out the reference date

    In the False branch, add a Compose action named Reference Date with 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.

  9. 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. ticks turns 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 by 864000000000, 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 is 7.

  10. 10

    Set the required waiting interval

    Add a Compose named Required Interval with a nested if:

    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. 11

    Decide whether to send today

    Add a second Condition. On the left, pick the output of Days Elapsed from dynamic content. Set the operator to is greater than or equal to, and on the right pick the output of Required 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. 12

    Send the right follow-up with a Switch

    In the True branch, add a Switch with On set to:

    int(items('For_each')?['Follow Up Count'])

    Add cases 0, 1 and 2, and in each one add Send an email (V2) (Office 365 Outlook). Put the Email column in To and use Name in 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. 13

    Update the row after sending

    After the Switch, add Update a row with Email as 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, not 3, 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. 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 1 and 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 becomes Replied and 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 Format to ISO 8601 in List rows present in a table. Otherwise dates arrive as Excel serial numbers and the ticks expression fails.
  • Set Fetch Only Unread Messages to No in 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_each or your Compose has a different name, change items('For_each') and outputs('Reference_Date') to match.
  • The 999 in the Required Interval expression is a safety net. It stops the flow from sending a fourth email if the count ever goes above 2.
Still stuck? Ask AI to help you fix itChatGPTClaudeGeminiCopilotPerplexityGrok

Expressions used in this flow

ActionExpressionWhat it does
List rows filterStatus eq 'Active'Reads only contacts that still need follow-ups
Reply conditionlength(body('Get_emails_(V3)')?['value'])Counts replies found (greater than 0 means replied)
Reference Dateif(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 Elapseddiv(sub(ticks(utcNow()),ticks(outputs('Reference_Date'))),864000000000)Whole days since the reference date
Required Intervalif(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 Onint(items('For_each')?['Follow Up Count'])Chooses follow-up 1, 2 or 3
Follow Up Countadd(int(items('For_each')?['Follow Up Count']),1)Adds one after each send
Last Follow UputcNow()Saves today in ISO format
Statusif(equals(int(items('For_each')?['Follow Up Count']),2),'Completed','Active')Closes the contact after the third email

Example timeline

DateWhat happensCount after
February 4First email sent, contact added as Active0
February 7Follow-up 1 (3 days after first contact)1
February 14Follow-up 2 (7 days after follow-up 1)2
February 28Follow-up 3 (14 days after follow-up 2), status set to Completed3

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.

Video chapters
Ask a question in the comments Last checked 26 Sep 2026. Screens change: if a step looks different, tell me in the comments.