How to Build a Power Automate Flow for Weekly Unanswered Email Follow-Up Reports
- Sam Fawzi
- Aug 11
- 4 min read
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.

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)

Step 3 — Initialize variables
EmailTO (string)
CC (string)
Array (array)

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)}

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

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"
]
}
}
}
}

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

Inside an 'Apply to each' over body('Parse_JSON')?['value']:
1) Add a Compose that builds a filter by conversationId:

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:

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.

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

Step 7 — Build the report rows
Within the true branch of the condition:

Use Select to extract To and CC addresses to flat strings.
Append to variables EmailTO and CC in small loops.




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

Reset EmailTO and CC to null after each row.

Step 8 — Create an HTML table and send the email
1) Compose your CSS (optional) for table styling.

<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').

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

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.