How to Configure Webhooks with Power Automate to Filter and Send Fluid Notifications to Microsoft Teams

Edited

This guide explains how to create a Power Automate flow that receives webhook events from Fluid, filters them based on task status, and sends a formatted notification to a Microsoft Teams channel.

Note: Power Automate uses SAS authentication. As such for webhook integration, choose "Shared Secret Signature Validation" and enter a value for the secret. Power Automate will then override and use its own SAS authentication internally.

Overview

This setup allows you to:

  • Receive webhook events from Fluid

  • Parse the incoming JSON payload

  • Apply conditional logic (e.g. only send updates when status = “Done”)

  • Send a rich Adaptive Card notification to Microsoft Teams

Prerequisites

Step 1: Create the Flow

  1. Go to https://make.powerautomate.com

  2. Click Create

  3. Select Instant cloud flow

  4. Enter a name (e.g. Teams Webhook Filter)

  5. Choose the trigger:

  6. When a Teams webhook request is received

  1. Click Create

  2. Ensure the trigger is set to Anyone can trigger

Step 2: Parse the Incoming JSON

  1. Click + New step

  2. Search for and select Parse JSON

  3. In Content, select Body from Insert dynamic content

  4. Click Use sample payload to generate schema

  5. Paste the sample JSON payload provided

{
	"fields": {
		"assignee": null,
		"attachmentCount": 0,
		"boardCategory": 0,
		"boardId": 0,
		"boardGuid": "2c8f0918-4f6b-4f5e-9dee-f12e582bbdef",
		"boardTitle": "webhook",
		"businessValue": 0,
		"contentType": "Process",
		"createDate": "2026-03-30T17:30:48.0000000Z",
		"description": "This is a test payload generated by Fluid to verify the webhook endpoint is reachable and authentication is configured correctly.",
		"descriptionHtml": "This is a test payload generated by Fluid to verify the webhook endpoint is reachable and authentication is configured correctly.",
		"dueDate": "2026-04-06T17:30:48.0000000Z",
		"endDate": "2026-04-06T17:30:48.0000000Z",
		"impediment": 0,
		"isClosed": false,
		"modifiedDate": "2026-03-30T17:30:48.0000000Z",
		"points": 1,
		"parentGuid": "672aea66-22a5-40d6-b658-f2f6b20d12e6",
		"priority": "Medium",
		"principalGuid": "2c8f0918-4f6b-4f5e-9dee-f12e582bbdef",
		"ragStatus": "Green",
		"shortCode": "TEST-1",
		"startDate": "2026-03-30T17:30:48.0000000Z",
		"status": "Not Started",
		"statusCode": 1,
		"taskType": "Task",
		"title": "[Test] Webhook connectivity test",
		"titleRichText": "[Test] Webhook connectivity test",
		"titleHtml": "<p>[Test] Webhook connectivity test</p>"
	},
	"id": 99999,
	"methods": [
		{
			"type": "PermaLink",
			"httpMethod": "GET",
			"url": "https://localhost:62199/Action/EditFull/21ed8132-f904-48f2-a682-eaf615d6d273"
		},
		{
			"type": "Update",
			"httpMethod": "PUT",
			"url": "https://localhost:62199/rest/api/action/99999",
			"description": "Update Action",
			"payload": {
				"fields": {
					"description": "<Description>",
					"title": "<Title>"
				},
				"attachments": null,
				"customProperties": [],
				"checkList": null
			}
		},
		{
			"type": "Delete",
			"httpMethod": "DELETE",
			"url": "https://localhost:62199/rest/api/action/99999"
		}
	],
	"related": {},
	"guid": "21ed8132-f904-48f2-a682-eaf615d6d273",
	"url": "https://localhost:62199/rest/api/action/99999"
}
  1. Click Done

Step 3: Add a Condition (Filter Logic)

  1. Click + New step

  2. Select Condition

  3. Configure:

  4. Left value: fields → Insert Dynamic Content → Body Status

  5. Operator: is equal to

  6. Right value: e.g. Done

