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.
| Method | Best fit |
|---|---|
| PowerShell | A CSV of the enabled subscriptions that have no budget. |
| Admin centre | A quick look at 1 subscription's budgets and spending. |
| Altivane | Recommended 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.
Install-Module -Name Az.Accounts -Repository PSGallery -Scope CurrentUser
$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
- Sign in to the Azure portal with an account that can read the subscription's costs.
- Choose All services > Subscriptions, then select the subscription.
- 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.
- 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.
Option 3 ยท Recommended for regular cost governance
Find subscriptions without a budget with Altivane
- Open Altivane and choose the tenant.
- Run the Azure Budgets report.
- Open the Excel workbook and find Subscriptions without a budget: each subscription in use with no budget, by name and ID.
- Read Budgets for each budget's amount, spend, share used, period and alert thresholds.
Altivane reads the budgets of every subscription where you gave it the Reader role. A subscription whose budgets couldn't be read isn't listed as having none: it is left out of the table, named on the workbook's Not read sheet, and the report is marked partial. The Azure Governance scorecard report counts subscriptions with no budget for the tenant's Word report.
Contact usCommon 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.