Originally published on PrepStack. Cross-posting the TL;DR here.
Finance pinged us on a Monday: our Azure bill was up ~150% month-over-month and still climbing — and nobody had shipped a "big" feature. This is the investigation on a real production SaaS (.NET 9 / ASP.NET Core, Angular 19, ~110k MAU, ~3,200 req/sec on Azure): the seven causes, and the fixes that cut the bill 60%.
Where the money went (before -> after)
| Cost driver | Spiked | After fix | What it was |
|---|---|---|---|
| Log / telemetry ingestion | $3,100/mo | $340/mo | A Debug log level left on -> GBs/day to App Insights |
| Compute (autoscale) | $3,400/mo | $1,500/mo | Scale-out rule, no scale-in |
| Orphaned resources | $1,900/mo | $0 | Load-test env + unattached disks/IPs |
| Egress / bandwidth | $1,200/mo | $280/mo | Large files, no CDN |
| SQL + Redis | $1,600/mo | $900/mo | Premium tiers + no reservations |
| Storage transactions | $500/mo | $190/mo | Millions of tiny blob ops, hot tier |
| AI / LLM tokens | $400/mo | $190/mo | Uncached RAG, oversized model |
| Total | ~$12,100/mo | ~$4,700/mo | -60% |
What it covers
- Turning the lights on first: tagging, a cost dashboard, anomaly alerts
- The diagnostic queries (
az consumption, KQL log-ingestion-by-source) - Before/after config for each fix (adaptive sampling, autoscale Bicep, blob lifecycle, CDN + compression, LLM caching + model routing)
- A FinOps checklist so it doesn't recur
- The honest limits of cost optimization
The lesson: most runaway bills are a visibility problem, not an architecture one — two config mistakes and some deleted waste did most of the work. ~3 days to fix, paid back in ~2.
Full post with real Azure config, queries, and dollar figures: https://prepstack.co.in/blog/azure-bill-spiked-how-we-cut-it-60-percent
Top comments (0)