All scripts
Azure AI 217

Get-AzureReservationUtilizationReport

Reports utilization percentage for every reserved instance and savings plan, flagging underused reservations, where you paid upfront for capacity that is not actually being consumed.

Get-AzureReservationUtilizationReport.ps1
<#
.SYNOPSIS
    Reports utilization for Azure reservations and savings plans.

.DESCRIPTION
    Lists every reservation with its current utilization percentage,
    flagging any running below a healthy threshold, since an underused
    reservation means you paid upfront for capacity that is not
    actually being consumed.

.PARAMETER MinUtilizationPercent
    Utilization percent below which a reservation is flagged. Defaults to 70.

.EXAMPLE
    .\Get-AzureReservationUtilizationReport.ps1 -MinUtilizationPercent 80

.NOTES
    Requires the Az.Billing module and an active Connect-AzAccount session
    with billing reader access.

.AUTHOR
    Shehryar Hassan
#>

param(
    [double]$MinUtilizationPercent = 70
)

$orders = Get-AzReservationOrder

$report = foreach ($order in $orders) {
    $reservations = Get-AzReservation -ReservationOrderId $order.Name
    foreach ($reservation in $reservations) {
        $utilization = Get-AzReservationUtilizationSummary -ReservationOrderId $order.Name -ReservationId $reservation.Name -Grain Daily -ErrorAction SilentlyContinue
        $avgUtil = ($utilization.Properties.UtilizationPercentage | Measure-Object -Average).Average
        [pscustomobject]@{
            ReservationName = $reservation.Name
            Sku             = $reservation.SkuName
            AvgUtilization  = [math]::Round($avgUtil, 1)
            Underutilized   = $avgUtil -lt $MinUtilizationPercent
        }
    }
}

$report | Where-Object Underutilized | Format-Table -AutoSize

Read it before you run it, and test in a safe tenant first.