top of page

How to Build a Power Automate Flow for Weekly Unanswered Email Follow-Up Reports

Email overload is a common challenge in the modern workplace, and it’s easy for important messages to slip through the cracks. Imagine getting a clean, automated summary every week listing all the emails you’ve sent that still haven’t received a response — so you can follow up before opportunities are lost. This step-by-step guide will show you exactly how to build that automation in Microsoft Power Automate, leveraging Outlook and a bit of logic to make sure you never miss a beat. The best part? Once you’ve set it up, it runs entirely on autopilot.

ree

This guide walks you through creating a Power Automate flow that emails you a weekly summary of messages you sent last week that haven't received a reply yet. We'll use the Office 365 Outlook connector, a few variables, an HTTP call to Microsoft Graph (via the Outlook connector), and an HTML table for a clean report.


What you’ll need

- Microsoft 365 with Outlook mailbox

- Access to Power Automate (https://flow.microsoft.com)

- Permission to use the Office 365 Outlook connector


Step 1 — Create the flow

1) Go to Create → Scheduled cloud flow.

2) Name it "Last Week's Unanswered Email Summary".

3) Set it to run weekly at your preferred day/time.



Step 2 — Configure the Recurrence trigger

Set: Frequency = Week, Interval = 1, Day = Friday, Time zone = Eastern Standard Time (or change it to match your preferred time and time zone)

ree

Step 3 — Initialize variables

  • EmailTO (string)

  • CC (string)

  • Array (array)

ree


Step 4 — Compose a rolling time filter (last 7 days)- change it if needed

Add a Compose action named "FilterValue" with this expression:

sentDateTime ge  @{addDays(utcNow(),-7)}

ree

Step 5 — Get Sent Items for the last week

  • Add an HTTP request using the Office 365 Outlook connector (operation: HttpRequest) to query SentItems:

GET /V1.0/me/mailFolders/SentItems/messages?$filter=@{outputs('FilterValue')}&$top=999  &$select=id,subject,from,toRecipients,ccRecipients,internetMessageId,conversationId,sentDateTime

ree


  • Parse the response with a Parse JSON action (include id, subject, from.emailAddress, toRecipients[], ccRecipients[], internetMessageId, conversationId, sentDateTime).

  • Schema

{
    "type": "object",
    "properties": {
        "value": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string"
                    },
                    "subject": {
                        "type": "string"
                    },
                    "sentDateTime": {
                        "type": "string"
                    },
                    "from": {
                        "type": "object",
                        "properties": {
                            "emailAddress": {
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "type": "string"
                                    },
                                    "address": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    },
                    "toRecipients": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "emailAddress": {
                                    "type": "object",
                                    "properties": {
                                        "name": {
                                            "type": "string"
                                        },
                                        "address": {
                                            "type": "string"
                                        }
                                    }
                                }
                            },
                            "required": [
                                "emailAddress"
                            ]
                        }
                    },
                    "ccRecipients": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "emailAddress": {
                                    "type": "object",
                                    "properties": {
                                        "name": {
                                            "type": "string"
                                        },
                                        "address": {
                                            "type": "string"
                                        }
                                    }
                                }
                            },
                            "required": [
                                "emailAddress"
                            ]
                        }
                    },
                    "internetMessageId": {
                        "type": "string"
                    },
                    "conversationId": {
                        "type": "string"
                    }
                },
                "required": [
                    "id",
                    "subject",
                    "from",
                    "toRecipients",
                    "ccRecipients",
                    "internetMessageId",
                    "conversationId"
                ]
            }
        }
    }
}
ree

Step 6 — For each sent email, check the thread for a reply


ree

Inside an 'Apply to each' over body('Parse_JSON')?['value']:

1) Add a Compose that builds a filter by conversationId:

ree
conversationId eq '@{items('Apply_to_each_2')?['conversationId']}'

2) Add an HTTP request to Inbox with both filters (conversationId + last 7 days) and $top=1:

ree
GET /V1.0/me/mailFolders/Inbox/messages?$filter=@{outputs('Compose_3')} and @{outputs('FilterValue')}&$top=1

3) Parse that response (Parse JSON). If the array length == 0, there was no reply in that thread.

ree

Same Schema used above.

Also ignore calendar auto-responses by checking Subject does not start with 'Tentative:', 'Accepted:', or 'Declined:'.

ree

Step 7 — Build the report rows

Within the true branch of the condition:

ree
  • Use Select to extract To and CC addresses to flat strings.

  • Append to variables EmailTO and CC in small loops.

ree

ree
ree


ree
  • Append an object to Array with keys: To, Subject, CC, Date (sentDateTime).

ree


  • Reset EmailTO and CC to null after each row.


ree

Step 8 — Create an HTML table and send the email

1) Compose your CSS (optional) for table styling.

ree
<style>  table { width:100%; border-collapse:collapse; font-family:Arial; font-size:12px; }  th { background-color:#003F2D; color:#fff; text-align:left; padding:8px; }  td { border:1px solid #ddd; text-align:left; padding:8px; }  tr:nth-child(even) { background:#f2f2f2;}</style>

2) Use Create HTML table on variables('Array').



ree

3) Send an email (V2) to yourself. Subject "Weekly Notification: Emails Awaiting Replies". For counts, use:

ree

Total sent: @{length(body('Parse_JSON')?['value'])}
Unanswered Emails: @{length(variables('Array'))}


@{outputs('Style')}@{body('Create_HTML_table')}

Step 9 — Save, Turn on, and Test

Save the flow, turn it on, and test a manual run or wait for the scheduled time.


Optional enhancements

- Pagination if you send >999 emails in a week.

- Add an 'ignore list' of subjects/senders.

- Localize the time zone and date formatting.

- Write the table to Excel/SharePoint before emailing.



Customize for Your Business

While this guide focuses on unanswered emails, the same pattern can be adapted to countless other use cases. By tweaking the data source, filter, and output, you can make the automation fit your exact needs.

Here are some ideas:


  • Customer Support Follow-Up: Identify open tickets or cases that haven’t been updated in X days and send a reminder to the support team.

  • Sales Lead Tracking: Flag leads that haven’t responded within a set period, and trigger an alert for follow-up calls.

  • Project Management Reminders: Detect overdue task updates in Planner or SharePoint lists and email a status report to stakeholders.

  • Internal Team Check-Ins: Summarize unanswered Teams messages for managers to ensure no blockers remain unresolved.


By simply replacing the email retrieval logic with another connector or dataset, you can repurpose this automation to suit almost any repetitive follow-up scenario.

bottom of page