Most Azure bills don't grow because of one big mistake. They grow because of dozens of small things nobody owns. Here are the ten I find most often when I review a subscription, roughly in order of how much they usually save.
1. Unattached managed disks
Delete a VM and its disks stay behind unless you chose otherwise. Filter disks by Disk state = Unattached in the portal, confirm nobody needs them, snapshot if in doubt, then delete.
2. Old snapshots
Snapshots taken "just before the change" two years ago are still billed every month. Agree a retention period and tag snapshots with an expiry date.
3. Orphaned public IPs and load balancers
Standard public IPs are charged whether or not they're attached. The same goes for load balancers with empty backend pools.
4. Oversized VMs
VMs sized for a launch-day peak that never came. Look at 30 days of CPU and memory; anything averaging under 20% is a candidate for a smaller SKU or a burstable B-series.
5. Dev and test running 24/7
Non-production VMs only need to run in working hours. Auto-shutdown or a start/stop schedule cuts their compute cost by around 60%.
6. Premium disks where Standard SSD would do
Premium SSD on a dev box or a low-traffic file server is money spent on IOPS nobody uses.
7. Idle App Service plans
The app was deleted, the plan wasn't. An App Service plan is billed even with zero apps in it.
8. Log Analytics ingestion nobody reads
Verbose diagnostic settings on every resource can make monitoring one of your biggest line items. Check the Usage table to see which tables are growing, and use the Basic logs plan or shorter retention for noisy, rarely queried data.
9. No reservations or savings plans
Steady workloads running at pay-as-you-go rates. A one- or three-year reservation or savings plan for compute that runs all the time is usually the single biggest saving available.
10. Azure Hybrid Benefit not applied
If you already own Windows Server or SQL Server licences with Software Assurance, you can apply them to Azure VMs and SQL and stop paying for the licence twice.
Azure Advisor catches some of these, but not all, and it can't tell you which resources nobody owns. Tagging every resource with an owner and an environment makes every item on this list easier to fix.
Want a second pair of eyes?
I run fixed-price cost optimisation assessments, and I'm building a read-only Azure Cost Scanner that finds these automatically.