A step-by-step tutorial for building an intelligent email triage and morning digest system on your existing Microsoft 365 tenant — no third-party tools, no additional licenses, no servers to maintain.

Every executive we work with has the same complaint: too much email, not enough signal. Critical alerts get buried under vendor promos. A ServiceNow change ticket sits between two Amazon receipts. The morning routine becomes 45 minutes of triage before real work can start.

The good news: if you have Microsoft 365, you already have every tool you need to fix this. Here is the full pattern, step by step, in a form you can actually build over a weekend.

SOURCELOGICOUTPUTSOutlook Inbox200+ emails/dayMixed priorityManual triageReal-Time Alert FlowPolls every 3 min · classifies · routesMorning Digest FlowRuns 7 AM · groups by categorySharePoint List: Rules (business-editable)Alert EmailHigh priority · immediateOutlook SubfoldersAuto-filed by categoryPower BI DatasetStreaming row insert7 AM Digest EmailOne email · all categoriesAll components live in your Microsoft 365 tenant. No third-party services.
The whole system runs inside your Microsoft 365 tenant.

What you will build:

  • A real-time flow that classifies incoming email against business-owned rules, sends high-priority alerts, files messages into categorized subfolders, and logs to Power BI in under 30 seconds.
  • A morning digest flow that fires at 7 AM every workday and sends one categorized email replacing manual triage.
  • A live Power BI dataset that any dashboard can read from.
  • Rules stored in SharePoint so the business owns them, not IT.

Reading time: ~10 minutes. Build time: ~4 hours if you are comfortable with the Microsoft stack; a weekend if this is new.

Prerequisites

Before you start, confirm you have:

  • Microsoft 365 with Power Automate license (included in most business plans)
  • A SharePoint site where you can create a list
  • Power BI Pro or Premium capacity for the streaming dataset
  • An Outlook mailbox you can automate against
  • SharePoint site owner rights (or a friendly admin nearby)

The Design Decision That Matters Most

Before we start clicking, one architectural note that determines whether this system survives past its first month.

Put the rules in data, not code.

The rules — which senders count as critical, which folder each category goes to, whether an alert fires — will live in a SharePoint list. Business users edit rows themselves. Add a critical vendor? Edit a row. Reclassify marketing? Edit a row. No developer ticket, no flow redeploy.

TRADITIONAL APPROACHRules embedded in code inside the automation.Business needsa rule changeOpen ticketwith ITDev edits flow,exports, testsDeploy to prod,re-authorizeLive after~2 weeks2 wkRULES-AS-DATA PATTERNRules live in a SharePoint list. The flow reads them at runtime.Business needsa rule changeEdit a row inSharePoint listSave.Live immediately.30 secThe pattern that keeps the system relevant six months in.
The pattern that keeps the system relevant six months in.

Skip this pattern and your beautiful automation dies in six months when the business realizes every rule change requires an IT ticket. They will stop asking, and the system will drift out of relevance.

Step 1: Create the SharePoint Rules List

In your SharePoint site:

  1. Click New → List → Blank list.
  2. Name it EmailRules.
  3. Add these columns (Settings → List settings → Create column):
Column Type Options
RuleName Single line of text Title column
Priority Choice Critical, High, Informational
MatchType Choice SenderEquals, DomainEquals, SubjectContains
MatchValue Single line of text —
TargetFolder Single line of text e.g., Critical/Internal
SendAlert Yes/No Default: No
IncludeInDigest Yes/No Default: Yes

Add a few starter rows to test with:

RuleName Priority MatchType MatchValue Alert
CEO Critical SenderEquals ceo@yourcompany.com Yes
CISA advisories High DomainEquals cisa.dhs.gov No
Chase alerts Informational DomainEquals chase.com No

[Screenshot placeholder: SharePoint list showing the EmailRules columns and 3 sample rows.]

Step 2: Create the Power BI Streaming Dataset

The dataset receives one row per classified email. Real-time dashboards read from it.

  1. Go to app.powerbi.com and pick your workspace.
  2. Click New → Streaming dataset → API → Next.
  3. Name it EmailEvents.
  4. Add these columns:
Name Type
EventId Text
ReceivedDateTime DateTime
FromAddress Text
Subject Text
Priority Text
Category Text
MatchedRuleName Text

Toggle Historic data analysis to On (this keeps the rows for reporting, not just live tiles). Click Create. Copy the Push URL that appears — you will paste it into the flow in Step 4.

Step 3: Create the Outlook Subfolders

In Outlook, under your Inbox, create a folder tree that matches the TargetFolder values you plan to use:

  • Critical/Internal
  • Critical/Customer
  • High/Cyber
  • Informational/Banking
  • Informational/Marketing

Right-click Inbox → New Folder. Nest as needed. Match the names exactly — Power Automate is case-sensitive on folder paths, and the whole move step fails silently if a folder does not exist.

Step 4: Build the Real-Time Alert Flow

This is the main event.

  1. Go to make.powerautomate.com → Create → Automated cloud flow.
  2. Name it Email - Real-Time Classifier.
  3. Trigger: When a new email arrives (V3) — Outlook connector.
  4. Configure the trigger:
    • Folder: Inbox
    • Only with attachments: No
    • Include attachments: No

Then add these actions in order:

Get the rules from SharePoint

  • Action: Get items (SharePoint connector)
  • Site: your site
  • List: EmailRules

Find a matching rule

Use a Filter array action against the SharePoint items:

From:       value (output of Get items)
Condition:  item()['MatchValue'] equals triggerOutputs()?['body/from']

Then check length(body('Filter_array')) to see if a rule matched.

Post the event to Power BI

  • Action: HTTP (or the Power BI – Add rows to a dataset connector)
  • Method: POST
  • URI: the Push URL you copied in Step 2
  • Body: JSON matching the dataset schema exactly
[{
  "EventId": "@{guid()}",
  "ReceivedDateTime": "@{triggerOutputs()?['body/receivedDateTime']}",
  "FromAddress": "@{triggerOutputs()?['body/from']}",
  "Subject": "@{triggerOutputs()?['body/subject']}",
  "Priority": "@{first(body('Filter_array'))?['Priority/Value']}",
  "Category": "@{first(body('Filter_array'))?['TargetFolder']}",
  "MatchedRuleName": "@{first(body('Filter_array'))?['Title']}"
}]

Send the alert (only if the rule says so)

  • Wrap in a Condition: first(body('Filter_array'))?['SendAlert'] equals true
  • Yes branch: Send an email (V2) with Importance: High and Subject: [CRITICAL] @{triggerOutputs()?['body/subject']}

Move the email to the target folder

  • Action: Move email (V2)
  • Message ID: triggerOutputs()?['body/id']
  • Folder: Inbox/@{first(body('Filter_array'))?['TargetFolder']} — the Inbox/ prefix is required

Save the flow. Turn it on.

TRIGGERWhen a new email arrives (V3)Get items — SharePointFetch all rows from EmailRules listFilter arrayFind rule where MatchValue = senderMatch found?(length > 0)YESnono actionHTTP POSTSend event row to Power BI datasetSend email (V2) — conditionalHigh-importance alert if SendAlert = YesMove email (V2)To Inbox/{TargetFolder}
The real-time alert flow, action by action.

Step 5: Build the Morning Digest Flow

  1. Create → Scheduled cloud flow.
  2. Name: Email - Morning Digest.
  3. Recurrence: Every day at 7:00 AM Eastern, weekdays only.

Then:

  • Get emails (V3) — Folder: Inbox, Top: 100, Received time: addHours(utcNow(), -24)
  • Get items — same SharePoint rules list
  • Apply to each email — classify against the rules (same Filter array pattern from Step 4) and append the matched result to an array variable
  • Get events (V4) from Outlook Calendar — Start: startOfDay(utcNow()), End: endOfDay(utcNow())
  • Compose an HTML string grouping the classified emails by Priority and adding a Calendar Items section from the calendar events. Handle empty sections with No emails found since last run.
  • Send an email (V2) — To: the executive, Subject: Morning Digest — @{formatDateTime(utcNow(),'MMMM dd')}, Body: the HTML, Is HTML: Yes
