---
title: "Power Automate: Streamline Invoice Approvals in Teams"
description: "Build a Power Automate flow that routes invoice approvals through Teams, stores documents in SharePoint, and preserves an audit trail."
canonical: "https://adamtheautomator.com/power-automate-invoice-approvals-teams/"
---

# Power Automate: Streamline Invoice Approvals in Teams

> Build a Power Automate flow that routes invoice approvals through Teams, stores documents in SharePoint, and preserves an audit trail.

Source: https://adamtheautomator.com/power-automate-invoice-approvals-teams/

---

ATA Learning

Tap to hide

[

ATA Learning

](/)

*   [Home](/)
*   [Tutorials](/tutorials/)
*   [Instructors](/author/)
*   [Advertising](/advertising/)
*   [Recommended Resources](/resources/)
*   [About Adam](/about-adam/)

Search for:  

*   [](https://twitter.com/adbertram)
*   [](https://github.com/Adam-the-Automator)
*   [](https://www.linkedin.com/company/adam-the-automator-llc)
*   [](/feed/)

![Power Automate: Streamline Invoice Approvals in Teams](https://adamtheautomator.com/wp-content/uploads/publisher/3ec5d9c85b2b812d96aaea8aa772a1e7/1406d20d337f1ef7937f468af2feb30f4a99e0ac228d4316500d0d14b5868bd7.png)

# Power Automate: Streamline Invoice Approvals in Teams

[![](https://secure.gravatar.com/avatar/d0b9d42e21e5622713f8b693aa5c0f9244d5f7dd200ed29b8398f52dee5de337?s=192&d=mm&r=g)Adam Bertram](https://adamtheautomator.com/author/adam-bertram/)16 October 20268 min. read

Categories: [Business Process Automation](/category/business-process-automation/)

Tags:[Automation](/tag/automation/)[Microsoft Teams](/tag/microsoft-teams/)[SharePoint](/tag/sharepoint/)[Power Automate](/tag/power-automate/)

Table of Contents

*   [Prerequisites for the Invoice Approval Flow](#prerequisites-for-the-invoice-approval-flow)
*   [Prepare SharePoint for Documents and Evidence](#prepare-sharepoint-for-documents-and-evidence)
*   [Separate Current State From Approval Events](#separate-current-state-from-approval-events)
*   [Capture New Invoice Attachments](#capture-new-invoice-attachments)
*   [Save Each Attachment and Its Metadata](#save-each-attachment-and-its-metadata)
*   [Route the Power Automate Invoice Approval Through Microsoft Teams](#route-the-power-automate-invoice-approval-through-microsoft-teams)
*   [Add Routing Without Hiding the Invoice](#add-routing-without-hiding-the-invoice)
*   [Record the Decision Finance Will Ask For](#record-the-decision-finance-will-ask-for)
*   [Handle an Approved Invoice](#handle-an-approved-invoice)
*   [Handle a Rejected Invoice](#handle-a-rejected-invoice)
*   [Test Approval, Rejection, and Failure Paths](#test-approval-rejection-and-failure-paths)
*   [Prove the Failure Path Deliberately](#prove-the-failure-path-deliberately)
*   [Put the Flow Into Service](#put-the-flow-into-service)

Not another invoice spreadsheet dressed up with a prettier notification. Your approval process needs an actionable [Microsoft Teams request](https://learn.microsoft.com/en-us/power-automate/get-started-approvals#assign-approvals-to-any-user-in-your-tenant), a recorded decision, and evidence finance can retrieve months later.

This build avoids that dead end. You will store invoices in [SharePoint](https://learn.microsoft.com/en-us/connectors/sharepointonline/), route approvals through Teams, preserve each response, and test the approval, rejection, and failure paths.

## Prerequisites for the Invoice Approval Flow

To follow along, you need:

*   A work account with [Power Automate approvals](https://learn.microsoft.com/en-us/connectors/approvals/), Microsoft Teams, [Office 365 Outlook](https://learn.microsoft.com/en-us/connectors/office365/), and SharePoint access. Confirm the account and environment meet the [Power Automate approval prerequisites](https://learn.microsoft.com/en-us/power-automate/get-started-approvals#prerequisites), including licensing and Dataverse availability. These standard connectors may still be disabled by your administrator.
    
*   [Full Access permission](https://learn.microsoft.com/en-us/exchange/recipients-in-exchange-online/manage-permissions-for-recipients) to an accounts-payable shared mailbox. You can pilot with your own mailbox and switch the trigger later.
    
*   A SharePoint site where you can [create a document library](https://support.microsoft.com/en-us/sharepoint/documents-and-library/create-a-document-library-in-sharepoint) and two lists. Keep pilot records separate from production invoices.
    
*   Two test accounts, one to submit and one to approve. Using one identity hides permission and routing mistakes.
    
*   A known approver email address. Add manager or amount-based routing after the basic path passes.
    

Designer labels can differ between new and classic views. Search by the bold action names when a panel differs.

## Prepare SharePoint for Documents and Evidence

Start with storage because later actions need a stable document URL and a record to update. Create a SharePoint document library named `Invoice Processing`, then use the [list and library column procedure](https://support.microsoft.com/en-us/sharepoint/lists/data-and-lists/create-a-column-in-a-list-or-library) to add these columns:

| Column | Type |
| --- | --- |
| `Vendor` | Single line of text |
| `Invoice Number` | Single line of text |
| `Invoice Amount` | Currency |
| `Approver Email` | Single line of text |
| `Status` | Choice: `Received`, `Pending`, `Approved`, `Rejected`, `Failed` |
| `Approval ID` | Single line of text |
| `Response Date UTC` | Date and time |

Follow Microsoft’s [SharePoint list creation procedure](https://support.microsoft.com/en-us/sharepoint/lists/data-and-lists/create-a-list) to create an `Invoice Audit Trail` list with `Invoice Number`, `Document Link`, `Submitted By`, `Approver Email`, `Decision`, `Requested Date UTC`, `Response Date UTC`, `Comments`, `Approval ID`, and `Flow Run ID` columns. The design uses [standard SharePoint connector actions](https://learn.microsoft.com/en-us/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers) and requires no premium connector.

| Artifact | Purpose | Primary Reader |
| --- | --- | --- |
| Invoice Processing library | Stores the invoice and current status | Accounts payable |
| Invoice Audit Trail list | Stores one row per response | Finance and auditors |
| Teams approval request | Presents the decision to the approver | Department manager |
| Power Automate run | Exposes execution details for support | Flow owner |

### Separate Current State From Approval Events

The library holds current state; the list holds one row per response. If a manager and finance director both approve an invoice, separate audit rows preserve both decisions instead of overwriting the first.

Let submitters add documents, but [customize the list and library permissions](https://support.microsoft.com/en-us/sharepoint/lists/sharepoint-sharing-and-permissions/customize-permissions-for-a-sharepoint-list-or-library) to restrict audit-list edits. The flow connection needs write access, while finance and auditors need read access. Test those permissions with a pilot account before processing real invoices. Broad edit access defeats the audit trail.

The finished data path should resemble the following diagram before you configure the trigger.

![Invoice approval flow](https://adamtheautomator.com/wp-content/uploads/publisher/9072822067d65174ff6c796e7013db3e06f98f839de3746f56e80110f7e1a406.png)

* * *

_**Key Insight: The SharePoint audit list is a finance record. Finance should control its permissions and apply Microsoft’s _**[_**SharePoint retention guidance**_](https://learn.microsoft.com/en-us/purview/retention-policies-sharepoint)**_. Use retention labels for individual audit-list items rather than a site-wide retention policy.**_

* * *

With both stores ready, the mailbox trigger can create a document and pass a real SharePoint link into the approval.

## Capture New Invoice Attachments

In Power Automate, select **Create** > **Automated cloud flow**. Name it `AP Invoice Approval`, choose **When a new email arrives in a shared mailbox (V2)**, and enter the mailbox address and invoice folder.

Open the trigger’s advanced parameters and use the following settings:

| Setting | Pilot Value | Failure It Prevents |
| --- | --- | --- |
| `Mailbox Address` | Your AP shared mailbox | Reading the maker’s personal inbox |
| `Only with Attachments` | `Yes` | Starting runs for attachment-free messages |
| `Include Attachments` | `Yes` | Passing null content to SharePoint |
| `Subject Filter` | Stable term: `Invoice` | Processing unrelated mailbox traffic |

Microsoft’s [shared-mailbox attachment troubleshooting guidance](https://learn.microsoft.com/en-us/troubleshoot/power-platform/power-automate/flow-run-issues/issues-triggering-emails-with-attachments-from-shared-mailbox) explains why both attachment settings matter: with `Include Attachments` left at `No`, attachment content is null and SharePoint **Create file** can return `400 Bad Request`. Filtering in the trigger also prevents irrelevant messages from consuming flow runs.

### Save Each Attachment and Its Metadata

Add an **Apply to each** action using `Attachments` from the trigger. Inside the loop, add SharePoint **Create file** with these mappings:

| Field | Value |
| --- | --- |
| `Site Address` | Your SharePoint site |
| `Folder Path` | `Invoice Processing` library |
| `File Name` | Attachment `Name` |
| `File Content` | Attachment `Content` |

Add **Get file properties** immediately after `Create file`, using the created item’s identifier. `Create file` returns the `ItemId` that **Get file properties** and **Update file properties** accept, which the later metadata updates use. Confirm the item link value before you bind it in the approval: Microsoft documents `Link to item` as a SharePoint trigger property rather than explicitly as a **Get file properties** output.

For the first run, use **Update file properties** to set a test vendor, invoice number, amount, approver email, and `Received` status. After the workflow passes, replace those values with a form, ERP lookup, or [AI Builder extraction](https://adamtheautomator.com/power-automate-document-intake-pipeline/). Prove routing and audit logging before improving data capture.

* * *

_**Warning: Supplier emails often include logos and signature images. Filter attachments to accepted file types or route unsupported files to review, or the loop may create approval requests for _**`image001.png`**_.**_

* * *

Send one synthetic PDF through the mailbox and inspect the library. Do not continue until the file opens and its metadata contains a unique invoice number, amount, and approver. That document is the artifact the manager will review in Teams.

## Route the Power Automate Invoice Approval Through Microsoft Teams

Add **Start and wait for an approval** after `Get file properties`. Although you configure this action in Power Automate, the assigned user can respond from a Microsoft Teams adaptive card, the Teams Approvals app, Outlook, or the Power Automate approval center.

Microsoft’s [_Get started with Power Automate approvals_](https://learn.microsoft.com/en-us/power-automate/get-started-approvals) documentation states: “the flow starts and then waits for the approvers’ response before it completes the run.” That blocking behavior makes it a good fit for invoices expected to receive a response within days.

Set the approval fields as follows:

| Field | Value | Reason |
| --- | --- | --- |
| `Approval type` | `Approve/Reject - First to respond` | One responsible approver completes the pilot |
| `Title` | Invoice number, vendor, and amount | Identifies the request in a Teams list |
| `Assigned to` | `Approver Email` from SharePoint | Routes the request from document metadata |
| `Details` | Vendor, number, amount, submitter, and review instruction | Gives context before the approver acts |
| `Item link` | SharePoint `Link to item` | Opens the source invoice |
| `Item link description` | `Open invoice PDF` | Names the destination clearly |

Keep the Teams details simple. Microsoft’s [approval Markdown support matrix](https://learn.microsoft.com/en-us/power-automate/approvals-markdown-support) shows that Teams omits Markdown emphasis and tables. Use plain labels and short lines.

### Add Routing Without Hiding the Invoice

Introduce amount routing only after the single-approver version works. Add a **Condition** before the approval action that checks `Invoice Amount`. For example, the lower branch can assign the department manager, while the higher branch uses a second `Start and wait for an approval` action for the finance director after the manager approves. Microsoft’s [sequential approval pattern](https://learn.microsoft.com/en-us/power-automate/sequential-modern-approvals) follows this same ordering: pre-approval completes before the final approver receives the request.

The following image brief captures the configuration readers need to confirm in the designer.

![Approval action config](https://adamtheautomator.com/wp-content/uploads/publisher/3c98293c42608887e3cb8213f39cf2fb7737fd6e76057e501e84f500473dece4.png)

After saving the flow, open Teams with the approver account. Pin **Approvals** if needed, then confirm the request appears under **Received** and opens the correct SharePoint invoice. The native [Approvals app in Teams](https://learn.microsoft.com/en-us/power-automate/teams/native-approvals-in-teams) can also create manual requests, but those requests do not run your invoice-specific post-approval actions. The Power Automate flow remains the process owner here.

## Record the Decision Finance Will Ask For

Add a **Condition** under the approval action. Select `Outcome` from dynamic content, choose `is equal to`, and enter `Approve`. The [Approvals connector response reference](https://learn.microsoft.com/en-us/connectors/approvals/#known-issues-and-limitations) states that the valid basic responses are `Approve` and `Reject`, and they are case-sensitive.

### Handle an Approved Invoice

In the `If yes` branch, add SharePoint **Update file properties**. Set `Status` to `Approved`, then map `Approval ID` and `Response Date UTC` from the approval output. Add SharePoint **Create item** against `Invoice Audit Trail` and map the invoice number, document link, submitter, responder email, `Approve`, request date, response date, comments, and approval ID. The ordinary **Start and wait for an approval** action exposes dynamic outputs; Microsoft documents response, approver, comments, and outcome values in examples, but its current connector reference does not document this complete set, and the full field list is documented for the text-suggestion approval output. Confirm each field resolves in the designer before you rely on the mapping.

Use this expression for `Flow Run ID`:

```text
workflow()?['run']?['name']
```

Microsoft documents the [`workflow()` function as a source of current-run metadata](https://learn.microsoft.com/en-us/power-automate/guidance/coding-guidelines/error-handling#get-information-about-the-current-flow-run). The run ID gives support staff a correlation value while the native run remains available.

Finish the branch with a Teams message or shared-mailbox email telling accounts payable the invoice is approved and ready for its payment process. Keep payment execution outside this tutorial; authorizing an invoice and releasing funds are separate controls.

### Handle a Rejected Invoice

In the `If no` branch, update the file’s `Status` to `Rejected`. Create another audit row using the same fields, with `Reject` as `Decision` and the approver’s comments preserved. Notify the submitter and include those comments so the correction request has an owner and a reason.

Create one audit row in each branch, even if the library metadata already shows the result. The row captures an event; the library column shows current state. If you later add a second approval, create a second row rather than concatenating names and dates into one text field.

* * *

_**Reality Check: Power Automate run history belongs in operations. Finance evidence belongs in governed storage because _**[_**cloud-flow duration and retention limits**_](https://learn.microsoft.com/en-us/power-automate/limits-and-config#duration-and-retention-limits)**_ cap both a run and its stored history at 30 days.**_

* * *

If an invoice may wait longer than 30 days, Microsoft documents a [long-running approval design](https://learn.microsoft.com/en-us/power-automate/modern-approvals#create-long-running-approvals) that stores approvals in Dataverse with two flows, one to create the approval and another to process responses. Microsoft does not document SharePoint as a replacement for the approvals store.

The audit list now answers who decided, what they decided, when they responded, what they said, which document they reviewed, and which flow run processed it. Those fields make the final test meaningful.

## Test Approval, Rejection, and Failure Paths

A green save banner validates only the flow definition. The tests below validate mailbox permissions, attachment handling, Teams delivery, and the complete audit record. Run three synthetic invoices through the same path and inspect the resulting artifacts.

| Test | Expected File Status | Expected Evidence |
| --- | --- | --- |
| Approve | `Approved` | Audit row with responder and UTC response time |
| Reject | `Rejected` | Audit row with rejection comment |
| Audit write failure | `Failed` | Owner alert containing invoice and run IDs |
| No response | `Pending` until escalation or timeout | Pending record visible to the process owner |

Execute the first three tests deliberately:

1.  Send an invoice below your routing threshold and approve it in Teams. Confirm the library status becomes `Approved`, one audit row exists, and the responder email and UTC response time are populated.
    
2.  Send another invoice and reject it with a distinctive comment: `PO number missing`. Confirm the submitter receives that exact reason and a separate audit row records `Reject`.
    
3.  Force a controlled failure by pointing a copy of `Create item` at a nonexistent test list or by temporarily removing the pilot account’s write permission. Confirm someone who owns the process receives an alert.
    

### Prove the Failure Path Deliberately

For the third test, put the save, approval, metadata update, and audit actions in a **Try** scope. Add a **Catch** scope whose **Run after** handles failure, timeout, and skipped states. When a document exists, set its status to `Failed`, then alert the flow owner with the invoice number and run ID. Microsoft’s [Try/Catch scope pattern](https://learn.microsoft.com/en-us/power-automate/guidance/coding-guidelines/error-handling#group-actions-into-scopes-for-error-handling) keeps failed actions from leaving a `Pending` record.

Check the Teams card as both the approver and the maker. Verify the amount, vendor, and link, then compare the `Invoice Audit Trail` row with Teams. Finance should be able to reconstruct the decision by invoice number without opening the designer.

Document extraction and accounting-system integration sit outside this tutorial’s approval scope and within [Adam’s business process automation work](https://adamtheautomator.com/about-adam/).

## Put the Flow Into Service

Move the flow into service after both response branches and the Catch scope produce the expected SharePoint records. Replace fixed values with your approved source, [assign a co-owner and manage the flow’s connections](https://learn.microsoft.com/en-us/power-automate/create-team-flows), document the connection accounts, and have finance confirm columns and retention. Microsoft’s [cloud-flow monitoring guidance](https://learn.microsoft.com/en-us/power-automate/guidance/coding-guidelines/monitoring-and-alerting) recommends regular monitoring.

Review pending records on a schedule. A separate daily flow can find invoices past your service target and alert the approver or a deputy without risking invoice ingestion.

The flow replaces the invoice spreadsheet and its prettier notification with evidence finance can retrieve by invoice number, without searching anyone’s mailbox.

Share this article

[Share on X](https://twitter.com/intent/tweet?url=https%3A%2F%2Fadamtheautomator.com%2Fpower-automate-invoice-approvals-teams%2F&text=Power%20Automate%3A%20Streamline%20Invoice%20Approvals%20in%20Teams)[Share on Facebook](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fadamtheautomator.com%2Fpower-automate-invoice-approvals-teams%2F)[Share on LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fadamtheautomator.com%2Fpower-automate-invoice-approvals-teams%2F)

## Related Posts

![](https://adamtheautomator.com/wp-content/uploads/publisher/3ec5d9c85b2b81b19274c73baf4c55f3/98f4af306255355a84e7293721f7eba0ae787ac2055f021d4fddbae4f4385bee.webp)

### [Automate Expense Report Approvals with Power Automate](/power-automate-expense-approval-flow/)

Build a Power Automate approval flow on a SharePoint list that routes expense reports, closes the self-trigger loop, and exports approved spend for finance.

![](https://adamtheautomator.com/wp-content/uploads/2026/07/featured_image-3.webp)

### [Power Automate: Build a Reliable AI Document Intake Pipeline](/power-automate-document-intake-pipeline/)

Build a Power Automate intake pipeline that deduplicates Outlook attachments, extracts fields with AI Builder, and routes low-confidence results to Teams.

![](https://adamtheautomator.com/wp-content/uploads/publisher/3ec5d9c85b2b81ec815dd67b3720f831/f1259be740bd3b3dc8b6d6dc209ed026d438ad6ea109e47ae76c353b3f50c00c.webp)

### [Copilot Studio Agents: Triage Support Emails Instantly](/copilot-studio-agents-email-triage/)

Build a Copilot Studio agent that triages support email, tags urgency, extracts ticket details, and routes each message to the right owner.

## Categories

*   [IT Ops](/category/it-ops/)
*   [Cloud](/category/cloud/)
*   [DevOps](/category/devops/)
*   [Home Ops](/category/home-ops/)
*   [Information Security](/category/infosec/)
*   [Software Development](/category/software-development/)

## Site

*   [Home](/)
*   [Tutorials](/tutorials/)
*   [Instructors](/author/)
*   [Advertising](/advertising/)
*   [Recommended Resources](/resources/)
*   [About Adam](/about-adam/)

Copyright 2026© ATA Learning | [Privacy Policy](/privacy/)
