Azure bills are frustrating because the waste is almost never obvious. It hides in places you forget to check. This post covers the most common sources of wasted Azure spend I've seen across multiple subscriptions — with the exact CLI commands to find them.
Unattached Managed Disks
When you delete a VM in Azure, the disks are not automatically deleted unless you explicitly checked the box at creation time. Most teams don't. The result: dozens of orphaned disks billing you every month for nothing.
Find them:
az disk list --query "[?diskState=='Unattached'].{Name:name, Size:diskSizeGb, SKU:sku.name, RG:resourceGroup}" -o table
A Premium SSD P30 (1 TB) costs around €130/month. A P20 (512 GB) around €65/month. Run this command on a subscription that has been active for 2+ years and the results are usually surprising.
Oversized VMs Running at Low CPU
Pull 14 days of average CPU for all your VMs:
az monitor metrics list \
--resource /subscriptions/{sub-id}/resourceGroups/{rg}/providers/Microsoft.Compute/virtualMachines/{vm-name} \
--metric "Percentage CPU" \
--interval PT1H \
--aggregation Average \
--start-time 2026-04-17T00:00:00Z \
--end-time 2026-05-01T00:00:00Z \
--output table
Any VM averaging under 10% CPU with peaks under 40% is a strong candidate for downsizing. A D8s_v3 → D4s_v3 saves ~50% of that VM's cost with no performance impact for low-utilisation workloads.
Unused Public IP Addresses
Static IPs are €3–5/month each. Subscriptions accumulate them.
az network public-ip list --query "[?ipConfiguration==null].{Name:name, RG:resourceGroup, SKU:sku.name}" -o table
Dev/Test VMs Without Auto-Shutdown
Any VM that runs overnight and on weekends when nobody uses it is burning ~65–70% of its cost for nothing. Enable auto-shutdown:
az vm auto-shutdown -g {resource-group} -n {vm-name} --time 1900
Set the time in UTC. This single command can cut a dev VM's monthly cost by more than half.
Storage Accounts Still in Hot Tier
Old backups, log archives, and export files sitting in Hot tier cost 3–9x more than they should.
az storage account list --query "[].{Name:name, Kind:kind, AccessTier:accessTier, RG:resourceGroup}" -o table
Check each storage account's actual access patterns in Azure Monitor. Anything accessed less than once a month belongs in Cool or Archive tier.
I built Prunr to automate all of this — it runs scanners across your Azure subscription and surfaces the specific resources wasting money with savings estimates, in about 30 seconds. Free tier available. But the CLI commands above will get you started without any tooling.
What waste patterns have you found in Azure subscriptions? Curious what others are seeing.
Top comments (0)