๐Ÿšจ Never Miss a SharePoint Outage Again: Build Your Own Real-Time Alert System with Power Automate Get instant Teams notifications when SharePoint Online has issues — before your users start complaining! ๐Ÿ“… January 2026 • ⏱️ 20 min read • ๐Ÿ’ก Intermediate Level

๐Ÿšจ Never Miss a SharePoint Outage Again: Build Your Own Real-Time Alert System with Power Automate

Get instant Teams notifications when SharePoint Online has issues — before your users start complaining!

๐Ÿ“… January 2026 • ⏱️ 20 min read • ๐Ÿ’ก Intermediate Level

The Problem: SharePoint goes down. Users flood your inbox with "Is SharePoint broken?" emails. You scramble to check the admin center. Sound familiar? In this guide, you'll build an automated monitoring system that alerts your IT team the moment Microsoft detects a SharePoint issue — often before users even notice!

๐ŸŽฏ What You'll Build

By the end of this guide, you'll have a Power Automate flow that:

  • ✅ Checks Microsoft 365 Service Health every 15 minutes
  • ✅ Filters for SharePoint Online issues only
  • ✅ Ignores old/resolved issues — only alerts on active problems
  • ✅ Sends detailed alerts to your Teams channel

๐Ÿ“ฑ Sample Alert Message

๐Ÿšจ SHAREPOINT SERVICE ALERT ๐Ÿšจ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ๐Ÿ†” Issue ID: SP1177145 ๐Ÿ“‹ Title: Some users with edit and full control permissions may be unable to access or share some items in SharePoint Online ๐Ÿ”ด Status: serviceDegradation ๐Ÿ‘ฅ User Impact: Users with edit and full control permissions may be unable to access or share some items in SharePoint Online. ๐Ÿ• Start Time: 2025-10-13T18:50:00Z ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ๐Ÿ”— View in Admin Center: https://admin.microsoft.com/Adminportal/Home#/servicehealth ⏰ Alert Generated: 2026-01-26T04:37:00Z

๐Ÿ“‹ Prerequisites

๐Ÿ‘คAzure AD Global Admin (for app registration)
Power Automate Premium license (for HTTP connector)
๐Ÿ’ฌMicrosoft Teams channel for alerts
⏱️About 20-30 minutes

๐Ÿ” Part 1: Azure AD App Registration

First, we need to create an Azure AD app that has permission to read Microsoft 365 Service Health data. This app will authenticate our Power Automate flow with Microsoft Graph API.

1Create the App Registration

Navigate to Azure AD

  1. Go to portal.azure.com
  2. Search for "App registrations" in the search bar
  3. Click "App registrations"

Create New Registration

  1. Click "+ New registration"
  2. Fill in the details:
NameSharePoint Health Monitor
Supported account typesSelect: "Accounts in this organizational directory only"
Redirect URILeave blank
  1. Click "Register"

✅ Save These Values!

After registration, you'll see the Overview page. Copy and save:

  • Application (client) ID — e.g., xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  • Directory (tenant) ID — e.g., xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

2Configure API Permissions

Now we need to grant the app permission to read Service Health data from Microsoft Graph.

Add Permissions

  1. In your app, click "API permissions" in the left menu
  2. Click "+ Add a permission"
  3. Select "Microsoft Graph"
  4. Select "Application permissions" (not Delegated!)
  5. Search for and check these permissions:
PermissionDescription
ServiceHealth.Read.AllRead service health information
ServiceMessage.Read.AllRead service messages and announcements
  1. Click "Add permissions"

Grant Admin Consent

  1. Back on the API permissions page, click "Grant admin consent for [Your Organization]"
  2. Click "Yes" to confirm
  3. You should see green checkmarks ✅ next to both permissions

⚠️ Admin Consent Required

You must be a Global Administrator to grant admin consent. If you don't see the button, contact your Azure AD admin.

3Create Client Secret

The client secret is like a password that Power Automate will use to authenticate.

Generate Secret

  1. Click "Certificates & secrets" in the left menu
  2. Click "+ New client secret"
  3. Fill in:
DescriptionPower Automate Service Health
ExpiresSelect: 24 months (or your preference)
  1. Click "Add"

๐Ÿ”ด CRITICAL: Copy the Secret Value NOW!

The secret Value is only shown ONCE! Copy it immediately and store it securely.

You need the Value (not the Secret ID).

Example: Abc8Q~x-X_XXxxxxXXXXxxxxxXXXXXX1X1x1X

4Your Credentials Summary

You should now have these three values. Keep them safe!

CredentialWhere to Find ItExample Format
Tenant IDApp Overview page → Directory (tenant) IDxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Client IDApp Overview page → Application (client) IDxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Client SecretCertificates & secrets → Value columnAbc8Q~x-X_XXxxxx...

๐Ÿ’ก Pro Tip: Use Azure Key Vault

For production environments, consider storing your client secret in Azure Key Vault and referencing it from Power Automate for better security.

⚡ Part 2: Build the Power Automate Flow

