Skip to content
All posts

AWS Is a 5x Tax Most Small SaaS Teams Never Question

April 10, 2026·Read on Medium·

The math between Hetzner, Digital Ocean and AWS is not close, and it compounds every month you ignore it.

Every startup I have spoken to in the last two years runs on AWS. Not because they evaluated alternatives. Not because they needed Lambda and EKS and GuardDuty from day one. They chose AWS because AWS is what engineers default to when nobody has done the math.

The default costs you money. Real, compounding, monthly money that shows up on a bill, gets approved on autopilot and quietly funds Amazon’s infrastructure ambitions on behalf of your small SaaS with four hundred paying users.

This is not a post about migrating off the cloud. It is a post about doing the math you probably skipped.

The Anatomy of an AWS Bill Nobody Reads Closely

AWS pricing is not designed to be understood at a glance. It is designed to be accepted. Compute is billed per hour. Storage is billed per GB-month. Data transfer is billed per GB in ways that vary depending on which direction the traffic flows, which region it crosses and whether you are talking about inter-AZ traffic, internet egress or transfers to other AWS services. There are entire companies whose business model is parsing your AWS bill and finding the waste you missed.

The managed services premium is real and it compounds fast. Consider AWS RDS, the managed PostgreSQL offering. A db.m5.large instance in a Single-AZ configuration costs approximately $140 per month in us-east-1. That is 2 vCPUs and 8 GB of RAM. You also pay $0.115 per GB-month for General Purpose SSD storage. Backup storage beyond your allocated database size is billed separately. Outgoing data transfer is $0.09 per GB after the first 100 GB free tier.

Now contrast that with running PostgreSQL yourself on a Hetzner Cloud VPS. Their entry-level CX11 (1 vCPU, 2 GB RAM) costs €3.49 per month and includes 20 TB of outbound traffic per month. Not 20 GB. 20 TB. Move up to a server with enough headroom for a real production database and you are still looking at single-digit or low double-digit euros per month, with bandwidth that would cost you hundreds of dollars in AWS egress fees included by default.

The point is not that Hetzner is perfect. The point is that you are probably paying a 5x to 10x premium for managed infrastructure complexity that your team does not actually need yet.

Running the Numbers on a Real Small SaaS

Let me build a realistic infrastructure comparison. The scenario: a Laravel or FastAPI application serving around ten thousand active users, a PostgreSQL database, background workers and file storage.

AWS (on-demand, us-east-1):

  • 2x t3.medium app servers (2 vCPU, 4 GB RAM): $30.37/month each = $60.74/month
  • db.m5.large RDS PostgreSQL, Single-AZ (2 vCPU, 8 GB): ~$140/month
  • 100 GB GP2 storage for RDS: ~$11.50/month
  • S3 file storage, 100 GB at $0.023/GB-month: ~$2.30/month
  • Egress: 500 GB/month at $0.09/GB after free tier: ~$45/month
  • Application Load Balancer: ~$20/month minimum
  • Running total: approximately $280/month

Hetzner equivalent:

  • 2x small cloud VPS (2 vCPU, 4 GB RAM, 20 TB traffic included): approximately €12/month total
  • Dedicated database VPS (4 vCPU, 8 GB RAM) for self-hosted Postgres: approximately €14/month
  • Hetzner Object Storage for files (100 GB at $4.90/TB-month): ~$0.49/month
  • Egress: included in the VPS traffic allowance
  • Load balancer (Hetzner LB11): ~€5/month
  • Running total: approximately €31/month, or ~$34/month

That is not a rounding error. That is roughly an 8x difference in monthly infrastructure spend for equivalent capacity. Even if you layer Cloudflare Pro at $25/month on top for CDN, SSL termination and DDoS mitigation, you land at around $60/month versus $280/month.

Over a year that gap is $2,640. Over two years it is $5,280. That is real developer salary, tooling budget or runway. For a bootstrapped team, that math matters.

The Managed Services Defense (And Its Limits)

The standard counter-argument goes like this: AWS managed services save ops time, and ops time is expensive.

This is true in specific conditions. It is also used as a blanket justification that never gets interrogated.

AWS RDS automated failover, point-in-time recovery and automated minor version updates solve real problems. If you have a two-person team where neither person wants to think about Postgres replication, paying for RDS is defensible. If your compliance framework requires specific vendor certifications, AWS provides those and Hetzner does not.

But here is what the managed services argument glosses over: the ecosystem for “managed without the AWS tax” has matured considerably. Supabase offers managed PostgreSQL with row-level security, realtime subscriptions, auth and storage. Their Pro plan starts at $25 per month. Neon runs serverless PostgreSQL that scales to zero when idle. Fly.io runs Dockerized applications globally for a fraction of what ECS charges. Cloudflare R2 gives you S3-compatible object storage with zero egress fees.

Managed does not mean AWS-managed anymore. That conflation is costing your team money.

Self-Hosting Postgres Is Not as Scary as You Think

