Overview
What You're Building
A fully working approval system โ no code, no developer dependency. Users chat with a bot, a flow routes their request to the right approver, and everyone gets an email.
๐ค User
Chats with bot
Chats with bot
โ
๐ค Copilot Studio
Collects details
Collects details
โ
โก Power Automate
Routes + approves
Routes + approves
โ
โ
Approvals
Email: Approve/Reject
Email: Approve/Reject
โ
๐ SharePoint
Audit log
Audit log
๐
What the bot collects
These are the 5 variables Copilot Studio asks for
โพ
| Variable | Type | Bot question |
|---|---|---|
| RequestType | Choice | What type of request is this? |
| RequestTitle | String | Give your request a short title |
| Description | String | Describe your request in detail |
| RequesterName | String | What's your full name? |
| RequesterEmail | String | What's your email address? |
โก
What the flow does
Step-by-step inside Power Automate
โพ
- 1Triggered by HTTP POST from Copilot Studio
- 2Parses the JSON body to extract variables
- 3Switch on
RequestTypeโ sets the right approver email - 4Logs the request to a SharePoint list
- 5Start and wait for an approval โ sends adaptive card email to approver
- 6Condition: if Approved โ send approval email to requester, else send rejection email
- 7Updates SharePoint item with outcome and approver comments
โฑ
45-Minute Plan
How to pace this build live
โพ
- 5Problem + Architecture โ slides only
- 5Show completed system โ quick demo of the end state so they know where they're headed
- 20Build Power Automate flow โ live, with audience following along
- 10Build Copilot Studio bot โ connect to the flow
- 5Test + Q&A โ run it end to end
๐ก Pro tip Have a pre-built fallback environment ready. If live build hits an issue, switch to the complete version and explain what you'd have built.
Step 1
Create the SharePoint List
This is your audit log โ every request and outcome gets stored here automatically. Takes about 5 minutes to set up.
๐
Create the list
In any SharePoint site you have access to
โพ
- 1Go to your SharePoint site โ click + New โ List
- 2Choose Blank list
- 3Name it exactly:
Approval Requests - 4Click Create
๐
Add these columns
In the list, go to + Add column for each one below
โพ
Note: The
Title column already exists by default โ rename it to RequestTitle. All others you add manually.| Column Name | Type | Notes |
|---|---|---|
| RequestTitle | Single line of text | Rename the default Title column |
| RequestType | Single line of text | IT, HR, Finance, Procurement, Other |
| RequesterName | Single line of text | |
| RequesterEmail | Single line of text | |
| Description | Multiple lines of text | Plain text, not rich text |
| ApproverEmail | Single line of text | Set by the flow's Switch logic |
| Status | Single line of text | Pending / Approved / Rejected |
| ApproverComments | Multiple lines of text | From the approver's response |
| RequestDate | Date and Time |
๐ก Demo tip Pre-populate 1โ2 rows so the list doesn't look empty when you switch to the SharePoint tab during demo.
โ
Setup checklist
Tick these off before moving on
โพ
SharePoint list "Approval Requests" created
All 9 columns added with correct types
Copied the full SharePoint site URL (you'll need it in the flow)
Step 2 โ Power Automate
Create the Flow
Build this inside a Solution so it can be deployed across environments. Takes about 5 minutes to scaffold.
๐
Create a Solution first
Always build inside a Solution โ it's how you deploy properly
โพ
- 1Go to make.powerautomate.com
- 2Click Solutions in the left nav
- 3Click + New solution
- 4Name:
ApprovalSystemโ Publisher: your name โ click Create - 5Open the solution โ click + New โ Automation โ Cloud flow โ Instant
โ ๏ธ Important: Name the flow
ApprovalRequestFlow. Do NOT choose "Automated" โ choose "Instant" so you can use HTTP trigger.๐
Set the trigger: When an HTTP request is received
Paste this JSON schema to auto-detect all your variables
โพ
- 1In the flow designer, change the trigger to When an HTTP request is received
- 2Click Use sample payload to generate schema
- 3Paste the JSON below โ click Done
- 4Save the flow โ the HTTP POST URL will appear. Copy it โ you'll need it in Copilot Studio.
{
"RequestType": "IT Request",
"RequestTitle": "Laptop replacement",
"Description": "My laptop screen is broken",
"RequesterName": "John Doe",
"RequesterEmail": "john@company.com"
}
๐
Add 2 Initialize Variable actions
These hold the approver's details โ set inside the Switch
โพ
- 1Click + New step โ search Initialize Variable
- 2Name:
varApproverEmailโ Type: String โ Value: leave blank - 3Add another Initialize Variable:
varApproverNameโ Type: String
Why at the top? Variables must be initialized before the Switch. Inside each Switch case you'll use Set Variable (not Initialize) to assign values.
Step 3 โ Power Automate
Build the Approval Logic
This is the core of the flow โ Switch routing, Approvals connector, and outcome emails. This is where the magic happens.
๐
Add a Switch action
Routes to the right approver based on RequestType
โพ
- 1Click + New step โ search Switch (Control)
- 2In the On field โ click the dynamic content icon โ select
RequestTypefrom the HTTP body - 3Click + Add Case for each request type below
// Case: "IT Request" varApproverEmail = "it-approver@company.com" varApproverName = "IT Manager" // Case: "HR Request" varApproverEmail = "hr-approver@company.com" varApproverName = "HR Manager" // Case: "Finance Request" varApproverEmail = "finance-approver@company.com" varApproverName = "Finance Manager" // Case: "Procurement" varApproverEmail = "procurement@company.com" varApproverName = "Procurement Lead" // Default (catch-all) varApproverEmail = "admin@company.com" varApproverName = "Admin"
๐ก For the demo Use your own email for all approver values so you can approve/reject in real time during the workshop.
๐
Log to SharePoint
Create an item in your Approval Requests list
โพ
- 1After the Switch, add Create item (SharePoint)
- 2Site: select your SharePoint site โ List:
Approval Requests - 3Map fields using dynamic content from the HTTP body + variables:
| Column | Value (dynamic content) |
|---|---|
| RequestTitle | RequestTitle from body |
| RequestType | RequestType from body |
| RequesterName | RequesterName from body |
| RequesterEmail | RequesterEmail from body |
| Description | Description from body |
| ApproverEmail | varApproverEmail |
| Status | Type: Pending (hardcoded) |
| RequestDate | utcNow() |
โ
Start and wait for an approval
This is the Approvals connector โ sends an email with Approve/Reject buttons
โพ
- 1Add Start and wait for an approval (Approvals connector)
- 2Approval type: Approve/Reject โ First to respond
- 3Title:
Approval Request:+RequestTitle - 4Assigned to:
varApproverEmail
// Paste into the Details field: You have a new approval request. Type: @{triggerBody()?['RequestType']} Title: @{triggerBody()?['RequestTitle']} Requested by: @{triggerBody()?['RequesterName']} Description: @{triggerBody()?['Description']} Please approve or reject using the buttons below.
๐ง
Add outcome emails + update SharePoint
Condition on the approval outcome
โพ
- 1Add a Condition action after the approval step
- 2Left value:
Outcome(from Approvals) โ Operator: is equal to โ Right value:Approve - 3If Yes branch: Send email to
RequesterEmailโ Subject:โ Your request has been approved - 4If No branch: Send email to
RequesterEmailโ Subject:โ Your request was not approved - 5In both branches also add Update item (SharePoint) โ update
StatusandApproverComments
Hi @{triggerBody()?['RequesterName']},
Your request "@{triggerBody()?['RequestTitle']}" has been approved.
Approver comments: @{body('Start_and_wait_for_an_approval')?['responses'][0]?['comments']}
Thanks,
Approval System
โ ๏ธ Update item note: To get the SharePoint item ID for the Update item action, store the output of your Create item step. Use
ID from the Create item dynamic content.Step 4 โ Copilot Studio
Build the Bot
This is what the user talks to. It asks 5 questions, stores the answers, then fires the Power Automate flow you just built.
๐ค
Create the Copilot
Set up a new agent in Copilot Studio
โพ
- 1Go to copilotstudio.microsoft.com
- 2Click + Create โ New agent
- 3Name:
Approval Request Bot - 4Description:
Helps employees submit approval requests - 5Skip the AI instructions for now โ click Create
๐ฌ
Create the topic
This is the conversation flow that collects user details
โพ
- 1In your agent, click Topics โ + Add topic โ From blank
- 2Name the topic:
Submit Approval Request - 3Add trigger phrases (at least 5):
submit a request I need approval raise a request request approval I want to submit something help me with an approval
โ
Add the 5 question nodes
Each question stores the answer in a variable
โพ
How to add a question: In the topic canvas, click + โ Ask a question. Set the question text and the variable name below it.
| # | Question text | Input type | Variable name |
|---|---|---|---|
| 1 | What type of request is this? | Multiple choice IT Request, HR Request, Finance Request, Procurement, Other |
RequestType |
| 2 | Give your request a short title or subject | User's entire response | RequestTitle |
| 3 | Please describe your request in detail | User's entire response | Description |
| 4 | What is your full name? | User's entire response | RequesterName |
| 5 | What is your email address? (You'll receive a notification with the outcome) | User's entire response | RequesterEmail |
โก
Call the Power Automate flow
Connect the bot to the flow you built
โพ
- 1After the 5th question, click + โ Call an action โ Create a flow โ this opens Power Automate
- 2OR if your flow already exists: Call an action โ Power Automate flows โ select
ApprovalRequestFlow - 3Map each input:
| Flow input | Bot variable |
|---|---|
| RequestType | Topic.RequestType |
| RequestTitle | Topic.RequestTitle |
| Description | Topic.Description |
| RequesterName | Topic.RequesterName |
| RequesterEmail | Topic.RequesterEmail |
โ ๏ธ Important: For the Power Automate connector in Copilot Studio to work, the flow must use the Copilot Studio โ Run a flow from Copilot trigger, not the HTTP trigger. You may need a second version of the flow with this trigger for the bot integration. The HTTP trigger version is still used for direct testing.
๐ฌ
Add confirmation message
Tell the user their request was submitted
โพ
- 1After the flow call, add a Message node
- 2Paste this message:
โ Your request has been submitted successfully! Summary: โข Type: {Topic.RequestType} โข Title: {Topic.RequestTitle} โข Submitted by: {Topic.RequesterName} Your approver has been notified. You'll receive an email at {Topic.RequesterEmail} once a decision is made. Thank you!
Step 5 โ Final
Test End-to-End
Run the full system. If anything breaks, use the troubleshooting checklist below.
๐งช
Test the flow first
Use the built-in test panel before connecting the bot
โพ
- 1In Power Automate, open
ApprovalRequestFlowโ click Test (top right) โ Manually - 2Paste this test payload:
{
"RequestType": "IT Request",
"RequestTitle": "Test: Laptop replacement",
"Description": "Testing the approval system",
"RequesterName": "Mayowa Ogbeide",
"RequesterEmail": "your-email@here.com"
}
- 3Check your inbox โ you should receive an approval email with Approve/Reject buttons
- 4Click Approve โ check that the requester email arrives and SharePoint updates
๐ค
Test the bot
Use the Copilot Studio test panel
โพ
- 1In Copilot Studio, open your agent โ click Test (top right)
- 2Type:
I need approval - 3Answer all 5 questions the bot asks
- 4Confirm the confirmation message appears
- 5Check your inbox for the approval request email
๐ง
Troubleshooting
Most common issues and how to fix them
โพ
- !Flow not triggering from bot: Make sure you're using the Run a flow from Copilot trigger in the flow, not HTTP trigger. Create a separate flow copy for the bot.
- !SharePoint "item not found" on update: Make sure you're using the
IDoutput from Create item โ not a hardcoded value. - !Approval email not arriving: Check the Approvals connector is authenticated under your own account. Go to Flow โ Connections.
- !Switch not matching: Ensure the Case values match exactly what the bot sends โ same capitalisation, same spacing. "IT Request" โ "it request".
- !400 error on HTTP trigger: Double-check the JSON body matches the schema. Never use hardcoded IDs or UUIDs in the flow body.
๐
Final pre-demo checklist
Run through this the morning of AgentCamp
โพ
Flow test run passes end-to-end (approval email received + SP updated)
Bot test run works in Copilot Studio test panel
Your email is the approver for all Switch cases (so you can demo approving live)
SharePoint list has 1โ2 pre-existing rows for visual effect
Fallback environment (pre-built complete system) is ready and tested
Slides deck open, speaker card has your photo
Browser tabs pre-opened: PA, Copilot Studio, SharePoint, Inbox
๐ฏ You're ready. You're presenting a real production pattern โ Switch-based routing, Approvals connector, audit logging โ the same architecture you've used on actual client projects. Own it.