Morning Digest — September 24From: automation@yourcompany.com · 7:00 AMCRITICAL (2)• CEO — Q3 forecast review needed today• Board Chair — Follow-up on Tuesday’s discussionHIGH (3)• CISA — Weekly cyber threat bulletin• ServiceNow — Change window CHG0043221 approved• DocuSign — 2 contracts pending your signatureCALENDAR (2)• 9:00 AM — Weekly staff sync (Conference Room A)• 2:00 PM — Vendor demo: RiskCloud (Teams)INFORMATIONAL (17)Chase (3), Southwest (2), Amazon (5), MLB (1),LinkedIn (4), Marketing digests (2)Generated automatically at 7:00 AM by Power Automate
What the 7 AM digest looks like — one email replacing 45 minutes of triage.

Step 6: Test End-to-End

  1. Send a test email from an address matching one of your critical rules.
  2. Within 3 minutes, check three things:
    • The high-priority alert landed in the target inbox.
    • The original message moved to the correct subfolder.
    • A new row appeared in the EmailEvents Power BI dataset.
  3. Manually trigger the morning digest flow (the Run button in Power Automate). Open the digest email and confirm the grouping and calendar section.

Common Gotchas

Nothing happens for 3 minutes. The V3 trigger polls; it does not push. Under 3 min is normal. Longer means the flow is off, throttled, or the trigger authentication expired.

Folder move fails silently. Include the Inbox/ prefix in the folder path. It is case-sensitive.

Rule lookup returns nothing. The SharePoint connection may be authenticating as a service account without list read permissions. Re-authorize the connection.

Power BI push returns 400. The row schema must match the dataset schema exactly, column names included. A missing column is a hard error.

Duplicate alerts. The V3 trigger can occasionally fire twice on quick retries. De-dupe with a lookup on your event log if this bites you in production.

Extending the Pattern

The pattern is intentionally simple so you can grow it:

  • Teams alerts: replace the email alert action with Post message in a chat for a mobile-first workflow.
  • Copilot Studio classifier: for messages that do not match a clear rule, add a call to a Copilot Studio agent trained on your organization’s email patterns.
  • Power BI Copilot: publish a report on the EmailEvents dataset and let users ask conversational questions — “Show me spikes in cyber alerts this quarter.”
  • Twilio SMS: for true after-hours urgency, add a Twilio connector to send SMS on Critical-priority matches.
  • Dataverse instead of SharePoint: when volume grows past ~5,000 rules or you need transactional writes, migrate the rules list to Dataverse. Same flow shape, better platform.
Email Command Center · LiveLast refresh: 2 minutes agoEMAILS TODAY247▲ 12% vs 7d avgCRITICAL32 executive · 1 customerALERTS FIRED3avg response: 12 minAUTO-FILED19880% of inbox volumeEmail volume by category (last 7 days)CritHighCalBankMktInfoCritical alert trend (30 days)Aug 25Sep 24
A dashboard built on the EmailEvents dataset — visibility you would otherwise need a SIEM for.

The Payoff

When it is running:

  • Morning triage drops from ~45 minutes to about 5.
  • Zero critical alerts get missed.
  • Every classification decision is auditable in Power BI.
  • The business owns the rules, not IT.
  • Zero incremental licensing cost.

When to Call Us Instead

If any of these apply, this is a project, not a weekend hack:

  • Your organization needs formal ALM (dev → test → prod deployment).
  • You need Dataverse for the rules from day one (higher volume, transactional writes).
  • Compliance requires the classifier to be auditable to a regulatory standard.
  • You want a Copilot Studio agent integrated on day one.

That is where we come in. We have built this pattern for multiple clients now, and we can typically stand up the production version — with the ALM, security review, and Copilot integration — in under two weeks.

If your executives are drowning in email and Outlook rules are not cutting it, get in touch.