Now let's build the flow that monitors SharePoint health and sends Teams alerts!

๐Ÿ“Š Flow Architecture Overview

┌─────────────────────────────────────────────────────────────────┐
│                        FLOW STRUCTURE                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ⏰ Recurrence (Every 15 minutes)                               │
│      ↓                                                          │
│  ๐Ÿ”‘ HTTP POST: Get Access Token                                 │
│      ↓                                                          │
│  ๐Ÿ“ Parse JSON: Extract Token                                   │
│      ↓                                                          │
│  ๐Ÿ”ง Compose: Build "Bearer [token]" Header                      │
│      ↓                                                          │
│  ๐ŸŒ HTTP GET: Call Microsoft Graph Service Health API           │
│      ↓                                                          │
│  ๐Ÿ“ Parse JSON: Extract Services & Issues                       │
│      ↓                                                          │
│  ๐Ÿ“Š Initialize Variables: SharePointIssueFound, IssueDetails    │
│      ↓                                                          │
│  ๐Ÿ” Filter Array: SharePoint Online Only                        │
│      ↓                                                          │
│  ๐Ÿ”„ Loop Services                                                │
│      └─→ Condition: Status ≠ serviceOperational?                │
│          └─→ Yes: Set SharePointIssueFound = true               │
│              └─→ ๐Ÿ”„ Loop Issues                                  │
│                  └─→ Condition: Status ≠ serviceRestored?      │
│                      └─→ Yes: Append issue details              │
│      ↓                                                          │
│  ❓ Condition: SharePointIssueFound = true AND IssueDetails ≠ ""│
│      └─→ Yes: ๐Ÿ’ฌ Post Teams Message                             │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

1Create the Flow Trigger

Create Scheduled Flow

  1. Go to make.powerautomate.com
  2. Click "+ Create" → "Scheduled cloud flow"
  3. Configure:
Flow nameSharePoint Health Monitor
Run this flowEvery 15 Minutes
  1. Click "Create"

2Get Access Token (HTTP POST)

Add HTTP Action

  1. Click "+ New step"
  2. Search for "HTTP" and select it
  3. Configure the action:
MethodPOST
URI
https://login.microsoftonline.com/[YOUR-TENANT-ID]/oauth2/v2.0/token

Replace [YOUR-TENANT-ID] with your Tenant ID from Part 1

HeadersKey: Content-Type
Value: application/x-www-form-urlencoded
Body
grant_type=client_credentials&client_id=[YOUR-CLIENT-ID]&client_secret=[YOUR-CLIENT-SECRET]&scope=https://graph.microsoft.com/.default

Replace the placeholders with your values from Part 1

  1. Click "..." → "Rename" → Enter: Get Access Token

3Parse Token Response

Add Parse JSON Action

  1. Click "+ New step"
  2. Search for "Parse JSON" and select it
  3. Configure:
ContentClick ⚡ Dynamic content → Select Body from "Get Access Token"
Schema
{ "type": "object", "properties": { "token_type": {"type": "string"}, "expires_in": {"type": "integer"}, "access_token": {"type": "string"} } }
  1. Rename to: Parse Token Response

4Build Authorization Header (Compose)

๐Ÿ’ก Why Use Compose?

We use a Compose action to build the "Bearer [token]" string because directly combining text with dynamic content in HTTP headers can be unreliable. This method is more robust.

Add Compose Action

  1. Click "+ New step"
  2. Search for "Compose" and select it
  3. In the Inputs field:
  • Click Expression tab
  • Enter this expression:
concat('Bearer ', body('Parse_Token_Response')?['access_token'])
  • Click OK
  1. Rename to: Build Auth Header

5Get Service Health (HTTP GET)

Add HTTP Action

MethodGET
URI
https://graph.microsoft.com/v1.0/admin/serviceAnnouncement/healthOverviews?$expand=issues
HeadersKey: Authorization
Value: Click ⚡ Dynamic content → Select Outputs from "Build Auth Header"

Rename to: Get Service Health

6Parse Service Health Response

Add Parse JSON Action

Content⚡ Dynamic content → Body from "Get Service Health"
Schema
{ "type": "object", "properties": { "value": { "type": "array", "items": { "type": "object", "properties": { "id": {"type": "string"}, "service": {"type": "string"}, "status": {"type": "string"}, "issues": { "type": "array", "items": { "type": "object", "properties": { "id": {"type": "string"}, "title": {"type": "string"}, "status": {"type": "string"}, "impactDescription": {"type": "string"}, "startDateTime": {"type": "string"} } } } } } } } }

Rename to: Parse Service Health

7Initialize Variables

Variable 1: SharePointIssueFound

NameSharePointIssueFound
TypeBoolean
Valuefalse

Variable 2: IssueDetails

NameIssueDetails
TypeString
Value(Leave empty)

8Filter for SharePoint Only

Add Filter Array Action

FromClick Expression tab, enter:
body('Parse_Service_Health')?['value']
Filter ConditionClick "Edit in advanced mode", enter:
@equals(item()?['service'], 'SharePoint Online')