The biggest objection I hear to leaving RDS is the database going down. Fair concern. Here is what a production-worthy setup on a VPS actually looks like:

# docker-compose.yml
version: '3.8'
services:
postgres:
image: postgres:16
restart: unless-stopped
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_NAME}
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "127.0.0.1:5432:5432"
shm_size: 256mb

pg_backup:
image: prodrigestivill/postgres-backup-local
restart: unless-stopped
environment:
POSTGRES_HOST: postgres
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_NAME}
SCHEDULE: "@daily"
BACKUP_KEEP_DAYS: 7
BACKUP_KEEP_WEEKS: 4
volumes:
- /mnt/backups:/backups
depends_on:
- postgres
volumes:
postgres_data:

Add a daily pg_basebackup to Hetzner Object Storage at $4.90 per TB-month versus S3's $23 per TB-month, and you have a backup pipeline that costs less than $1 per month. WAL archiving gives you point-in-time recovery. A Postgres streaming replica on a second VPS gives you a read replica and a hot standby for the price of one more server.

None of this is novel. It is what the internet ran on before “managed” became a synonym for “let the cloud vendor handle it and pay 10x.”

When the AWS Premium Is Actually Worth It

I want to be precise here rather than tribal.

You need AWS or a comparable hyperscaler when your compliance requirements mandate it. FedRAMP, SOC 2 Type II with specific infrastructure scope, certain healthcare regulations and financial certifications sometimes require vendor certifications that smaller providers do not carry. This is a real constraint, not a preference.

You need AWS when you are operating at a scale where auto-scaling to hundreds of instances during traffic spikes is a routine event, not a hypothetical. At that scale, managed orchestration, global CDN and the depth of the AWS tooling ecosystem justify the cost.

You need AWS when your engineering team is large enough that the operational overhead of managing servers is genuinely a bottleneck. A team of twenty engineers touching infrastructure is a different problem from a team of three.

You need AWS if your architecture depends heavily on AWS-native services: Lambda functions triggering on S3 events, Step Functions orchestrating workflows, SageMaker pipelines. Lock-in to AWS-native services is a legitimate reason to stay.

None of those scenarios describe most SaaS companies under 100k users. Most chose AWS because it was familiar.

The Migration Objection

Some engineers respond with: what about when we scale?

This assumes migrating to AWS is hard once you have grown. It is not. If you are running containerized applications, your workload is already portable. Docker Compose on a VPS and ECS on AWS are not architecturally different enough to make migration a serious obstacle. The difference is operational convention, not fundamental incompatibility.

The real migration cost is not technical. It is psychological. Once you are on AWS, every new service gets provisioned there because it is familiar. Managed services accumulate. Costs compound. The sunk cost calculus argues for staying put even when the math no longer works.

Starting on a cheaper provider does not trap you. It keeps your optionality open while your runway is most constrained.

Pieter Levels, who runs multiple profitable solo SaaS products, put it directly: “savings from AWS to Hetzner are about 5–10x.” DHH called Hetzner “in a league of its own on pricing.” These are not ideological positions. They are people who have done the math.

A Stack Worth Pricing Out

For any SaaS team under 100k users, this stack is worth comparing against your current bill:

Compute: Hetzner Cloud or Fly.io for applications. Both give you reliable VMs or managed containers without the AWS pricing structure.

Database: Self-hosted Postgres on a dedicated VPS for teams with any ops confidence, or Supabase Pro at $25/month for a managed alternative that does not cost $140/month for a medium instance.

CDN and security: Cloudflare Free or Pro. Handles SSL termination, DDoS mitigation and caching. You were probably paying for these separately on AWS.

Object storage: Hetzner Object Storage at $4.90/TB-month or Cloudflare R2 with zero egress fees. Both undercut S3 significantly.

Monitoring: Grafana Cloud free tier handles basic metrics and alerting. Betterstack covers log management and uptime monitoring at low cost.

The conservative total for this stack runs $50 to $80 per month for a small production SaaS. The AWS equivalent runs $250 to $400 per month before you add the managed services that tend to accumulate once you are inside the console.

Stop Inheriting Defaults

Every infrastructure decision has a default state. The AWS default exists because AWS is what senior engineers used at larger companies, what startup credits subsidize during early growth and what conference talks assume you are running.

Defaults are not strategies. They are the absence of one.

Pull your actual monthly AWS bill. Compare it line by line against Hetzner or Digital Ocean pricing for the same specs. If the difference is $30 per month, stay on AWS. If the difference is $200 per month and your team is three people with twelve hundred users, that is a conversation worth having before you commit to another year of Reserved Instances.

The best infrastructure decision is the one you made with accurate numbers in front of you. The worst is the one you made in a Slack thread four years ago and never revisited.

Your bill is trying to tell you something. Whether you listen is a choice.

Found this helpful?

If this article saved you time or solved a problem, consider supporting — it helps keep the writing going.

Originally published on Medium.

View on Medium
AWS Is a 5x Tax Most Small SaaS Teams Never Question — Hafiq Iqmal — Hafiq Iqmal