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

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 |
|---|---|
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
Post a Comment