Who should read this
TL;DR: For the same MVP workload, GCP runs roughly $30—50/month cheaper than AWS, and Azure is the most expensive unless you are on a Windows stack. Most of the cost gap comes not from the price sheet but from NAT Gateway charges, egress fees, and managed-service defaults. And as you move from Bootstrap to MVP to Growth, the “cheapest cloud” changes.
This article is for CTOs and backend leads at seed-to-Series A startups spending $200—$3,000/month on infrastructure. All prices are on-demand rates from each cloud’s official pricing pages as of April 2026, with no credits or Savings Plans applied.
At a glance: monthly cost across 3 stages and 3 clouds
| Stage | Workload profile | AWS | GCP | Azure |
|---|---|---|---|---|
| Bootstrap | Solo dev, ~1K req/mo, 1 database | $0—15 | $10—20 | $5—20 |
| MVP | 3—5 people, ~50K req/mo, API + web split | $120—160 | $70—110 | $90—130 |
| Growth | 10+ people, ~500K req/mo, multi-service | $350—500 | $220—360 | $310—520 |
AWS looks cheapest at the Bootstrap stage, but only because of the t4g.small free promotion (through December 2026) and the RDS Free Tier’s 750 hours. Once both expire, the AWS Bootstrap bill jumps to $40—60. There is no such thing as a “free cloud” — only a cloud where billing has not started yet.
Why the same workload costs different amounts
If you compare only the list price, per-vCPU hourly rates are nearly identical across all three clouds. The real differences come from three structural factors.
Free-tier design philosophy
AWS defaults to “free for 12 months.” The t4g.small 750 hours, RDS db.t4g.micro 750 hours, S3 5 GB — all expire 12 months after sign-up. When month 13 arrives, line items that were $0 suddenly start billing, adding $50—80 at once.
GCP runs Always Free tiers on Cloud Run, Cloud Functions, and parts of GCS with no 12-month limit. Cloud Run’s 180,000 vCPU-seconds per month (roughly 50 CPU-hours) is enough to run a Bootstrap-level SaaS API server at zero cost. The catch: Cloud SQL has no Always Free tier — even the smallest instance (db-f1-micro) costs $7+/month.
Azure uses a hybrid model — 12-month free offers plus some Always Free services. The App Service Free tier exists, but it lacks custom domains, SSL, and scale-out, making it unusable for production. In practice you start at B1 ($13.14/month).
Network and egress charges
All three clouds offer free inbound traffic but charge $0.08—0.12/GB for outbound (egress). So far, similar. The real divergence is in internal network charges.
AWS’s most notorious cost item is the NAT Gateway. Traffic from private subnets inside a VPC to the internet incurs $0.045/hour plus $0.045/GB for data processing. In a typical MVP stack, NAT Gateway alone can account for $32+ per month. GCP’s Cloud NAT has a similar structure but slightly lower data-processing fees. Azure’s NAT Gateway pricing is comparatively low, but outbound bandwidth kicks in at $0.087/GB after the first 5 GB.
Managed-service lock-in: fixed vs pay-per-use
Azure App Service uses per-instance fixed billing. The B1 tier costs $13.14/month whether you serve zero requests or 100K. Predictable, but wasteful at low utilization.
GCP Cloud Run bills on a request-based, pay-per-use model. You are charged only while a container is handling a request; when traffic drops to zero, the bill is $0. This is structurally favorable for early-stage startups with unpredictable traffic patterns.
AWS ECS Fargate bills by task runtime. The billing granularity is coarser than Cloud Run (1-minute minimum), and scale-to-zero is not the default — most teams keep at least one task running at all times. In practice, it behaves like a fixed cost.
AWS
Typical stack
EC2 t4g.small (or ECS Fargate) + RDS db.t4g.small (PostgreSQL) + S3 + CloudFront + Route 53.
Monthly cost breakdown
| Stage | Compute | DB | Storage + CDN | NAT | Total |
|---|---|---|---|---|---|
| Bootstrap | t4g.small free* | RDS Free Tier* | S3 ~$1 | — | $0—15 |
| MVP | Fargate 2 tasks ~$36 | RDS db.t4g.small ~$25 | S3 + CF ~$10 | ~$32 | $120—160 |
| Growth | Fargate 4 tasks ~$72 | RDS db.r6g.large ~$138 | S3 + CF ~$30 | ~$45 | $350—500 |
* Expires December 2026. After that, Bootstrap costs rise to $40—60.
3 hidden costs
- NAT Gateway: Required by default in a VPC private-subnet setup. Often accounts for 20—25% of the total MVP bill.
- CloudWatch Logs: Default log retention is unlimited. Left unchecked, this quietly adds $10—30/month. Set retention to 7 or 30 days explicitly.
- Inter-AZ data transfer: Even within the same region, cross-AZ traffic costs $0.01/GB. Multi-AZ RDS makes this surprisingly expensive.
Operational complexity
AWS has the most granular IAM permission model of the three clouds, which also means the steepest initial setup curve. You have to design VPC networking (subnets, security groups, NAT) yourself, and while CloudWatch provides basic monitoring, custom dashboards cost extra. A 3—5 person team with no prior AWS experience can easily spend the first two weeks just on networking configuration.
GCP
Typical stack
Cloud Run + Cloud SQL (PostgreSQL) + GCS + Cloud Load Balancing.
Monthly cost breakdown
| Stage | Compute | DB | Storage + LB | Cloud NAT | Total |
|---|---|---|---|---|---|
| Bootstrap | Cloud Run $0* | Cloud SQL micro ~$7 | GCS ~$1 | — | $10—20 |
| MVP | Cloud Run ~$15 | Cloud SQL small ~$30 | GCS + LB ~$20 | ~$10 | $70—110 |
| Growth | Cloud Run ~$40 | Cloud SQL custom ~$90 | GCS + LB ~$35 | ~$20 | $220—360 |
* Within the Always Free allowance (180,000 vCPU-seconds/month).
3 hidden costs
- Cloud SQL minimum cost: No Always Free tier, so even the smallest instance is $7/month — the “only fixed cost” at the Bootstrap stage.
- Cloud Logging volume: Log ingestion is on by default, and after 50 GB it costs $0.50/GB. Cloud Run’s stdout logs can generate surprisingly high volume.
- Premium Tier networking: GCP’s default network tier is Premium, making egress slightly more expensive than AWS. Switching to Standard Tier saves money but degrades performance.
Operational complexity
GCP’s strength is “opinionated defaults.” Cloud Run deploys with nothing more than a container image, and you barely need to know anything about networking. On the other hand, the project/folder/organization hierarchy is not intuitive, and service-account management gets confusing once it intersects with IAM roles. The Terraform provider also tends to lag behind AWS’s by one to two quarters.
Azure
Typical stack
App Service (B1—P1v3) + Azure SQL Database + Blob Storage + Azure Front Door.
Monthly cost breakdown
| Stage | Compute | DB | Storage + CDN | Total |
|---|---|---|---|---|
| Bootstrap | App Service Free to B1 ~$13 | Azure SQL Basic ~$5 | Blob ~$1 | $5—20 |
| MVP | App Service B2 ~$26 | Azure SQL S2 ~$50 | Blob + FD ~$20 | $90—130 |
| Growth | App Service P1v3 ~$73 | Azure SQL GP 2—4 vCore $200—$400 | Blob + FD ~$40 | $310—520 |
3 hidden costs
- Outbound bandwidth: $0.087/GB after the first 5 GB. For JSON-heavy API responses, this adds $10—20/month at the MVP stage.
- Azure SQL DTU tier jump: When Standard S2 ($50/month) runs out of headroom, the next option is Premium P1 ($465/month) — nearly a 10x increase. Starting with the vCore model gives you an intermediate step (General Purpose 2 vCore at $201/month).
- Log Analytics volume: Once integrated with Application Insights, data ingestion is billed by volume. After the 5 GB/month free allowance, it costs $2.76/GB.
Operational complexity
Azure shines when you need tight integration with the Windows, .NET, and Active Directory ecosystem. If an enterprise customer requires AD-based SSO, Azure is the fastest path. For other stacks (Node, Python, Go), it actually gets in the way. The portal, CLI, and PowerShell coexist in a fragmented tooling landscape that makes automation scripts hard to keep consistent, and a poorly designed resource-group layout at the start is painful to restructure later.
Selection framework — tradeoffs by team context
| AWS | GCP | Azure | |
|---|---|---|---|
| Linux + open-source stack | Good fit | Best fit | Poor fit |
| .NET / Windows stack | Workable | Poor fit | Best fit |
| Bursty traffic | Decent | Best fit (Cloud Run) | Poor fit (fixed billing) |
| Steady, predictable traffic | Best fit (RI/SP) | Decent | Good fit |
| Enterprise customers on board | Good fit | Decent | Best fit (AD integration) |
| ML / TPU workloads | Decent | Best fit | Decent |
| Terraform-centric IaC | Best fit | Good fit | Decent |
Pitfalls to avoid — 5 failure modes
Decision flow
Further reading
- Vercel vs Netlify vs Cloudflare Pages: 2026 Cost and Performance Comparison — Once you have picked your IaaS cloud, compare the frontend hosting layer too
- Supabase vs PlanetScale vs Neon: Choosing the Right Postgres for Your SaaS — Using a managed Postgres SaaS instead of RDS or Cloud SQL changes the cost equation
- Monitoring Stack Guide: Datadog vs Grafana vs New Relic — No point saving on cloud costs if observability eats it all back