Azure bills are sneakier than AWS bills. Where AWS lists every line item, Azure rolls a lot of charges under "resource" entries that look benign until you sum them. The good news: 60 seconds of CSV work surfaces almost all of it.
Step 1 — Export the CSV (90 seconds)
In the Azure Portal:
- Cost Management + Billing → pick the scope (subscription, management group, or billing account)
- Cost Analysis → set Granularity: Daily and Group by: Service name
- Export → CSV (top right). You'll get a file like
AzureCosts-2026-01.csv
💡 If you have multiple subscriptions, do this at the Billing Account scope. Service-by-service waste only shows up when you can see everything in one CSV.
Step 2 — The 5 columns that matter
| Column | What it tells you |
|---|
MeterCategory | The Azure service family (e.g. Virtual Machines) |
MeterSubCategory | The specific SKU (e.g. Dv4/Dsv4 Series) |
Quantity | How much you used |
Cost or PreTaxCost | What you paid |
ResourceLocation | Which region |
Sort descending by Cost. The top 25 rows are usually 80%+ of your bill.
Step 3 — The 5 Azure-specific patterns
1. Always-on App Service plans (the $1K/month nobody catches)
MeterCategory = "Azure App Service". Sum Cost per resource. Most teams keep dev/staging plans on Premium tier for one feature they don't use. The fix is dropping back to Standard or Basic for non-prod — same web app keeps running, you cut the plan cost 40–70%.
2. Cosmos DB provisioned RU/s sitting idle
MeterCategory = "Azure Cosmos DB". Look at MeterSubCategory rows containing Request Unit. Then check if your actual workload hits the provisioned RU/s — most teams over-provision by 3–10×. The fix is autoscale mode — same SLA, 30–60% cheaper.
3. Unattached Managed Disks (the orphan problem)
MeterCategory = "Storage" AND MeterSubCategory contains "Premium SSD Managed Disks". Compare disk count vs VM count. Any disk that's not attached to a running VM is just sitting there racking up cost. Common after teams delete a VM without picking the "delete disk" checkbox.
4. Azure SQL Database Premium tier on dev
MeterCategory = "SQL Database". Check the SKU — if you see Premium / Business Critical on databases that aren't production, you're paying enterprise pricing for a dev sandbox. Move dev to Standard or General Purpose. Median savings: $400–$1500/month per database.
5. Bandwidth (the surprise multiplier)
MeterCategory = "Bandwidth". Inter-region traffic in Azure is $0.02/GB; egress to internet is $0.05–$0.087/GB. Most "Bandwidth" surprises come from a misconfigured Front Door or cross-region replication. Compare bandwidth cost to compute cost — if bandwidth > 8% of compute, you have an unintentional egress source.
Step 4 — Reserved Instances and Savings Plans aren't optional
If your Azure spend is above ~$5K/month and you don't have a Reserved Instance or Savings Plan, you're voluntarily paying 30–60% extra. Run Advisor → Reservations to see Azure's own recommendation. Most teams find $5–20K/month of immediate savings.
Step 5 — The 60-second pivot
Pivot the CSV by:
- Rows:
MeterCategory
- Columns:
ResourceLocation
- Values:
Cost (sum)
Any region you don't recognize? Old test deployment. Any service category that's >25% of your bill that you can't immediately explain? That's where the leak is.
Step 6 — Get the audit done for you, free
CARTIE's free Azure bill audit ingests your CSV in seconds, ranks your top 5 cost leaks by $/month with the exact MeterCategory + SubCategory, and gives you the precise Azure CLI command to verify each. No credentials, no retention, no signup.
If you'd rather we plug into Azure and send pull requests for every leak we find, that's CARTIE for Azure.
Related: The Hidden 32% Cloud Waste No FinOps Tool Is Showing You.