9Process Issues with Loops and Conditions

This is where the magic happens! We loop through SharePoint services, check for issues, and filter out old resolved problems.

Step 9.1: Add "Apply to each" for Services

Select outputExpression: body('Filter_array')

Rename to: Loop Services

Step 9.2: Inside Loop - Add Condition (Service Status)

Left ValueExpression: items('Loop_Services')?['status']
Operatoris not equal to
Right ValueserviceOperational

Step 9.3: In "If yes" - Set Variable

Set SharePointIssueFound = true

Step 9.4: In "If yes" - Add Nested "Apply to each" for Issues

Select outputExpression: items('Loop_Services')?['issues']

Rename to: Loop Issues

๐ŸŽฏ THE KEY STEP: Filter Active Issues Only!

This condition prevents old "serviceRestored" issues from appearing in your alerts.

Step 9.5: Inside "Loop Issues" - Add Condition (Issue Status)

Left ValueExpression: items('Loop_Issues')?['status']
Operatoris not equal to
Right ValueserviceRestored

Step 9.6: In "If yes" - Append to String Variable

NameIssueDetails
ValueExpression:
concat( '๐Ÿ†” Issue ID: ', items('Loop_Issues')?['id'], ' ', '๐Ÿ“‹ Title: ', items('Loop_Issues')?['title'], ' ', '๐Ÿ”ด Status: ', items('Loop_Issues')?['status'], ' ', '๐Ÿ‘ฅ User Impact: ', items('Loop_Issues')?['impactDescription'], ' ', '๐Ÿ• Start Time: ', items('Loop_Issues')?['startDateTime'], ' ', '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ' )

10Send Teams Alert

Step 10.1: Add Final Condition (OUTSIDE all loops)

Left Value⚡ Dynamic content: SharePointIssueFound
Operatoris equal to
Right Valuetrue

Step 10.2: In "If yes" - Check IssueDetails Not Empty

Left Value⚡ Dynamic content: IssueDetails
Operatoris not equal to
Right Value(Leave empty)

Step 10.3: In Nested "If yes" - Post Teams Message

Add action: "Post message in a chat or channel" (Microsoft Teams)

Post asFlow bot
Post inChannel
TeamSelect your IT team
ChannelSelect your alerts channel
MessageType your message, inserting IssueDetails via Dynamic content:
๐Ÿšจ SHAREPOINT SERVICE ALERT ๐Ÿšจ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [Insert IssueDetails here] ๐Ÿ”— View in Admin Center: https://admin.microsoft.com/Adminportal/Home#/servicehealth ⏰ Alert Generated: [Insert utcNow() expression]

๐Ÿงช Part 3: Test and Deploy

1Save and Test

  1. Click "Save" in the top right
  2. Click "Test"
  3. Select "Manually"
  4. Click "Test"
  5. Wait for the flow to complete (30-60 seconds)
  6. Check that all actions have green checkmarks ✅

✅ Expected Results

  • Get Access Token: Returns a token (you'll see it in the outputs)
  • Get Service Health: Returns 200 OK with service data
  • Filter array: Returns SharePoint data only
  • Teams message: Only sent if there's an ACTIVE issue

๐Ÿ”ง Troubleshooting Guide

ErrorCauseSolution
401 UnauthorizedInvalid credentials or missing consentCheck Tenant ID, Client ID, Client Secret. Verify admin consent was granted.
403 ForbiddenMissing API permissionsAdd ServiceHealth.Read.All permission and grant admin consent.
Filter array: NullWrong reference to parsed dataUse Expression: body('Parse_Service_Health')?['value']
Old issues appearingMissing status filterAdd condition: items('Loop_Issues')?['status'] ≠ serviceRestored
No Teams messageNo active issues or IssueDetails emptyThis is correct behavior! Check the Admin Center for actual issues.

๐Ÿ“Š Service Health Status Reference

StatusMeaningAlert?
investigatingMicrosoft is investigating the issue✅ Yes
serviceDegradationService performance is degraded✅ Yes
serviceInterruptionMajor service outage✅ Yes
extendedRecoveryRecovery is taking longer than expected✅ Yes
serviceRestoredIssue has been resolved❌ No (filtered out)
postIncidentReviewPublishedPost-incident review available❌ No (filtered out)

๐Ÿš€ You Did It!

Your SharePoint Health Monitor is now active! You'll receive Teams alerts within minutes of Microsoft detecting any SharePoint issues.

Pro tip: Create similar flows for Exchange Online, Teams, OneDrive, and other critical services!

Power Automate Microsoft 365 SharePoint Online Service Health Microsoft Graph API Azure AD IT Automation Teams Alerts

Comments

Popular posts from this blog

Bridging the Impossible: Connecting Jira On-Prem to Power Automate & Copilot Studio — The Solution Nobody Built Until Now"

How I Automated My Entire SharePoint Tenant with 150 MCP Tools and Claude Desktop

Azure Management MCP Server