How We Cut a Client's Azure Bill by 40%: A Real-World Cost Optimization Case Study
A detailed walkthrough of how CC Conceptualise reduced an enterprise client's Azure spend by 40% through systematic discovery, quick wins, and architectural optimization.
Every enterprise Azure environment has waste. The question is how much and where. In this case study, we walk through a real engagement where we reduced a client's Azure spend from approximately 82,000 EUR/month to 49,000 EUR/month — a 40% reduction — without degrading performance or reliability.
The client details are anonymized, but the numbers, approach, and timeline are authentic. This is how systematic cost optimization works in practice.
The Client Profile
Industry: Mid-market manufacturing company with digital operations Azure footprint: ~300 resources across 8 subscriptions Monthly Azure spend: ~82,000 EUR (trending upward at ~5% month-over-month) Team: 12-person IT department, 4 with Azure responsibilities Pain point: Azure costs had nearly doubled in 18 months with no corresponding increase in workload volume
The client had adopted Azure organically. Different teams provisioned resources as needed, there was no centralized governance, and nobody had a clear picture of what was running or why.
Optimization Phases
Phase 1: Discovery (Weeks 1-2)
We started with a comprehensive inventory and cost analysis. The goal was to understand where every euro was going before recommending any changes.
Tooling Used
- Azure Cost Management: 12-month cost trend analysis by subscription, resource group, resource type, and meter
- Azure Advisor: All cost recommendations across subscriptions
- Azure Resource Graph: Custom queries for resource inventory, configuration, and utilization
- Custom scripts: PowerShell-based utilization analysis pulling 30-day metrics for all VMs and databases
What We Found
The initial cost breakdown by category:
| Category | Monthly Cost | % of Total |
|---|---|---|
| Virtual Machines (IaaS) | 38,500 EUR | 47% |
| Azure SQL / Databases | 14,800 EUR | 18% |
| Storage (Blob, Disk, Files) | 8,200 EUR | 10% |
| Networking (VPN, ExpressRoute, LB) | 6,600 EUR | 8% |
| App Services / Functions | 5,400 EUR | 7% |
| Kubernetes (AKS) | 4,100 EUR | 5% |
| Other (Monitoring, Key Vault, etc.) | 4,400 EUR | 5% |
| Total | 82,000 EUR | 100% |
Key discovery findings:
- 68% of VMs were significantly over-provisioned. Average CPU utilization was 12%. Average memory utilization was 23%. Many VMs were provisioned for peak load that occurred once a quarter.
- 31 orphaned resources were identified: 14 unattached managed disks, 8 unused public IPs, 5 empty resource groups with associated resources, and 4 stopped VMs still incurring disk and IP costs.
- Zero commitment discounts. Everything was running on pay-as-you-go pricing. No Reserved Instances, no Savings Plans.
- Dev/test environments running 24/7. Three full development and two staging environments ran around the clock, including weekends and holidays.
- Premium storage tiers on non-performance-sensitive workloads. Several archival and logging storage accounts used Premium SSD when Standard HDD would suffice.
- SQL databases over-provisioned by 3-4x. Multiple Azure SQL databases running at S3/P1 tiers when S1/S2 would handle the actual workload.
- No Azure Hybrid Benefit applied. The client had existing Windows Server and SQL Server licenses through their Enterprise Agreement but had not activated AHUB on any Azure resources.
Phase 2: Quick Wins (Weeks 2-4)
Quick wins are changes that deliver immediate savings with minimal risk and no application architecture changes.
Quick Win 1: Orphaned Resource Cleanup
Action: Deleted 14 unattached managed disks, released 8 unused public IPs, removed 4 stopped VMs with their associated disks.
Monthly savings: 1,850 EUR
This was pure waste — resources costing money and serving no purpose. We validated each deletion with the responsible team to ensure nothing was intentionally preserved.
Quick Win 2: Dev/Test Auto-Shutdown
Action: Implemented Azure Automation schedules to shut down all dev/test VMs at 19:00 and restart at 07:00 on weekdays. Complete shutdown on weekends.
Calculation: Dev/test VMs accounted for ~11,200 EUR/month. Running 12 hours/day on weekdays only represents ~36% of 24/7 runtime.
Monthly savings: 7,200 EUR
Some teams initially resisted, concerned about availability for late-night work. We added a self-service restart mechanism via a Teams bot that any developer could use to start their environment on demand.
Quick Win 3: Azure Hybrid Benefit Activation
Action: Applied Azure Hybrid Benefit to all eligible Windows Server VMs (28 VMs) and SQL Server databases (6 instances).
Monthly savings: 4,600 EUR
This was free money. The client already paid for these licenses through their EA. AHUB simply applies the license to Azure resources, eliminating the Windows Server or SQL Server license component from the Azure bill.
Quick Win 4: Storage Tier Optimization
Action: Migrated 4 storage accounts from Premium SSD to Standard SSD, and 2 archival storage accounts to Cool tier. Moved 18 months of log data to Archive tier.
Monthly savings: 2,100 EUR
We ran performance tests before each migration to confirm no measurable impact on application performance.
Quick Win 5: Snapshot Cleanup
Action: Deleted 47 VM snapshots older than 90 days, totaling 4.2 TB. Implemented an automated policy to delete snapshots older than 30 days going forward.
Monthly savings: 380 EUR
Small individually, but these accumulate silently over time.
Total Quick Wins: 16,130 EUR/month (19.7% reduction)
Phase 3: Medium-Term Optimizations (Weeks 5-8)
Medium-term optimizations require more analysis, testing, and coordination with application teams.
Optimization 1: VM Right-Sizing
This was the largest single optimization. We analyzed 30 days of CPU, memory, network, and disk metrics for every production VM.
Methodology:
- Pull P95 utilization metrics for CPU and memory over 30 days
- Identify VMs where P95 CPU is below 40% AND P95 memory is below 60%
- Recommend one size down (or two sizes down for severely over-provisioned VMs)
- Validate with application owners
- Implement during maintenance windows with rollback capability
Results:
| VM Category | Count | Before (Monthly) | After (Monthly) | Savings |
|---|---|---|---|---|
| Production app servers | 14 | 12,400 EUR | 7,800 EUR | 4,600 EUR |
| Database servers | 6 | 8,200 EUR | 5,100 EUR | 3,100 EUR |
| Utility/infra VMs | 8 | 3,600 EUR | 1,900 EUR | 1,700 EUR |
| Total | 28 | 24,200 EUR | 14,800 EUR | 9,400 EUR |
Three application owners initially pushed back on right-sizing, concerned about peak performance. We implemented the changes with a 2-week observation period and automatic alerting if utilization exceeded 80%. None triggered.
Optimization 2: SQL Database Right-Sizing
Similar to VMs, we analyzed DTU/vCore utilization for all Azure SQL databases over 30 days.
Results:
| Database | Before | After | Monthly Savings |
|---|---|---|---|
| ERP Primary | P1 (125 DTU) | S3 (100 DTU) | 520 EUR |
| CRM Database | S3 (100 DTU) | S2 (50 DTU) | 230 EUR |
| Reporting DB | P1 (125 DTU) | S3 (100 DTU) | 520 EUR |
| Integration DB | S2 (50 DTU) | S1 (20 DTU) | 140 EUR |
| Logging DB | S3 (100 DTU) | S1 (20 DTU) | 340 EUR |
| Analytics DB | S3 (100 DTU) | S2 (50 DTU) | 230 EUR |
| Total | 1,980 EUR |
Optimization 3: Reserved Instance Purchases
With right-sized resources established, we could now make informed commitment purchases.
Purchases made:
- 3-year RIs for 18 production VMs (stable workloads): ~55% discount
- 1-year RIs for 6 database VMs (stable but may change size): ~33% discount
- 3-year reserved capacity for 4 Azure SQL databases: ~50% discount
Monthly savings from reservations: 5,400 EUR
We intentionally left dev/test and variable workloads on pay-as-you-go, and recommended reviewing for Savings Plans in 6 months once the new baseline stabilized.
Total Medium-Term Optimizations: 16,780 EUR/month
Phase 4: Structural Changes (Weeks 9-16)
Structural changes deliver the deepest long-term savings but require more effort and carry more risk.
Structural Change 1: PaaS Migration for Two Workloads
Two internal web applications were running on IaaS — dedicated VMs with Windows Server, IIS, and SQL Server. We migrated them to Azure App Service and Azure SQL.
Before: 2 VMs (D4s_v5) + 2 SQL Server VMs = ~3,200 EUR/month After: 2 App Service plans (P1v3) + 2 Azure SQL (S2) = ~1,100 EUR/month
Monthly savings: 2,100 EUR
The PaaS migration also reduced operational overhead — no more OS patching, IIS configuration, or SQL Server maintenance for these workloads.
Structural Change 2: AKS Node Pool Optimization
The AKS cluster was running 6 nodes of D4s_v5 permanently. Actual pod resource requests used roughly 40% of available capacity.
Changes:
- Reduced default node pool from 6 to 3 nodes
- Enabled cluster autoscaler (min 3, max 8)
- Added a Spot VM node pool for non-critical workloads
- Implemented pod resource limits to prevent over-requesting
Before: 6x D4s_v5 = ~1,740 EUR/month After: 3x D4s_v5 (baseline) + Spot scaling = ~750 EUR/month average
Monthly savings: ~990 EUR
Total Structural Changes: 3,090 EUR/month
The Complete Picture
Before and After Summary
| Category | Before (Monthly) | After (Monthly) | Savings |
|---|---|---|---|
| Quick wins (orphaned, schedules, AHUB, storage) | 82,000 EUR baseline | -16,130 EUR | 16,130 EUR |
| VM right-sizing | — | -9,400 EUR | 9,400 EUR |
| SQL right-sizing | — | -1,980 EUR | 1,980 EUR |
| Reserved Instances | — | -5,400 EUR | 5,400 EUR |
| PaaS migration | — | -2,100 EUR | 2,100 EUR |
| AKS optimization | — | -990 EUR | 990 EUR |
| New monthly total | 82,000 EUR | ~49,000 EUR | ~33,000 EUR (40%) |
Annualized Impact
- Annual savings: ~396,000 EUR
- Engagement cost: Approximately 6 weeks of consulting effort
- Payback period: Less than 1 month
- 3-year reserved instance savings included: The RI purchases lock in additional savings that grow more valuable as pay-as-you-go prices increase
Timeline and Effort
| Phase | Timeline | Effort Required | Risk Level |
|---|---|---|---|
| Discovery | Weeks 1-2 | Consultant-led, minimal client effort | None |
| Quick wins | Weeks 2-4 | Low — mostly cleanup and configuration | Low |
| Medium-term | Weeks 5-8 | Medium — requires application team coordination | Medium |
| Structural | Weeks 9-16 | High — architecture changes and migration | Medium-High |
What Made This Engagement Succeed
1. Data-Driven Decisions
Every recommendation was backed by 30+ days of utilization data. We never recommended changes based on assumptions or vendor sizing guides alone.
2. Application Team Buy-In
We involved application owners in every right-sizing decision. This took more time but eliminated resistance and ensured we did not miss performance-critical requirements.
3. Incremental Implementation
We did not try to change everything at once. Quick wins built credibility and momentum. Medium-term optimizations were implemented with rollback plans. Structural changes had full migration runbooks.
4. Governance for Sustainability
Cost optimization without governance is a one-time cleanup. We established:
- Monthly cost review cadence
- Tagging policy enforcement
- Budget alerts at subscription and resource group level
- Azure Advisor recommendation review process
- Dev/test auto-shutdown automation
5. Honest Scope Management
We recommended against several potential optimizations that would have added complexity without sufficient ROI:
- Migrating a legacy application to containers (high risk, moderate savings)
- Implementing spot VMs for production batch processing (insufficient fault tolerance in the application)
- Changing Azure regions for marginal pricing differences (latency impact not worth 3% savings)
Lessons Learned
Orphaned resources are universal. Every Azure environment we assess has them. The longer the environment has been running, the more waste has accumulated.
Right-sizing is the highest-ROI activity. VM and database right-sizing consistently delivers the largest savings with the lowest risk. Most enterprise resources are provisioned for worst-case scenarios that rarely occur.
Commitment discounts should come after right-sizing. Buying Reserved Instances for over-provisioned VMs locks in waste. Always right-size first, then commit.
Dev/test costs are a surprise. Organizations consistently underestimate how much they spend on non-production environments. Automated schedules and proper licensing (Visual Studio subscription dev/test pricing) can cut non-production costs by 60-80%.
Azure Hybrid Benefit is frequently overlooked. Clients with Enterprise Agreements often forget to activate AHUB, leaving significant savings on the table for zero effort.
Your Azure Environment
If your Azure costs have been growing faster than your workloads, the pattern described in this case study probably applies to your environment. The specific numbers will differ, but the categories of waste — over-provisioning, orphaned resources, missing commitment discounts, and 24/7 non-production environments — are remarkably consistent across enterprises.
At CC Conceptualise, we run Azure cost optimization engagements that follow this proven methodology. We bring the tooling, the analytical framework, and the experience to identify and capture savings quickly. Most clients see payback within the first month.
Want to know what 40% of your Azure bill looks like? Reach out to us at mbrahim@conceptualise.de for an initial assessment.
Topics