💡 You can modify this condition to filter on any field (e.g. priority, board, task type) that is available in the schema.

Step 4: Send Notification to Microsoft Teams

Inside the If yes branch:

  1. Click Add an action

  2. Search for Microsoft Teams

  3. Select Post card in a chat or channel

  4. Configure:

    • Team → Select your Team

    • Channel → Select your Channel

    • Adaptive Card → Paste your Adaptive Card JSON

Sample

{
    "type": "AdaptiveCard",
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.4",
    "body": [
        {
            "type": "ColumnSet",
            "columns": [
                {
                    "type": "Column",
                    "width": "auto",
                    "items": [
                        {
                            "type": "TextBlock",
                            "text": "🔔",
                            "size": "Large"
                        }
                    ],
                    "verticalContentAlignment": "Center"
                },
                {
                    "type": "Column",
                    "width": "stretch",
                    "items": [
                        {
                            "type": "TextBlock",
                            "text": "New Task",
                            "weight": "Bolder",
                            "size": "Medium",
                            "wrap": true
                        },
                        {
                            "type": "TextBlock",
                            "text": "@{triggerBody()?['fields']?['title']}",
                            "wrap": true,
                            "size": "Default",
                            "weight": "Bolder",
                            "color": "Accent"
                        }
                    ],
                    "verticalContentAlignment": "Center"
                }
            ]
        },
        {
            "type": "ColumnSet",
            "separator": true,
            "spacing": "Medium",
            "columns": [
                {
                    "type": "Column",
                    "width": "stretch",
                    "items": [
                        {
                            "type": "FactSet",
                            "facts": [
                                {
                                    "title": "📋 Board",
                                    "value": "@{triggerBody()?['fields']?['boardTitle']}"
                                },
                                {
                                    "title": "🏷️ Type",
                                    "value": "@{triggerBody()?['fields']?['taskType']}"
                                },
                                {
                                    "title": "📌 Status",
                                    "value": "@{triggerBody()?['fields']?['status']}"
                                },
                                {
                                    "title": "🎯 Priority",
                                    "value": "@{triggerBody()?['fields']?['priority']}"
                                },
                                {
                                    "title": "🚦 RAG",
                                    "value": "@{triggerBody()?['fields']?['ragStatus']}"
                                },
                                {
                                    "title": "🆔 Code",
                                    "value": "@{triggerBody()?['fields']?['shortCode']}"
                                }
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "type": "TextBlock",
            "text": "📝 Description",
            "weight": "Bolder",
            "spacing": "Medium",
            "separator": true
        },
        {
            "type": "TextBlock",
            "text": "@{triggerBody()?['fields']?['description']}",
            "wrap": true,
            "spacing": "Small"
        }
    ],
    "actions": [
        {
            "type": "Action.OpenUrl",
            "title": "🔗 View in Fluid",
            "url": "@{triggerBody()?['methods']?[0]?['url'] }",
            "style": "positive"
        }
    ]
}

This card can include dynamic values such as:

  • Task title

    "@{triggerBody()?['fields']?['title']}"
  • Status

    "@{triggerBody()?['fields']?['status']}"
  • Priority

    "@{triggerBody()?['fields']?['priority']}"
  • Dates

    @{formatDateTime(triggerBody()?['fields']?['startDate'], 'dd MMM yyyy')}
  • Direct link back to Fluid

    triggerBody()?['methods']?[0]?['url'] 
  • Event type

    triggerOutputs()?['headers']?['X-Fluid-Event']

Learn more about adaptive cards:

Step 5: Leave “If no” Empty

No action is required in the If no branch.

If the condition is not met, no notification will be sent.

Step 6: Save and Test

  1. Click Save

  2. Trigger a test event from Fluid

  3. Confirm that:

    • The flow runs successfully

    • A Teams notification is sent only when the condition is met

Was this article helpful?

Sorry about that! Care to tell us more?

Thanks for the feedback!

There was an issue submitting your feedback
Please check your connection and try again.