How to Build a SharePoint Approval Workflow with Power Automate

Configure the approval action, handle approve and reject responses, notify requesters automatically, and keep your SharePoint list status in sync — step by step.

SharePoint approval workflows are one of the most requested Power Automate builds — and one of the most commonly built incorrectly. Developers skip the status column, forget the rejection branch, or build flows that break when the approver is out of office. This guide builds a complete, production-ready SharePoint document approval workflow from scratch, covering every step from list setup through edge-case handling.

What We're Building

A Power Automate cloud flow that triggers when a document is submitted to a SharePoint library, sends the configured approver a structured approval request in Microsoft Teams and email, waits for a response, and then:

  • If approved: updates the document's Status column to "Approved", moves the file to an Approved folder, and notifies the submitter
  • If rejected: updates Status to "Rejected", adds the approver's comments to a Comments column, and sends the submitter a rejection notification with the reason

Step 1: Prepare Your SharePoint Library

Before building the flow, configure the SharePoint document library with the columns the flow will read and write. Without these columns, the flow cannot track state or surface approver comments.

Required columns

Column nameTypeValues / notes
Approval StatusChoicePending Review, Approved, Rejected, Recall — default to "Pending Review"
ApproverPerson or GroupSingle selection; allow only people, not groups
Approver CommentsMultiple lines of textFlow writes rejection reason here
Submitted ByPerson or GroupAuto-populated; flow reads this to send notifications
Submitted DateDate and TimeSet to Today by default; used in the approval request card

Tip: Set the Approver column as Required in the library settings. This forces submitters to select an approver before uploading, preventing the flow from failing due to a null approver field.

Step 2: Create the Power Automate Flow

Go to make.powerautomate.com, select Create > Automated cloud flow, and search for the trigger "When a file is created or modified (properties only)". This trigger fires whenever a file's metadata changes in the library — which means it fires when the Approval Status is set to "Pending Review" on upload.

Trigger choice matters: Use "When a file is created or modified (properties only)" rather than "When a file is created in a folder." The properties-only version is lighter weight (transfers only metadata, not file content) and fires reliably on both new uploads and column updates. The alternative triggers can double-fire or miss events.

Add a condition to filter trigger fires

Because the trigger fires on any property change — including when the flow itself updates the Status column to "Approved" or "Rejected" — you must add a condition immediately after the trigger to stop infinite loops:

Condition: triggerOutputs()?['body/ApprovalStatus/Value'] is equal to 'Pending Review' // Only continue when the document is in the Pending Review state // This prevents the flow re-triggering when it updates Status to Approved/Rejected

Set the No branch of this condition to "Terminate" (action: Terminate, Status: Succeeded). Only the Yes branch continues to the approval logic.

📄 Overview of approvals in Power Automate — learn.microsoft.com

Step 3: Configure the Approval Action

In the Yes branch, add the action "Start and wait for an approval" from the Approvals connector. This is a blocking action — the flow pauses here until the approver responds (or the timeout expires).

Approval action settings

FieldValue / expression
Approval typeApprove/Reject — First to respond
TitleDocument Approval Required: @{triggerOutputs()?['body/{FilenameWithExtension}']}
Assigned to@{triggerOutputs()?['body/Approver/Email']}
DetailsDocument name, submitted by, submission date, library link
Item link@{triggerOutputs()?['body/{Link}']} — direct link to the file
Item link descriptionView document

The approver receives this request in their Approvals app in Microsoft Teams (and email). They can approve or reject with comments directly from Teams without opening any other system.

📄 Create and test an approval workflow — learn.microsoft.com

Step 4: Handle the Approval Response

After the approval action completes, add a Condition to branch on the outcome:

Condition: outputs('Start_and_wait_for_an_approval')?['body/outcome'] is equal to 'Approve'

Yes branch — Approved path

  • 1
    Update file properties

    Action: "Update file properties" (SharePoint) — set Approval Status = "Approved"

  • 2
    Move file to Approved folder

    Action: "Copy file" to /Approved subfolder, then "Delete file" from root — or use "Move file" if your connector version supports it

  • 3
    Notify the submitter

    Action: "Post a message in a chat" (Teams) — send a direct message to the Submitted By user: "Your document [name] has been approved by [approver name]."

No branch — Rejected path

  • 1
    Update file properties

    Action: "Update file properties" — set Approval Status = "Rejected"; set Approver Comments = @{outputs('Start_and_wait_for_an_approval')?['body/responses'][0]['comments']}

  • 2
    Notify the submitter with reason

    Action: "Post a message in a chat" (Teams) — include the rejection comments so the submitter knows exactly what to change: "Your document [name] was not approved. Comments: [comments]"

📄 Create custom approval response options — learn.microsoft.com

Step 5: Set a Timeout for Stale Approvals

The "Start and wait for an approval" action will wait indefinitely by default. In production, this creates flows that are stuck for weeks because an approver went on holiday or ignored the request. Set a timeout to prevent this.

In the approval action's settings, enable "Set a timeout" and use ISO 8601 duration format:

  • P3D — 3 days (good for most document approvals)
  • P7D — 7 days (for lower-priority reviews)
  • PT4H — 4 hours (for urgent time-sensitive approvals)

In the timeout branch, update the Status to "Escalated" and notify the submitter and the approver's manager that the approval is overdue. This keeps the process moving without manual chasing.

Common Mistakes to Avoid

  • No infinite-loop guard: Without the initial "Approval Status = Pending Review" condition, the flow triggers itself every time it updates the status column — burning API call quota and creating duplicate approval requests
  • Using the approver's display name instead of email: The "Assigned to" field in the approval action requires an email address — not a display name. Use the /Email property from the Person column
  • Not handling null approver: If the Approver column is empty when the trigger fires, the approval action fails with a cryptic error. Add a null check condition before the approval and terminate gracefully with a notification to the submitter
  • No rejection comments captured: Approvers can add comments when rejecting, but the flow must explicitly read responses[0]['comments'] to retrieve them — it is not automatically written anywhere
  • Flow owned by one person: When the flow owner leaves, connections break. Use a shared service account or ensure co-ownership is set

Testing Your Approval Workflow

Before enabling for all users, test the complete flow end-to-end:

  1. Upload a test document to the library with Approval Status = "Pending Review" and an approver set to your own account
  2. Verify the approval request arrives in Teams (Approvals app) and email within 60 seconds
  3. Approve the request and confirm the Status column updates to "Approved" in SharePoint
  4. Upload another test document and reject it — verify the comments are written to the Approver Comments column and the notification message includes the rejection reason
  5. Test the timeout: temporarily set the timeout to PT5M (5 minutes) and verify the escalation path fires correctly

Need a custom SharePoint approval workflow?

OceanCloud builds production-ready SharePoint approval workflows with multi-approver support, delegation, escalation, and Power BI reporting on approval cycle times — typically delivered in 1–2 weeks.

Get a Free Workflow Review