Power Automate Building Your First Automated Workflow
Knowing what triggers and actions are is one thing. Building a working workflow end-to-end — with real connectors, real data, error handling, and a test you can see run — is another. This topic walks through building three complete automated workflows that cover scenarios every organization faces: a form-to-email notification, an approval workflow, and a scheduled report. Each one introduces new techniques that you carry forward to more complex flows.
Workflow 1: Form Submission to Teams Notification
The scenario: your team uses Microsoft Forms to collect customer feedback. Every time a new response arrives, you want a Teams notification sent to a manager so they can act on critical feedback immediately. Today, the manager checks Forms manually — sometimes days later. This flow makes it instant.
Step 1: Create the Flow
Go to make.powerautomate.com. Click Create in the left sidebar. Click Automated cloud flow. Name the flow "Customer Feedback Alert." Search for trigger type and select "When a new response is submitted" (Microsoft Forms). Click Create.
Step 2: Configure the Trigger
The trigger step opens. In the Form Id dropdown, select your Microsoft Form (in this case, the Customer Feedback Form). Power Automate now watches this form — the moment a new response arrives, the flow starts.
Step 3: Get the Response Details
The Forms trigger gives you the Response Id but not the actual answers. You need a second step to retrieve the answers. Click the plus button below the trigger and choose Add an action. Search for "Get response details" (Microsoft Forms). Set Form Id to the same form. Set Response Id to the dynamic content from the trigger — click the Response Id item from the Dynamic Content panel.
WHY TWO STEPS FOR FORMS?
Trigger: "New response submitted"
└── Only gives: Response ID (a reference number)
Action: "Get response details"
└── Gives: All the actual answers
├── Name: "Priya Sharma"
├── Rating: "2 out of 5"
└── Comments: "Delivery was very late"
This two-step pattern is specific to Microsoft Forms — by design.
Step 4: Add a Teams Message
Click the plus button and add an action. Search for "Post message in a chat or channel" (Microsoft Teams). Set Post as to "Flow bot." Set Post in to "Channel." Select your team and channel (for example, Customer-Service → Alerts). In the Message field, type your notification and insert dynamic content from the "Get response details" step:
Teams Message Content: 🔔 New Customer Feedback Received Name: [Responders' Email] — (dynamic content) Rating: [Rating question answer] — (dynamic content) Comments: [Comments question answer] — (dynamic content) Submitted: [Submission time] — (dynamic content, formatted)
Step 5: Add a Condition for Critical Feedback
You only want to alert the manager for low ratings (1 or 2 out of 5). Click the plus button and add a Condition control (found under Control in the action list). Set: Rating answer is less than or equal to 3. The condition creates two branches: If yes (critical feedback) and If no (positive feedback).
CONDITION FLOW STRUCTURE
┌──────────────────────────────┐
│ Condition: Rating <= 3? │
└──────────┬───────────────────┘
│
┌─────────┴─────────┐
│ │
[YES branch] [NO branch]
Rating is low: Rating is fine:
┌───────────────┐ ┌────────────────┐
│ Send urgent │ │ No extra │
│ Teams message │ │ action needed │
│ to manager │ │ (leave empty) │
└───────────────┘ └────────────────┘
In the YES branch, add an action: "Post message in a chat or channel" — but this time set Post in to "Chat with a person" and target the Customer Service Manager directly with an urgent message. The NO branch stays empty (nothing extra happens for good ratings).
Step 6: Test the Flow
Save the flow. Click Test, then choose Manually. Submit a test response to your Microsoft Form with a low rating. Return to Power Automate — the flow should show as running. Within seconds, you see each step turn green as it completes. The Teams alert appears in the channel. The manager gets a direct chat message.
Workflow 2: Approval Workflow
The scenario: employees submit expense requests through a Power App that writes to a Dataverse table. Every submission needs their line manager's approval before it is processed. Currently, approvals happen via email with no tracking. This flow creates a formal, trackable approval process.
The Approval Action
Power Automate has a built-in "Start and wait for an approval" action — one of the most powerful tools in the platform. It sends an approval request to specified people, waits (hours, days, whatever it takes) for a response, and then continues the flow based on the decision.
APPROVAL FLOW STRUCTURE
TRIGGER: When a row is added in Dataverse
Table: Expense Requests
│
▼
ACTION: Get the manager of the submitter
Office 365 Users → Get manager (V2)
User (UPN): [Submitted By Email] from trigger
│
▼
ACTION: Start and wait for an approval
Approval type: Approve/Reject - First to respond
Title: "Expense Approval: [Expense Title] - ₹[Amount]"
Assigned to: [Manager Email] from previous step
Details: [full expense details as text]
Item link: [URL to the Power App or record]
│
▼
┌────┴─────┐
│ │
[Approved] [Rejected]
│ │
Update Dataverse Update Dataverse
Status = Approved Status = Rejected
│ │
Email employee: Email employee:
"Approved ✓" "Rejected - Reason: [Comments]"
Configuring the Approval Action
When you add the "Start and wait for an approval" action, these are the key fields. Approval Type: use "Approve/Reject – First to respond" when any one approver can decide, or "Approve/Reject – Everyone must approve" when all listed approvers must agree. Title: a brief summary the approver sees in their Approvals hub and in their email. Assigned To: the approver's email address — use dynamic content from the "Get manager" step. Details: the full context — what is being approved, the amount, the reason. Item link: a URL to the relevant record, Power App, or SharePoint item so the approver can investigate before deciding.
Where Approvers Respond
Approvers receive an email with Approve and Reject buttons they can click directly. They also receive a Teams notification with inline buttons. The Power Automate Approvals hub at make.powerautomate.com shows all pending and completed approvals. On mobile, the Power Automate app pushes a notification. Approvers never need to open the flow or the Power Platform portal — they respond wherever is most convenient.
APPROVER EXPERIENCE (email): From: Power Automate [no-reply@microsoft.com] Subject: Expense Approval: Conference Travel - ₹25,000 Priya Sharma has submitted an expense request requiring your approval. Title: Conference Travel to Bengaluru Amount: ₹25,000 Reason: Annual developer conference attendance Date: 4 June 2025 [Approve] [Reject] [View Details] You can also add comments before deciding.
Handling the Outcome
After the approval action completes, the flow continues based on the outcome. Add a Condition: Outcome equals Approve. In the YES branch, update the Dataverse record's Status to "Approved" and send a congratulatory email to the employee with the approval details and any comments the approver left. In the NO branch, update Status to "Rejected" and send an email explaining the rejection with the approver's comments (accessed via the dynamic content "Approver response comments").
Workflow 3: Scheduled Weekly Summary Email
The scenario: every Monday morning, the operations manager wants an email listing all open service requests from the past week, grouped by priority. Currently this requires manual SharePoint queries and copy-pasting into an email.
Building the Scheduled Flow
Create a new Scheduled cloud flow. Set Repeat every 1 week on Monday. Set Starting time to 08:00 AM in your time zone. The flow runs automatically every Monday at 8 AM from this point forward.
Querying Data and Building a Table
SCHEDULED WEEKLY SUMMARY FLOW
TRIGGER: Recurrence — Every Monday at 8:00 AM
│
▼
ACTION: List rows — Dataverse
Table: Service Requests
Filter rows: Status eq 'Open' and createdon ge @{addDays(utcNow(), -7)}
Order by: Priority asc, createdon desc
│
▼
ACTION: Create HTML table
From: [value array from List rows output]
Columns:
Header: "Request Title" Value: Title
Header: "Priority" Value: Priority
Header: "Submitted By" Value: CreatedBy
Header: "Created On" Value: createdon (formatted)
│
▼
ACTION: Send an email (V2) — Outlook
To: manager@company.com
Subject: Weekly Open Requests Summary — [formatted date]
Body:
Open Service Requests — Week of [date]
Total open requests: [length of list rows output]
[HTML table output from previous step]
Please review and prioritize as needed.
Is HTML: Yes
Using the Create HTML Table Action
The "Create HTML table" action converts an array of records into a formatted HTML table. You specify which fields from each record become columns. The output is an HTML string you paste directly into the email body (with Is HTML set to Yes). The manager receives a neat, styled table with all open requests — no manual work required.
Error Handling and Reliability
Production flows need to handle failures gracefully. When an action fails (a service is unavailable, a record cannot be found, a permission is denied), the flow stops by default. Good flows notify someone when this happens and either retry automatically or explain what went wrong.
Configure Run After Settings
Every action has "Run after" settings hidden behind the three-dot menu. By default, each action runs only after the previous action succeeds. You can change this to also run after failure, timeout, or skipped — allowing you to build error-handling branches.
ERROR HANDLING PATTERN
Normal flow:
Action 1 → (succeeds) → Action 2 → Action 3
With error handling:
Action 1
├── (succeeds) → Action 2 → Action 3
└── (fails) → Send error alert email to admin
→ Log failure details to a SharePoint list
→ (optional) Retry action 1
Retry Policy
Every action has a Retry Policy setting (click the three-dot menu on any action, then Settings). By default, Power Automate retries a failed action four times at 20-second intervals. For critical actions hitting external APIs that may have brief outages, increase retries to 8 and extend the interval to 60 seconds. For non-critical actions, disable retries to avoid duplicate records if the action partially succeeded.
Scope: Grouping Actions for Try-Catch Patterns
The Scope control groups multiple actions into a named block. Configure a "try" scope and a "catch" scope to mimic programming try-catch error handling. If any action inside the try scope fails, the catch scope runs. This keeps error handling clean and organized even in complex flows with dozens of steps.
Variables in Power Automate
Variables store values between steps in a flow. Unlike Power Apps variables (which reset when the app closes), flow variables exist only during one flow run.
VARIABLE TYPES AND USAGE Initialize variable (must be the first step that uses the variable): Name: TotalAmount Type: Integer (or Float, String, Boolean, Array, Object) Value: 0 Set variable (change its value in later steps): Name: TotalAmount Value: [previous value + current row amount] Increment variable (add a number to an integer variable): Name: Counter Value: 1 (adds 1 each time) Append to string variable (build a long string incrementally): Name: EmailBody Value: "• [Title] — Priority: [Priority]\n" Example use: Build a summary string inside an Apply to each loop, then use the full string in an email at the end.
Apply to Each: Processing Multiple Records
Many flows need to process each record in a list — send one email per item, create one row per result, or update every open record. The "Apply to each" control (found under Control) loops through every item in an array and performs the same set of actions for each one.
APPLY TO EACH EXAMPLE
TRIGGER: Recurrence — every day at 9 AM
│
▼
ACTION: List rows — Dataverse (get all tasks due today)
Filter: DueDate eq today() and Status ne 'Complete'
│
▼
CONTROL: Apply to each
Input: [value from List rows output] ← the array of tasks
│
├── For each task in the list:
│
│ ACTION: Send an email
│ To: [AssignedToEmail] ← current item's field
│ Subject: "Reminder: [Title] is due today!"
│ Body: "Please complete [Title] by end of day."
│
└── (repeat for next task)
Key Points
- Build automated flows step by step: trigger → get data → transform → act → handle outcome.
- Microsoft Forms needs two steps: "When a new response is submitted" (trigger) and "Get response details" (action) to access the actual answers.
- The "Start and wait for an approval" action handles the full approval lifecycle — sending, waiting, and returning the outcome — in a single flow step.
- Use Condition controls to branch flows based on dynamic data: approval outcome, rating value, status field, any yes/no decision.
- Scheduled flows use the Recurrence trigger and run automatically on your defined schedule — daily, weekly, monthly, or custom intervals.
- Use "Create HTML table" to convert a list of records into a formatted email table automatically.
- Configure Run After settings on critical actions to build error-handling branches. Use Scope to group try-catch patterns.
- Apply to each loops through every record in an array, performing the same actions for each item.
