To check Microsoft 365 service health, read each service's health status and the incidents and advisories Microsoft has posted for your tenant, or open Service health in the Microsoft 365 admin centre. Service health keeps the history of the past 30 days. Planned maintenance isn't shown there: Microsoft posts it in Message center.
| Method | Best fit |
|---|---|
| PowerShell | A CSV of every service's status and the issues still open, for a ticket or a script. |
| Admin centre | Following 1 incident while it is open, with every update Microsoft posts. |
| Altivane | Recommended for regular reviews, with each run's issues kept in a workbook. |
Before you start
Use an account in a role that can view service health, such as Service Support Administrator, Helpdesk Administrator or Global Reader. No extra licence is needed. The PowerShell example requests ServiceHealth.; your organisation may require administrator consent.
Know what you get. Each service has 1 status, such as serviceOperational or serviceDegradation. An issue is an incident, where a service or a major function is unavailable, or an advisory, where some users are affected and the service is still available. The list covers the services your tenant subscribes to. The examples read and export; they don't report an issue or change any setting.
Option 1
Check Microsoft 365 service health with PowerShell
Install the modules once, then connect, read each service's status and the issues, and save 2 CSV files: the services, those with open issues first, and the open issues, the latest update first.
# Install once, if the modules are not already installed.
$modules = 'Microsoft.Graph.Authentication', 'Microsoft.Graph.Devices.ServiceAnnouncement'
Install-Module $modules -Scope CurrentUser$ErrorActionPreference = 'Stop'
Connect-MgGraph -Scopes 'ServiceHealth.Read.All' -NoWelcome
try {
$services = @(Get-MgServiceAnnouncementHealthOverview -All)
$issues = @(Get-MgServiceAnnouncementIssue -All)
$open = @($issues | Where-Object { -not $_.IsResolved })
if ($services.Count -eq 0) {
Write-Output 'No service health could be read for this tenant.'
} else {
$report = @($services | ForEach-Object {
$name = $_.Service
$active = @($open | Where-Object { $_.Service -eq $name })
[pscustomobject]@{
Service = $name
Status = $_.Status
ActiveIssues = $active.Count
IssueIds = @($active.Id) -join '; '
}
} | Sort-Object @{ Expression = 'ActiveIssues'; Descending = $true }, Service)
$report | Export-Csv -Path './service-health.csv' -NoTypeInformation -Encoding utf8
$open | Sort-Object LastModifiedDateTime -Descending |
Select-Object Id, Title, Service, Feature, Classification, Status,
ImpactDescription, StartDateTime, LastModifiedDateTime |
Export-Csv -Path './service-issues.csv' -NoTypeInformation -Encoding utf8
Write-Output "$($services.Count) services read; $($open.Count) issues are open."
}
} finally {
Disconnect-MgGraph | Out-Null
}Classification says whether an issue is an incident or an advisory, and Status where Microsoft is with it, such as investigating or restoringService. Times are in UTC. To keep resolved issues too, export $issues instead of $open; IsResolved then tells them apart.
Read the updates on 1 issue
Reconnect with Connect-MgGraph, then read the posts on 1 issue by its ID, oldest first. The main export above disconnects when it finishes.
# Run while connected to Microsoft Graph. Replace the example issue ID.
$issue = Get-MgServiceAnnouncementIssue -ServiceHealthIssueId 'EX123456'
$issue.Posts | Sort-Object CreatedDateTime |
Select-Object CreatedDateTime, @{ N = 'Update'; E = { $_.Description.Content } }Each post is written in HTML, as Microsoft publishes it on the issue's page in the admin centre.
Option 2
Check service health in the admin centre
- Sign in to the Microsoft 365 admin centre for the correct tenant.
- Go to Health > Service health.
- On the Overview tab, read the Health column for each service, then Issues for your organization to act on and Active issues Microsoft is working on.
- Select an issue's title to read its details, the user impact and All updates.
- Select Issue history for the incidents and advisories resolved in the last 7 or 30 days.
This suits following an incident while it is open, and it is where to tell Microsoft about an issue it hasn't listed. It shows 1 tenant at a time and keeps 30 days, so for a record you can keep, use PowerShell or a report.
Option 3 ยท Recommended for regular reviews
Check service health with Altivane
- Open Altivane and choose the tenant.
- Run the Microsoft 365 Service Health report.
- Open the Excel workbook and find Microsoft 365 service issues: Microsoft's incidents and advisories for the tenant, open ones first, then the latest update first, with each one's service, feature, kind, status, impact and times.
- Read Microsoft 365 services for each service's status and how many issues it has open, the services with the most first.
Altivane reads the same service health that the admin centre shows and writes each status in plain words, such as Service operational, with times in local time. Each run keeps its workbook, so a run each month leaves a record of the incidents after the 30 days of history have passed. The report needs a tenant signed in with a certificate.
Contact usCommon questions
Why isn't planned maintenance listed?
Service health shows incidents and advisories only. Microsoft posts planned maintenance in Message center, with the Plan for change posts telling you when a change happens and how to prepare; see how to export Message center posts.
What if I can't sign in to the admin centre?
Check the service status page at status.cloud.microsoft for known issues that stop people signing in to their tenant. Service health itself needs a successful sign-in.
Does this cover Azure?
No. Azure has its own Service Health in the Azure portal, for the subscriptions and regions you use; see how to check service health in Azure.
Microsoft references
Technical references checked on 7 November 2026. The example scripts have been reviewed and syntax checked; they have not been run against a live tenant.