
Picture this: Every Monday morning, your sales team needs a report of last week's performance delivered to their inboxes. Your marketing manager wants an alert whenever a lead form submission comes in. Your operations director needs to know immediately when inventory drops below critical levels. Right now, someone on your team is manually sending these emails, or worse — people are checking dashboards hoping they don't miss something important.
This is exactly the kind of repetitive, time-sensitive work that Power Automate was designed to handle. Power Automate is Microsoft's workflow automation platform that connects your apps and services, allowing you to create automated processes called "flows" that work 24/7 without human intervention.
By the end of this lesson, you'll know how to build reliable email notification systems that keep your team informed without any manual effort. You'll create flows that respond to data changes, schedule regular reports, and ensure critical information reaches the right people at the right time.
What you'll learn:
To follow along with this lesson, you'll need:
You don't need any programming experience. Power Automate uses a visual, drag-and-drop interface that makes automation accessible to business users.
Power Automate handles email through what it calls "connectors" — pre-built integrations that let your flows interact with email services. The most common connector is "Office 365 Outlook," which works with your organization's email system.
Think of Power Automate as a digital assistant that watches for specific events and responds according to your instructions. When you create an email automation flow, you're essentially telling this assistant:
This happens instantly and consistently, every time the trigger occurs.
Power Automate offers several ways to trigger email notifications:
Event-based triggers respond to something happening in your data:
Time-based triggers run on a schedule:
Approval triggers start human-driven processes:
Let's start by building your first automated email notification.
We'll create a flow that sends an email notification whenever someone submits a new customer inquiry through a SharePoint list. This is a common scenario that demonstrates the core concepts you'll use in more complex automations.
First, let's create a SharePoint list to capture customer inquiries. In SharePoint Online:
This gives us a realistic data structure that a sales or customer service team might use.
Now let's create the flow:
You'll see the flow designer with your trigger step already added. Configure the trigger:
Now add an email action:
Configure the email action with these settings:
To: Enter your email address (or a team distribution list)
Subject: New Customer Inquiry - {{Customer Name}} from {{Company}}
Body:
A new customer inquiry has been submitted:
Customer: {{Customer Name}}
Company: {{Company}}
Email: {{Email Address}}
Priority: {{Priority}}
Inquiry Type: {{Inquiry Type}}
Message:
{{Message}}
Please review and respond appropriately.
---
This is an automated notification from the Customer Inquiry system.
Notice the double curly braces {{}} — these are placeholders for dynamic content. When you click in the Subject or Body fields, Power Automate shows you available data from previous steps.
Pro tip: Always include context in automated emails. Recipients should immediately understand what the email is about and what action (if any) they need to take.
Save your flow and test it:
Within a few minutes, you should receive an email that looks like this:
Subject: New Customer Inquiry - Sarah Johnson from TechCorp Industries
Body:
A new customer inquiry has been submitted:
Customer: Sarah Johnson
Company: TechCorp Industries
Email: sarah.johnson@techcorp.com
Priority: High
Inquiry Type: Sales
Message:
Interested in enterprise pricing for 500 users
Please review and respond appropriately.
---
This is an automated notification from the Customer Inquiry system.
This basic flow demonstrates the core pattern you'll use for most email automations: trigger → get data → send formatted email.
Now let's enhance our flow with more sophisticated features that make your automated emails more professional and actionable.
Not every inquiry needs the same response. Let's modify our flow to send different emails based on the priority level:
This creates an "If yes" and "If no" branch. Move your existing email action into the "If yes" branch and modify it for high-priority inquiries:
Subject: URGENT: High Priority Customer Inquiry - {{Customer Name}}
Body: Include escalation instructions and faster response commitments
In the "If no" branch, add another condition to check if Priority equals "Medium", creating three different email templates for different priority levels.
Power Automate supports HTML in email bodies, letting you create more professional-looking notifications. Here's an enhanced version of our email body:
<html>
<body>
<h2 style="color: #0078d4;">New Customer Inquiry Received</h2>
<table style="border-collapse: collapse; width: 100%; font-family: Arial, sans-serif;">
<tr style="background-color: #f2f2f2;">
<td style="padding: 8px; border: 1px solid #ddd; font-weight: bold;">Customer</td>
<td style="padding: 8px; border: 1px solid #ddd;">{{Customer Name}}</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd; font-weight: bold;">Company</td>
<td style="padding: 8px; border: 1px solid #ddd;">{{Company}}</td>
</tr>
<tr style="background-color: #f2f2f2;">
<td style="padding: 8px; border: 1px solid #ddd; font-weight: bold;">Priority</td>
<td style="padding: 8px; border: 1px solid #ddd; color: red;">{{Priority}}</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd; font-weight: bold;">Inquiry Type</td>
<td style="padding: 8px; border: 1px solid #ddd;">{{Inquiry Type}}</td>
</tr>
</table>
<h3>Message:</h3>
<div style="background-color: #f9f9f9; padding: 10px; border-left: 4px solid #0078d4;">
{{Message}}
</div>
<p><strong>Action Required:</strong> Please respond within 2 business hours for high-priority inquiries.</p>
<hr>
<small>This is an automated notification. Do not reply to this email.</small>
</body>
</html>
This creates a professional table layout with consistent styling that matches your organization's branding.
You can make your automated emails more actionable by including relevant attachments or links. Add these elements to your email:
Attachments: If your trigger involves file uploads, you can attach those files to the notification email Action Links: Include direct links to relevant systems:
<p><a href="https://yourcompany.sharepoint.com/sites/customer-service/Lists/Customer%20Inquiries/DispForm.aspx?ID={{ID}}" style="background-color: #0078d4; color: white; padding: 10px 15px; text-decoration: none; border-radius: 5px;">View Full Inquiry</a></p>
Many business scenarios require regular email reports rather than event-driven notifications. Let's create a weekly sales summary that automatically compiles data and emails it to your team every Monday morning.
Add a "Get items" action to retrieve data from your sales tracking list:
Created ge datetime'{{addDays(utcnow(), -7)}}'This filter query gets only items created in the last 7 days. The addDays(utcnow(), -7) expression calculates the date 7 days ago from the current time.
Add a "Compose" action to calculate key metrics:
{
"totalDeals": "@{length(body('Get_items')?['value'])}",
"totalValue": "@{sum(body('Get_items')?['value'], 'DealValue')}",
"averageDealSize": "@{div(sum(body('Get_items')?['value'], 'DealValue'), length(body('Get_items')?['value']))}"
}
These expressions calculate total number of deals, total deal value, and average deal size from your data.
Create an email action with a comprehensive report format:
Subject: Weekly Sales Report - {{formatDateTime(utcnow(), 'MMM dd, yyyy')}}
Body:
<html>
<body>
<h2>Weekly Sales Summary</h2>
<p>Report Period: {{formatDateTime(addDays(utcnow(), -7), 'MMM dd')}} - {{formatDateTime(utcnow(), 'MMM dd, yyyy')}}</p>
<h3>Key Metrics</h3>
<table style="border-collapse: collapse; margin: 20px 0;">
<tr style="background-color: #0078d4; color: white;">
<th style="padding: 10px; border: 1px solid #ddd;">Metric</th>
<th style="padding: 10px; border: 1px solid #ddd;">Value</th>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;">Total New Deals</td>
<td style="padding: 8px; border: 1px solid #ddd;">{{outputs('Calculate_Metrics')?['totalDeals']}}</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;">Total Deal Value</td>
<td style="padding: 8px; border: 1px solid #ddd;">${{formatNumber(outputs('Calculate_Metrics')?['totalValue'], 'N0')}}</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;">Average Deal Size</td>
<td style="padding: 8px; border: 1px solid #ddd;">${{formatNumber(outputs('Calculate_Metrics')?['averageDealSize'], 'N0')}}</td>
</tr>
</table>
<h3>Individual Deals</h3>
<!-- We'll add deal details here -->
</body>
</html>
To include a list of individual deals, add an "Apply to each" action:
<tr>
<td style="padding: 8px; border: 1px solid #ddd;">{{items('Apply_to_each')?['CustomerName']}}</td>
<td style="padding: 8px; border: 1px solid #ddd;">{{items('Apply_to_each')?['DealType']}}</td>
<td style="padding: 8px; border: 1px solid #ddd;">${{formatNumber(items('Apply_to_each')?['DealValue'], 'N0')}}</td>
<td style="padding: 8px; border: 1px solid #ddd;">{{items('Apply_to_each')?['SalesRep']}}</td>
</tr>
Then concatenate all these HTML rows and include them in your final email body.
Pro tip: For complex reports with lots of data, consider creating a Power BI report and including a link or screenshot in the email instead of trying to format everything in HTML.
Approval workflows are one of Power Automate's most powerful features for business processes. Let's create a document approval workflow that sends notifications to approvers and tracks the approval status.
Add a "Start and wait for an approval" action:
Please review: {{Title}}Document: {{Title}}
Submitted by: {{Author/DisplayName}}
Department: {{Department}}
Please review this document and approve or reject.
This action sends a professional approval email to the designated approver and waits for their response before continuing the flow.
Add a condition to check the approval outcome:
In the "If yes" branch (approved), send a confirmation email to the document submitter:
To: {{Author/Email}}
Subject: Document Approved: {{Title}}
Body:
<html>
<body>
<h2 style="color: green;">Document Approved ✓</h2>
<p>Your document "<strong>{{Title}}</strong>" has been approved by {{responses('Start_and_wait_for_an_approval')?['responder/displayName']}}.</p>
<p><strong>Approval Details:</strong></p>
<ul>
<li>Approved by: {{responses('Start_and_wait_for_an_approval')?['responder/displayName']}}</li>
<li>Approval date: {{formatDateTime(responses('Start_and_wait_for_an_approval')?['responseTime'], 'MMM dd, yyyy h:mm tt')}}</li>
<li>Comments: {{responses('Start_and_wait_for_an_approval')?['comments']}}</li>
</ul>
<p>You can now proceed with your document process.</p>
</body>
</html>
In the "If no" branch (rejected), send a different email explaining the rejection and next steps.
Add actions to update the SharePoint item status and send a summary to managers:
This creates a complete approval workflow that keeps everyone informed automatically.
Now it's your turn to build a comprehensive email automation system. You'll create a customer support ticket system that demonstrates multiple concepts from this lesson.
Create a SharePoint list called "Support Tickets" with these columns:
Build three separate flows:
Flow 1: New Ticket Notifications
Flow 2: Daily Support Summary
Flow 3: Ticket Assignment Workflow
Add these sample tickets to test your flows:
Ticket 1:
- Title: Login issues with mobile app
- Customer Email: john.doe@company.com
- Priority: High
- Category: Technical
- Description: Cannot log into mobile app after latest update
- Status: New
Ticket 2:
- Title: Billing discrepancy on invoice #12345
- Customer Email: sarah.smith@business.org
- Priority: Medium
- Category: Billing
- Description: Invoice shows incorrect pricing for premium features
- Status: New
Ticket 3:
- Title: System completely down - urgent
- Customer Email: mike.wilson@enterprise.com
- Priority: Critical
- Category: Technical
- Description: Our entire system is inaccessible, affecting all users
- Status: New
Start with Flow 1 (new ticket notifications) since it follows the pattern we learned earlier. Then build Flow 2 using the scheduled report techniques, and finally tackle Flow 3 which combines triggers with assignment logic.
For the critical priority escalation in Flow 1, use a condition that checks if Priority equals "Critical", then add a parallel branch that sends an additional email to managers.
For Flow 2, use the recurrence trigger with a filter query to get today's tickets: Created ge datetime'{{formatDateTime(utcnow(), 'yyyy-MM-dd')}}T00:00:00Z'
Test each flow thoroughly with your sample data before moving to the next one.
Here are the most frequent issues people encounter when building email automation flows, along with solutions:
The Problem: You created a flow but emails aren't arriving, or they're significantly delayed.
Why it happens: Most often, this is due to connector authentication issues or the flow being turned off accidentally. Sometimes emails are being sent but caught by spam filters.
The Fix:
The Problem: Your email shows {{CustomerName}} instead of the actual customer name, or shows empty values.
Why it happens: This occurs when the dynamic content reference doesn't match the actual field name from your data source, or when the field is empty.
The Fix:
if(empty(triggerOutputs()?['body/CustomerName']), 'Not provided', triggerOutputs()?['body/CustomerName']) to handle empty fields gracefullyThe Problem: Your flow is sending duplicate emails or triggering more frequently than expected.
Why it happens: This usually occurs with "When an item is modified" triggers that fire on every small change, or when flows are accidentally saved multiple times creating duplicates.
The Fix:
The Problem: Your carefully crafted HTML email template displays as plain text or looks broken.
Why it happens: The email action might not be set to HTML format, or there are syntax errors in your HTML.
The Fix:
The Problem: Your approval workflow stops working and doesn't complete after someone approves or rejects.
Why it happens: The "Start and wait for an approval" action has a 30-day timeout, or the approver's email changed, or there are permission issues.
The Fix:
Pro tip: Always test your flows with realistic data in a development environment before deploying to production. Create a test SharePoint list with the same structure and run through various scenarios.
You've now learned how to build sophisticated email automation systems using Power Automate. Let's recap the key concepts that will serve as the foundation for more advanced automation work:
Trigger patterns: You understand how event-based triggers (like SharePoint item creation) and time-based triggers (like scheduled recurrence) form the backbone of different automation scenarios. Event-based triggers handle real-time notifications, while scheduled triggers power regular reporting.
Dynamic content and expressions: You can now pull data from your triggers and data sources into email templates, format that data appropriately, and use expressions to calculate values and handle conditional logic. This skill translates directly to other Power Automate actions beyond email.
Conditional logic: The ability to create different email paths based on data conditions (like priority levels or approval outcomes) allows you to build intelligent, context-aware automations that respond appropriately to different business scenarios.
HTML email formatting: Professional-looking automated emails build trust and engagement with your recipients. The HTML skills you've learned here apply to any communication automation you build.
Error handling and testing: Understanding how to troubleshoot common issues and test your flows thoroughly ensures your automations work reliably in production environments.
These fundamentals prepare you for much more sophisticated automation scenarios. Here are three specific areas to explore next:
Power Automate with Microsoft Teams integration would be a natural next step. You can extend your email notifications to also post messages in Teams channels, create adaptive cards for rich interactions, and build approval flows directly in Teams. This is particularly valuable as many organizations use Teams as their primary collaboration platform.
Advanced data manipulation and API integrations will let you build automations that work with external systems beyond Microsoft 365. You'll learn to work with REST APIs, transform data between different formats, and create automations that span multiple business systems. This opens up possibilities for integrating CRM systems, databases, and third-party services.
Power Apps integration with Power Automate allows you to create custom applications that trigger your automated workflows. Instead of relying on SharePoint lists for data entry, you can build purpose-built mobile and web apps that capture exactly the information you need and immediately trigger your email automations. This combination creates powerful business solutions that feel professional and are tailored to your specific processes.
The email automation skills you've developed here form the communication layer that makes all these advanced scenarios valuable to end users. Every sophisticated business process ultimately needs to keep people informed, and you now have the tools to do that effectively and automatically.
Learning Path: Flow Automation Basics