Skip to content

We use cookies to understand how you use our site and improve your experience. Privacy Policy

Back to Blog
Automation Workflows

Send Approval Requests to Teams with n8n

n8n
n8n Resources Team
July 30, 2026

Ready to automate?

Browse 5,600+ copy-paste n8n workflow templates.

Approval processes break down in predictable ways. A request gets emailed to the wrong inbox. A Slack DM gets buried. Someone approves a purchase order on Tuesday, but the downstream system doesn't reflect it until Thursday—if it gets updated at all.

The underlying problem is that approval decisions happen in communication tools while the actual work happens in separate systems. Bridging that gap is exactly what n8n is built for.

This guide walks through building a complete approval workflow in n8n that posts an interactive Adaptive Card to a Microsoft Teams channel, waits for an Approve or Reject decision, and then automatically acts on that decision—updating a record, sending a confirmation, or notifying the requester.

What You'll Build

The workflow handles the full approval loop without any manual handoff:

  1. A request comes in from a form, webhook, or internal system
  2. n8n posts an Adaptive Card to the designated Teams channel
  3. The approver clicks Approve or Reject directly inside Teams
  4. n8n receives the decision via webhook callback
  5. Based on the outcome, n8n updates the relevant system and notifies the requester

This pattern works for purchase orders, content reviews, access requests, leave applications, expense reports, or anything that requires a human decision before the next step proceeds.

Prerequisites

  • An n8n instance (cloud or self-hosted)
  • Microsoft Teams with admin access to configure a channel connector or bot
  • A Teams channel dedicated to approvals (for example, #approvals)
  • A request source: a form tool such as Tally or Typeform, a webhook-enabled app, or another n8n workflow

Example n8n Workflow: Content Approval for a Marketing Team

Here is a concrete version built for a marketing team that requires manager sign-off on content before publication. A writer submits a Tally form with the content title, link, and notes. The manager receives an Adaptive Card in Teams with two buttons, approves or rejects it there, and n8n handles everything that follows.

Step 1: Receive the Approval Request

Add a Webhook Trigger node set to POST method. This node generates an endpoint URL that you paste into your form tool or trigger source. When the writer submits the form, the webhook fires and passes the request data—title, link, requester name, notes—into the n8n execution.

If your trigger source is a database row or an internal queue rather than a form, use a Schedule Trigger node to poll on a regular interval instead.

Step 2: Format the Teams Adaptive Card

Use a Set node to construct the Adaptive Card JSON payload. Adaptive Cards are Teams' native interactive message format—they render as a structured card with formatted text blocks and action buttons rather than a plain message.

Your card should include:

  • The request title and a clickable link to the content
  • The requester's name and the timestamp of submission
  • Any notes or context the requester provided
  • Two Action.Submit buttons labeled "Approve" and "Reject"

Each button is configured to POST a value back to n8n when clicked—for example, {"action": "approve", "requestId": "xyz"} for the approve button and {"action": "reject", "requestId": "xyz"} for the reject button. You embed the unique webhook callback URL (from Step 4) as the action URL for each button.

Keep the card concise. The approver needs to see exactly what they are deciding on, nothing more.

Step 3: Post the Card to the Teams Channel

Add an HTTP Request node configured to POST to your Teams incoming webhook URL. Set this up in Teams under Channel Settings → Connectors → Incoming Webhook. Copy the webhook URL and store it as an n8n credential.

Set the Content-Type header to application/json and pass the Adaptive Card payload constructed in the Set node as the request body.

Alternatively, if you have a bot registered in the Azure portal, the Microsoft Teams node in n8n handles OAuth authentication natively and lets you send messages via the Bot Framework API. For most teams setting this up for the first time, the incoming webhook approach is faster and requires no Azure app registration.

Step 4: Pause and Wait for the Decision

Add a Wait node set to "On Webhook Call" mode. This pauses the n8n workflow execution and exposes a unique callback URL specifically for this execution run.

Reference this callback URL inside the Adaptive Card action buttons you built in Step 2. When the approver clicks Approve or Reject, Teams sends a POST request to the callback URL, the Wait node receives it, and the workflow resumes with the approver's response payload.

Set a timeout on the Wait node—24 hours is typical for most approval workflows. Wire the timeout path to a Send Email node or a Teams message that notifies the requester their request is still pending. This prevents requests from silently expiring.

Step 5: Branch on the Decision

When the Wait node resumes, add an IF node that evaluates {{$json.body.action}}:

  • If the value equals "approve", route execution down the True branch
  • If the value equals "reject", route down the False branch

Step 6: Act on the Decision

On the Approve branch:

Use a native integration node or HTTP Request node to update the record in your downstream system—marking the content as approved in your CMS, updating a Google Sheets status column, or creating a task in your project management tool.

Add a Gmail node or Send Email node to notify the requester that their submission was approved, with a direct link to the next step.

Append a row to a Google Sheets audit log: request ID, content title, approver name, decision, and timestamp. This log is your paper trail for every approval that moves through the workflow.

On the Reject branch:

Post a follow-up message back to the requester—via email or a Teams message—that includes the rejection and prompts them to revise and resubmit.

Update the record status to "Rejected" in the same system you updated on approval, then write the rejection to the same Google Sheets audit log with a reason field.

Step 7: Update the Card in Teams (Optional)

After a decision is recorded, you can update the original Adaptive Card in Teams so the channel history shows "Approved by [Name] on [Date]" rather than leaving the action buttons active indefinitely. This requires a Teams bot with message update permissions rather than a simple incoming webhook.

Use an HTTP Request node targeting the Bot Framework's update message endpoint with the activity ID from the original card post. This is a polish step—it keeps the Teams channel tidy but is not required for the workflow to function correctly.

Adapting This Pattern

The core loop—trigger, post card, wait for decision, branch, act—adapts to most approval scenarios by changing the trigger source and the actions taken after the decision:

  • Expense reports: Trigger from a Google Form or expense tool; on approval, push the transaction to QuickBooks or Xero via HTTP Request
  • IT access requests: Trigger from a ticketing webhook; on approval, call the Okta or Google Workspace API to provision access
  • Purchase orders: Trigger from an Airtable form; on approval, create a bill in your accounting system and update the purchase order record

For approvals that require sign-off from multiple people before proceeding, run parallel branches using a Split in Batches node or sequential Wait nodes per approver, then collect all responses with a Merge node before moving to the action step.

When to Build This vs. Using a Dedicated Tool

Purpose-built approval tools—Jira Service Management, Monday.com Workflows, Kissflow—make sense when you need multi-level approval chains, built-in SLA tracking, and structured reporting. For single-tier approvals or custom workflows that connect tools your approval platform does not integrate with natively, building in n8n is faster and more adaptable. The workflow above takes under an hour to configure.

Teams is a natural channel for this because most professional teams already have it open throughout the day. The decision happens where the approver already works—no extra login, no new interface to adopt.

Templates and Further Reading

Browse prebuilt variations of this workflow on the n8nresources.dev approval workflow templates page, or explore the full template library for adjacent automation patterns including form-to-CRM workflows, multi-step notification chains, and data sync automations.

Enjoyed this article?

Share it with others who might find it useful