๐ŸŒŸ POWER AUTOMATE: Send ONE Email Per Manager — Without ANY Expressions! (Beginner-Friendly Guide)

 






๐ŸŒŸ POWER AUTOMATE: Send ONE Email Per Manager — Without ANY Expressions! (Beginner-Friendly Guide)

Automation Hero

Have you ever built a flow that sends one email per SharePoint item, and suddenly managers get 25 emails at once? ๐Ÿ˜ฌ
This guide shows you exactly how to fix that — and how to send ONE clean email per manager with all their items listed in one HTML table.

And the best part?

๐Ÿ‘‰ No expressions in the email body
๐Ÿ‘‰ No complex formulas
๐Ÿ‘‰ No syntax errors ever again

Just simple drag-and-drop steps anyone can follow.

Let’s do it! ๐Ÿš€


๐Ÿงฑ Step 0 — Your SharePoint List

Your list must have at least these columns:

Column Type
Title Single line of text
manager Person

This flow groups all items by the manager’s email and sends one email for each.


๐Ÿ”ฅ Step 1 — Start Your Flow

1️⃣ Trigger: Manually trigger a flow
(or Scheduled, or Automated — your choice)

2️⃣ Initialize variables:

rowsForManager

  • Type: Array

  • Value: []

allRows

  • Type: Array

  • Value: []

uniqueManagers

  • Type: Array

  • Value: []


๐Ÿ“ฅ Step 2 — Get Items

Use Get items

  • Site: your site

  • List: managerassignment


๐Ÿ”„ Step 3 — Normalize the Rows

Add Select → rename it shape rows

From:
value from Get items

Map:

Key Expression
ManagerEmailLower toLower(trim(coalesce(item()?['manager']?['Email'], item()?['manager']?['EMail'], '')))
ManagerName item()?['manager']?['DisplayName']
Title item()?['Title']
ID item()?['ID']
Link Link to Item

This converts every row into a clean flat object.


๐Ÿงน Step 4 — Get the List of Managers

Add Select → rename it managers only

From:
body('shape_rows')

Map:

Key Value
Email item()?['ManagerEmailLower']

Now dedupe it:

Add Compose – Unique managers

@union(body('managers_only'), body('managers_only'))

Set variable → uniqueManagers = output of that Compose


๐Ÿ‘ฅ Step 5 — Loop Managers

Add For each manager

Input:
variables('uniqueManagers')

Inside:

5.1 Compose — current manager

toLower(trim(string(items('For_each_manager')?['Email'])))

5.2 Reset rowsForManager

Set variable → rowsForManager = []


๐Ÿ” Step 6 — Loop All Rows

Add For each row

Input:
body('shape_rows')

Inside:

6.1 Compose — row manager email

toLower(trim(string(item()?['ManagerEmailLower'])))

6.2 Condition (does row belong to this manager?)

Left:
outputs('Compose_2')

Operator:
is equal to

Right:
outputs('current_manager')

If YES → Append to array variable:

  • Name: rowsForManager

  • Value: item()

If NO → do nothing.


๐Ÿง Step 7 — After Inner Loop, Check If This Manager Has Rows

Add Condition:

Left:

length(variables('rowsForManager'))

Operator:
is greater than

Right:
0

If NO → skip
If YES → build & send email


๐Ÿ’Œ STEP 8 — THE EMAIL BODY (NO EXPRESSIONS!) ← This is the replacement

Inside If yes branch:

8.1 Create HTML table

  • From: variables('rowsForManager')

  • Columns: Custom

    • Title → Title

    • ID → ID

    • Manager → ManagerName

    • Link → Link

8.2 Add a Compose

Rename → Email body

๐Ÿ“Œ IMPORTANT:
Do NOT click Expression.
Stay in Text mode.

Paste this:

<p>Hello,</p>
<p>Here are your assigned items:</p>

Now click inside the box where the table should appear.
Then from Dynamic content, select:

Create HTML table
(or whatever the HTML table action is called)

Power Automate automatically inserts:

@{outputs('Create_HTML_table')}

Then finish with:

<p>Thanks,<br/>Power Platform Automation</p>

Your final email body box will look like:

<p>Hello,</p>
<p>Here are your assigned items:</p>
@{outputs('Create_HTML_table')}
<p>Thanks,<br/>Power Platform Automation</p>

✨ No expressions
✨ No concat()
✨ No syntax errors


✉ Step 9 — Send Email (ONE per Manager)

Use Send an email (V2):

Field Value
To outputs('current_manager')
Subject Your Assigned Items Summary
Body Use dynamic content → Email body
Is HTML Yes

๐ŸŽ‰ Final Result

You now have:

✔ ONE email per manager
✔ Clean HTML table
✔ Zero spam
✔ No expressions in email body
✔ 100% beginner-friendly
✔ Works with any number of items or managers

This method is the easiest, safest, and most reliable way to send grouped emails in Power Automate — and it works perfectly every time.



Comments

Popular posts from this blog

Bridging the Impossible: Connecting Jira On-Prem to Power Automate & Copilot Studio — The Solution Nobody Built Until Now"

How I Automated My Entire SharePoint Tenant with 150 MCP Tools and Claude Desktop

Azure Management MCP Server