You picked serverless to save money. Now your bill looks like a horror movie.
This is a story we’ve lived twice at our transportation SaaS platform.
We started with Azure Functions on the Consumption plan because it promised “pay only for what you use.” That lasted until our delivery status sync job ran 24/7, processing 50,000 daily events. We scaled to Premium, then Dedicated. By the time we hit the bill, we realized we were paying more than if we’d just rented an App Service.
Here’s what we learned.
The ComputePlan Spectrum
| Plan | Startup Time | Billing Model | Best For |
|---|---|---|---|
| Consumption | 1-10s | Per execution (100ms increments) | Bursty, unpredictable workloads |
| Premium | < 1s | Always-on + variable | Predictable mid-range load |
| Dedicated (App Service) | < 100ms | Fixed monthly | Sustained, high-throughput load |
| Container Apps (vCPU-seconds) | 0.5-2s | Per-vCPU per second | Containers with flexible scaling |
| App Service Plan | < 100ms | Fixed monthly | Traditional web apps, APIs |
Real-World Case Study: Delivery Status Sync
Our delivery status sync pulls updates from carrier APIs every 5 minutes for 50,000 active shipments.
Option 1: Consumption Plan (The Dream)
| |
Monthly Cost (US East 2, 2024 pricing):
Executions: 50,000 × 30 days = 1.5M executions
Free tier: 1M executions/month = 500k paid executions
Cost per million: $0.20
Executions: $0.10
Memory: 1.5M × 0.2s × 256MB = 77,000 GB-seconds
Cost per GB-second: $0.000016
Memory: $1.20
Cold starts: ~5% = 75,000 extra executions
Cold starts: $0.015
Total: ~$1.30/month
In theory, this is incredible.
Option 2: Consumption Plan (The Reality)
In reality:
- Cold starts in winter (off-peak) cause 5-10 second delays
- Customers complain: “Why isn’t my delivery tracking updating?”
- You add parallel processing to speed things up: now 200 executions/day per shipment
- Executions jump to 10M/month
| |
Still cheap! But now you’re also paying for the Premium plan tier limits you hit, so you move to Premium.
Option 3: Premium Plan
| |
You start with 1 instance. Auto-scaling kicks in:
- Afternoon peak: 3 instances = $1,080/month
- But you’re only getting 60-70% CPU utilization
Reality: $900/month for underutilized capacity.
Option 4: Dedicated App Service Plan
| |
You consolidate:
- Delivery status sync function
- Order webhook handler
- Customer notification service
- Reporting API
Total: ~$87/month for 4 microservices.
Option 5: Container Apps
| |
Plus storage and log ingestion. In practice: ~$15-20/month.
This is newer infrastructure, so we haven’t fully migrated yet, but the math is compelling.
Decision Framework: Choosing Your Compute Service
Use Consumption Functions When:
- ✓ Truly unpredictable traffic (minutes between executions)
- ✓ Small daily execution count (< 1M)
- ✓ Okay with cold start latency
- ✓ Examples: Webhook handlers, scheduled cleanup jobs
Use Premium Functions When:
- ✓ ~500k-2M executions/month
- ✓ Need faster startup than Consumption
- ✓ Want predictable monthly costs
- ✓ Can’t move to App Service yet
Use Dedicated App Service When:
- ✓ 2M+ executions/month OR sustained load
- ✓ Latency-sensitive (no cold starts)
- ✓ Hosting multiple services on same plan
- ✓ This is our platform’s status sync today
Use Container Apps When:
- ✓ Container-native workloads
- ✓ Complex scaling requirements
- ✓ Want consumption-based pricing at app scale
- ✓ Multi-container orchestration
The Real Cost Analysis
For our transportation platform’s delivery status sync:
| Metric | Consumption | Premium | App Service | Container Apps |
|---|---|---|---|---|
| Monthly Base | $0-5 | $360-600 | $87-174 | $15-40 |
| Cold Start Impact | High | None | None | Minimal |
| Scaling Efficiency | 90% | 40% | 70% | 95% |
| Consolidated Services | 1 | 1 | 4-5 | 2-3 |
| Effective Cost (per service) | $0.30-5 | $360-600 | $17-30 | $7-20 |
How We Migrated
Step 1: Identify the Problem
| |
Step 2: Right-Size with Real Data
| |
Step 3: Cost Estimate
- Consumption: $2-5/month (but with slow cold starts)
- Premium: $400/month (overkill)
- App Service B2: $87/month (hosting 4 services)
- Savings: $300/month on Premium, but also gains reliability
Step 4: Test Migration
| |
The Hidden Costs You Forgot
- Data transfer: Egress to carrier APIs costs money
- Storage: Logging, event history, backups
- Database: RUs in Cosmos, connections on SQL
- Monitoring: Application Insights ingestion
- VNet integration: Extra fees for Premium/Dedicated
For our platform, our “Functions” workload actually looked like this:
| |
When we moved to App Service + consolidation:
| |
But with 5x throughput capacity and 20x lower latency. Worth it.
Tools for Cost Analysis
| |
Or use Azure CLI:
| |
The Decision Today
For our platform in 2026:
- Event handlers & webhooks: Consumption (truly bursty)
- Status sync job: Dedicated App Service (predictable high volume)
- Customer notifications: Container Apps (exploring)
- Report generation: Time-triggered Premium Functions (medium load)
Total monthly: ~$250 (all compute services combined)
The lesson: Serverless doesn’t always mean cheaper. Know your traffic patterns, measure real costs, and don’t fear moving off the hype train if a different service makes financial sense.
Use the right tool. Not the trendy one.
