Learn how to build a complete end-to-end approval workflow that captures Microsoft Forms submissions, routes them to a manager for a decision, and automatically emails the requester the outcome. No code required — just a practical, reusable pattern you can adapt for time-off requests, expense approvals, IT access, and more.

Imagine you manage a small team, and every time someone needs to request time off, they fire off a Slack message, a text, an email, or simply catch you in the hallway. Some requests get missed. Others get approved verbally but never recorded. By Friday, nobody's entirely sure who's supposed to be working next week.
This is a classic problem that Microsoft Forms and Power Automate solve together elegantly. The employee fills out a tidy online form, the submission automatically lands in front of their manager for a yes/no decision, and the employee gets an email the moment that decision is made — all without you writing a single line of code or manually forwarding anything. The whole chain runs itself.
By the end of this lesson, you'll have built a working, end-to-end approval flow from scratch. You'll understand not just the steps, but why each piece exists and how they talk to each other. This exact pattern — form submission triggers approval triggers notification — is reusable for expense requests, IT access requests, event registrations, vendor onboarding, and dozens of other real-world scenarios.
What you'll learn:
Before you dive in, make sure you have:
You do not need any coding experience. Everything here is point-and-click.
Before you can automate anything, you need something to automate. Let's create the form that employees will use to submit their time-off requests.
Navigate to forms.microsoft.com and sign in with your Microsoft 365 account. Click New Form in the upper-left corner. Give your form a descriptive title — something like "Time-Off Request Form" — and add a brief description so respondents know what they're filling in.
Now add your questions. Click Add new to insert each one. Here's the question set we'll build around:
Tip
Keep your question labels short and unambiguous. Power Automate will display these exact labels when you're building your flow, so a question called "Your Email Address" is far easier to work with than "Please enter your personal contact information (work email preferred)."
Once your questions are in place, click the Preview button in the top-right to verify the form looks right on both desktop and mobile. When you're satisfied, copy the form link from the Share button — you can send it to your team when you're ready to go live.
Before we start clicking through the flow designer, it's worth understanding the plumbing underneath.
Microsoft Forms stores each submitted response in its own internal database. Power Automate connects to that database using a connector — a pre-built integration that knows how to speak Forms' language. The connector exposes two key actions:
This two-step pattern — trigger hands you an ID, then you explicitly fetch the details — is a common pattern in Power Automate. Understanding it prevents a lot of confusion when you first try to access form data and find you're only holding an abstract identifier.
Note
If you want a deeper look at the full range of connectors and how authentication works across different services, Understanding Power Automate Connectors: How to Browse, Connect, and Authenticate with Microsoft and Third-Party Services is a great companion read.
Go to flow.microsoft.com and sign in. In the left navigation, click My flows, then click New flow in the top-left and select Automated cloud flow from the dropdown. This is the flow type that runs automatically when an event occurs — in our case, a form submission.
In the dialog that appears, give your flow a name. Something like "Time-Off Request → Approval → Notification" works well. In the search box under "Choose your flow's trigger," type Microsoft Forms. Select When a new response is submitted from the results. Click Create.
The flow designer opens with your trigger card already in place. Click the trigger card to expand it. You'll see a dropdown labeled Form Id. Click it, and Power Automate will fetch a list of all the forms associated with your account. Select Time-Off Request Form from the list.
That's your trigger configured. Every time someone submits this form, this flow will start running.
Your trigger fires and hands the flow a response ID. Now you need to exchange that ID for the actual form content.
Click New step below the trigger. In the action search box, type Microsoft Forms again. This time, select Get response details.
You'll see two fields:
Warning
A common beginner mistake is selecting the wrong item from dynamic content here. Make sure you're picking the Response Id from the trigger output — not any manually typed text. If you type a static ID, the flow will always try to retrieve the same response rather than the one that was just submitted.
Your flow now has two steps: trigger + get response details. The output of "Get response details" contains all the form fields — the submitter's name, their email, dates, leave type, and notes — available as dynamic content tokens in every subsequent step.
Here's where the real magic happens. Power Automate includes a built-in Approvals connector that handles the entire approval lifecycle: creating the approval task, notifying the approver, waiting for their response, and returning the outcome to your flow.
Click New step. Search for Approvals and select Start and wait for an approval. This is an important action — the word "wait" means the flow will literally pause at this step until the approver takes action. The flow isn't polling; it's suspended in a holding state, consuming no resources, until a human responds.
Configure the approval action with these fields:
Approval type: Select Approve/Reject - First to respond. This means the first approver to click a button resolves the request. (If you need multiple approvers or sequential sign-offs, Designing Multi-Stage Approval Chains in Power Automate: Sequential, Parallel, and Delegated Sign-Off Patterns covers those patterns.)
Title: This is the subject line the approver sees in their approval notification. Make it informative:
Time-Off Request: [Responders' Name] – [Start Date] to [End Date]
Use the Dynamic Content panel to insert the actual values from "Get response details" into this string. The result might read: Time-Off Request: Sarah Chen – 2025-07-14 to 2025-07-18
Assigned to: Enter the email address of the manager who should approve requests. For now, you can hardcode a specific email. Later, you could make this dynamic — routing to different managers based on department — but hardcoding is the right starting point.
Details: This is the message body the approver reads. Build it out with the form data:
A new time-off request has been submitted. Please review the details below and approve or reject.
Requester: [Responders' Name]
Email: [Your Email Address]
Leave Type: [Type of Leave]
Start Date: [Start Date of Leave]
End Date: [End Date of Leave]
Notes: [Reason / Additional Notes]
Replace each bracketed item with the corresponding dynamic content token from your "Get response details" step.
Item link (optional): You can leave this blank or link to a SharePoint list where you're storing requests — we'll keep it blank for this lesson.
Tip
The approver receives this request in three places simultaneously: an email to their inbox, a notification in the Power Automate approvals center (flow.microsoft.com/approvals), and a notification in the Microsoft Teams Approvals app if they have Teams installed. They only need to respond in one place — it syncs everywhere.
Once the approver responds, your flow resumes. Now you need to do different things depending on whether they approved or rejected the request. This is where a Condition control comes in.
Click New step, search for Control, and select Condition. A condition evaluates a true/false statement and routes the flow down one of two branches: If yes and If no.
In the condition's first field, click in the value box and select Outcome from the Dynamic Content panel — this is the output from your "Start and wait for an approval" step. Set the comparison to is equal to, and in the right value field, type Approve (with a capital A, exactly as Power Automate returns it).
You now have two branches:
Working with Conditions, Loops, and Variables in Power Automate goes deep on how conditions work if you want to build more complex branching logic later.
Inside each branch, you'll add an email action to notify the requester of the outcome. This is the step that closes the loop and makes the whole automation feel professional.
In the "If yes" branch (Approved):
Click Add an action inside the Yes branch. Search for Outlook and select Send an email (V2). Configure it like this:
Your Time-Off Request Has Been Approved ✓Hi [Responders' Name],
Great news! Your time-off request has been approved.
Leave Type: [Type of Leave]
Start Date: [Start Date of Leave]
End Date: [End Date of Leave]
Please ensure your team is aware of your absence and update your calendar accordingly.
If you have any questions, reply to this email or contact your manager directly.
Best regards,
HR Automation
In the "If no" branch (Rejected):
Add another Send an email (V2) action. Configure it like this:
Update on Your Time-Off RequestHi [Responders' Name],
Thank you for submitting your time-off request. Unfortunately, your request has been reviewed and was not approved at this time.
Leave Type: [Type of Leave]
Start Date: [Start Date of Leave]
End Date: [End Date of Leave]
Approver Comments: [Approver Response Comments]
Please speak with your manager to discuss alternative dates or arrangements.
Best regards,
HR Automation
Notice that in the rejection branch, we've added Approver Response Comments — this is a dynamic content token from the approval step that contains any notes the approver typed when they rejected the request. Including this gives the employee actionable feedback rather than a cold rejection.
Key insight
The reason we send email from the flow's account (your Microsoft 365 account) rather than the approver's is simply because the flow runs under your credentials. If you want the email to appear to come from HR or a shared mailbox, you can use the "Send an email from a shared mailbox" action instead, provided you have Send As permissions on that mailbox.
Click Save in the top-right corner. Power Automate will validate your flow and display any errors in red. Fix any flagged issues before testing.
To test, click Test in the top-right, then select Manually and click Test. The designer will now watch your form for a live submission. Open your Microsoft Form in a new browser tab and submit a test response — use your own name and email address so you receive both the approval request and the outcome notification.
Switch back to the flow designer. You should see the flow progress in real time, with each step showing a green checkmark as it completes. Watch it pause at the "Start and wait for an approval" step — that's the flow waiting for you to act as the approver.
Check your email inbox (or the approvals center at flow.microsoft.com/approvals). You'll see the approval request with the details you built. Click Approve, optionally add a comment, and submit your response. Return to the flow designer — it will resume, complete the condition evaluation, and send the outcome email.
Check your inbox one more time. The approval notification email should arrive within seconds.
Tip
Always test with your own email address first so you can see exactly what every party in the process receives. The approval email, the approver request email, and any edge cases all look different — testing as yourself lets you catch awkward wording or missing data tokens before real users encounter them.
Now that you've built the basic time-off request flow, extend it with these two additions to reinforce what you've learned:
Exercise 1: Add a "Cancelled" fallback
What happens if the approver never responds? By default, the flow waits indefinitely. Modify the approval action to include a timeout. In the "Start and wait for an approval" action, click Show advanced options and set the Wait limit to P3D (3 days in ISO 8601 duration format). Then add a parallel branch that fires if the approval expires and sends the requester an email explaining that their request is pending manager review and they should follow up directly.
Exercise 2: Log every request to a SharePoint list
Before the approval step, add a "Create item" action using the SharePoint connector. Create a SharePoint list called "Leave Requests" with columns matching your form fields (Name, Email, Leave Type, Start Date, End Date). After the approval resolves, use an "Update item" action to write the outcome (Approved/Rejected) and approver comments back to the same list row. This gives you a permanent audit trail. Power Automate with SharePoint: Automate Document Approvals walks through the SharePoint connector in detail.
"The flow runs but the response details are empty." This almost always means you forgot the "Get response details" step and are trying to use dynamic content directly from the trigger, which only contains the response ID. Add the Get response details action and make sure its Response Id field is mapped to the trigger's output token.
"The approval email goes to me, not the manager." Check the Assigned to field in your approval action. It's easy to accidentally leave it pointing to your own email from an earlier test. Update it to the manager's actual email address and re-save.
"The condition always takes the 'No' branch even when I approved."
The Outcome token returns exactly the string Approve or Reject — capital first letter, no extra characters. If you typed approved or Approved (with a trailing space) in your condition comparison, it will never match. Double-check your comparison value.
"My flow is triggering multiple times for the same response." This is a known quirk with the Forms polling trigger. If the trigger checks for new responses while a previous run is still in-progress, it can occasionally fire twice. The practical fix is to log responses to SharePoint (as in Exercise 2) and add a condition at the start of the flow that checks whether this response ID already has a record — if it does, terminate early. This is a lightweight idempotency check.
"The requester's email is coming from my personal account, which looks unprofessional."
Use the Send an email from a shared mailbox action instead of the standard "Send an email (V2)", and point it at a shared mailbox like hr-noreply@yourcompany.com. You'll need Send As or Send on Behalf permissions granted by your IT admin first.
Warning
Never put real employee personal data (SSNs, medical details, home addresses) in a Microsoft Forms form without first confirming with your organization's data governance team that this storage and processing is compliant with your applicable privacy regulations. For sensitive HR workflows, your IT department may require data to route through approved systems rather than consumer-tier Forms storage.
You've just built a complete, three-stage automation: a form captures structured input, an approval action routes the request to a decision-maker and waits for their response, and conditional branches send personalized outcome emails to the requester. This is a genuinely useful, production-ready pattern — not a toy example.
The key concepts to take away:
From here, there are several natural directions to grow this flow:
The pattern you've built today is the backbone of dozens of business processes. Every time a human decision needs to sit between a data collection event and an action, this structure applies. Keep extending it.