Azure cost management

How to find subscriptions without a budget in Azure

Find subscriptions with no budget with Azure PowerShell, check each subscription's Budgets in the Azure portal, or run Altivane's Azure Budgets report for a workbook of the gaps.

By the Published

To find subscriptions without a budget in Azure, list each subscription's budgets through the Budgets API and keep the subscriptions that return none. A budget only sends alerts and never stops spending, and a budget that reaches its end date is deleted, so a subscription that had one can quietly lose it.

Choose the method that fits the job
MethodBest fit
PowerShellA CSV of the enabled subscriptions that have no budget.
Admin centreA quick look at 1 subscription's budgets and spending.
AltivaneRecommended for regular cost governance, with each budget's spend and thresholds in the same workbook.

Before you start

Use an account with the Reader or Cost Management Reader role on each subscription: both can view budgets but not create or change them. A new subscription can take up to 48 hours before budgets and other Cost Management features work. The example calls the Budgets REST API through Invoke-AzRestMethod, since Microsoft notes that the Az.Billing budget cmdlets are only available to Enterprise Agreement customers.

Know what counts. A subscription's list can also return budgets set on its resource groups, as the example in Microsoft's Budgets - List reference shows, so a subscription with only a resource group budget can count as having one; the filter after the script counts only the subscription's own. A budget set on a management group or a billing account belongs to that scope and isn't in the subscription's list. The example reads and exports, and changes nothing. The script's finally block disconnects the account and clears its saved Azure contexts.

Option 1

Find subscriptions without a budget with PowerShell

Install the module once. The script reads each enabled subscription's budgets and saves the subscriptions that have none.

PowerShell

Install-Module -Name Az.Accounts -Repository PSGallery -Scope CurrentUser
PowerShell

$ErrorActionPreference = 'Stop'
Connect-AzAccount -ErrorAction Stop
try {
    $subscriptions = @(Get-AzSubscription | Where-Object State -eq 'Enabled')
    if ($subscriptions.Count -eq 0) {
        Write-Output 'No enabled subscriptions are available to this account.'
        return
    }
    $rows = [System.Collections.Generic.List[object]]::new()
    foreach ($sub in $subscriptions) {
        $path = "/subscriptions/$($sub.Id)/providers/Microsoft.Consumption/budgets" +
            '?api-version=2024-08-01'
        $answer = Invoke-AzRestMethod -Path $path -Method GET
        if ($answer.StatusCode -ne 200) {
            Write-Warning "$($sub.Name) not read: HTTP $($answer.StatusCode)."
            continue
        }
        $budgets = @(($answer.Content | ConvertFrom-Json).value | Where-Object { $_ })
        if ($budgets.Count -eq 0) {
            $rows.Add([pscustomobject]@{ Subscription = $sub.Name; SubscriptionId = $sub.Id })
        }
    }
    if ($rows.Count -eq 0) {
        Write-Output 'Every subscription that was read has a budget.'
    } else {
        $rows | Sort-Object Subscription |
            Export-Csv -Path './subscriptions-without-budget.csv' -NoTypeInformation -Encoding utf8
        Write-Output "$($rows.Count) subscriptions saved to subscriptions-without-budget.csv."
    }
} finally {
    Disconnect-AzAccount | Out-Null
}

The CSV holds each subscription's name and ID. A subscription whose budgets couldn't be read is named in a warning and left out of the file, so it isn't mistaken for one with no budget. To count only budgets on the subscription itself, change the filter to Where-Object { $_ -and $_.id -notmatch '/resourceGroups/' }. To see each budget, export $budgets instead: its properties hold the amount, the current spend, the time grain and the notifications.

Option 2

Check budgets in the Azure portal

  1. Sign in to the Azure portal with an account that can read the subscription's costs.
  2. Choose All services > Subscriptions, then select the subscription.
  3. Choose Budgets in the menu. Each budget shows its current spending against the amount; an empty list means the subscription has no budget at this scope.
  4. Use the Scope pill to switch to another subscription or a management group, and repeat. Leave the page without choosing Add.

This suits a check of a few subscriptions. A resource group's budgets show under that resource group's own Budgets. For every subscription at once, use PowerShell or Altivane.

Common questions

Does a budget stop resources when it's reached?

No. Microsoft says budgets send notifications when a threshold is passed; resources aren't affected and consumption isn't stopped. Costs are evaluated against budgets every 24 hours.

A budget we created has gone. What happened?

A budget is deleted automatically when it expires. Budgets reset each period until their end date, so a budget made with a near end date disappears once that date passes.

What does each subscription cost at the moment?

Budgets compare spend with an amount; they don't break it down. See how to export cost by service and resource group in Azure.

Microsoft references

Technical references checked on 6 November 2026. The example scripts have been reviewed and syntax checked; they have not been run against a live tenant.

Talk to us about Altivane

Questions, or pricing? Get in touch.

Contact us