Most SaaS startups over-engineer their infrastructure. We have seen 3-person teams running Kubernetes clusters, multi-region setups, and service mesh architectures — for an app with 187 users.
We work with startups from pre-seed to Series B. The infrastructure that works at each stage is different, and the biggest mistake is building for scale you do not have yet. Here is the stack we actually recommend at each growth phase.
The Three Stages of Startup Infrastructure
Stage 1: MVP (0-1,000 users)
Goal: Ship fast, validate, spend < $100/month
Stage 2: Growth (1,000-50,000 users)
Goal: Reliable, automated, spend < $2,000/month
Stage 3: Scale (50,000+ users)
Goal: Scalable, observable, optimised
Stage 1: MVP (0-1,000 Users)
Goal: Get to market as fast as possible. Infrastructure should be invisible.
The Stack
| Component | Recommendation | Monthly Cost | Why |
|---|---|---|---|
| Hosting | Railway, Render, or Fly.io | $5-25 | Deploy with git push, zero ops |
| Database | Managed PostgreSQL (provider-included) | $0-15 | Never self-host a database at this stage |
| Cache | None (add later when needed) | $0 | Premature optimisation |
| CDN | Cloudflare (free tier) | $0 | Global edge caching |
| Resend or Postmark | $0-20 | Transactional email | |
| CI/CD | GitHub Actions | $0 | Free for public repos, generous free tier |
| Monitoring | Provider dashboard + Sentry | $0-26 | Error tracking is all you need |
| DNS | Cloudflare | $0 | Free DNS with proxy |
| Total | $5-86/month |
What NOT to Do at This Stage
- Do not set up Kubernetes. You do not have the users, the team, or the complexity to justify it. A recent analysis showed a startup that spent 6 months building Kubernetes infrastructure for 10,000 users when they had 187.
- Do not build microservices. Start with a monolith. Extract services later when you have clear domain boundaries and team growth that demands it.
- Do not multi-region. One region is fine until you have paying customers in other continents.
- Do not set up elaborate CI/CD. A simple GitHub Actions workflow that runs tests and deploys on merge to main is enough.
# All the CI/CD you need at Stage 1
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm test
- run: railway up # or render deploy, fly deploy
When to Move to Stage 2
- Your PaaS bill exceeds $200/month and growing fast
- You need background workers, scheduled jobs, or queues
- Your team grows to 5+ engineers
- You need more control over networking or security
Stage 2: Growth (1,000-50,000 Users)
Goal: Reliable infrastructure with automated deployments. You can afford to spend time on infrastructure, but it should not be a full-time job.
The Stack
| Component | Recommendation | Monthly Cost | Why |
|---|---|---|---|
| Cloud | AWS (ECS Fargate or App Runner) | $100-500 | Containers without managing servers |
| Database | RDS PostgreSQL (Multi-AZ) | $100-300 | Managed, backed up, encrypted |
| Cache | ElastiCache Redis | $30-100 | Session store, caching, queues |
| CDN | CloudFront | $10-50 | Static assets, API caching |
| Queues | SQS | $5-20 | Background job processing |
| IaC | Terraform | $0 | Infrastructure as code from here on |
| CI/CD | GitHub Actions | $0-40 | Automated testing and deployment |
| Monitoring | Prometheus + Grafana or Datadog | $0-200 | Metrics, alerts, dashboards |
| Error tracking | Sentry | $26-80 | Error reporting and performance |
| Logging | CloudWatch Logs | $20-100 | Centralised log aggregation |
| Secrets | AWS Secrets Manager | $5-20 | Never hardcode secrets |
| Total | $300-1,400/month |
Why ECS Fargate, Not Kubernetes
At this stage, we recommend ECS Fargate over Kubernetes for most startups:
- Fargate is serverless containers — no nodes to manage, no cluster upgrades
- Learning curve is significantly lower than Kubernetes
- Cost is comparable for small workloads
- You can migrate to EKS later when you outgrow Fargate
The only reason to start with Kubernetes at this stage is if your team already has Kubernetes expertise. If not, Fargate gives you containers without the operational overhead.
Infrastructure as Code
Start using Terraform at this stage. Every piece of infrastructure should be defined in code:
# Minimal Fargate service
resource "aws_ecs_service" "app" {
name = "my-saas-app"
cluster = aws_ecs_cluster.main.id
task_definition = aws_ecs_task_definition.app.arn
desired_count = 2
launch_type = "FARGATE"
network_configuration {
subnets = module.vpc.private_subnets
security_groups = [aws_security_group.app.id]
assign_public_ip = false
}
load_balancer {
target_group_arn = aws_lb_target_group.app.arn
container_name = "app"
container_port = 3000
}
}
CI/CD Pipeline
Upgrade from simple deploy scripts to a proper pipeline:
name: CI/CD Pipeline
on:
push:
branches: [main]
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm test
- run: npm run lint
deploy-staging:
needs: test
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
environment: staging
steps:
- uses: actions/checkout@v4
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-arn: ${{ vars.AWS_ROLE_ARN }}
aws-region: eu-west-1
- run: |
docker build -t $ECR/app:${{ github.sha }} .
docker push $ECR/app:${{ github.sha }}
aws ecs update-service --cluster main --service app \
--force-new-deployment
deploy-production:
needs: deploy-staging
environment: production # Manual approval gate
runs-on: ubuntu-latest
steps:
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-arn: ${{ vars.AWS_ROLE_ARN }}
aws-region: eu-west-1
- run: |
aws ecs update-service --cluster main --service app \
--force-new-deployment
When to Move to Stage 3
- Monthly cloud bill exceeds $2,000 and climbing
- You have 10+ services that need to communicate
- You need advanced networking (service mesh, network policies)
- Your team has 10+ engineers with dedicated platform/DevOps capacity
- You need autoscaling beyond what Fargate provides
- Multi-region is a real business requirement (not a nice-to-have)
Stage 3: Scale (50,000+ Users)
Goal: Scalable, observable, cost-optimised infrastructure. You can justify dedicated platform engineering.
The Stack
| Component | Recommendation | Monthly Cost | Why |
|---|---|---|---|
| Orchestration | EKS with Karpenter | $500-5,000 | Autoscaling, multi-service orchestration |
| Database | RDS (Multi-AZ, read replicas) | $300-2,000 | Scalable, performant, managed |
| Cache | ElastiCache Redis (cluster mode) | $200-800 | High-throughput caching |
| CDN | CloudFront | $50-500 | Global content delivery |
| Queues | SQS + EventBridge | $20-200 | Event-driven architecture |
| IaC | Terraform + Ansible | $0 | Provisioning + configuration |
| CI/CD | GitHub Actions + ArgoCD | $0-100 | GitOps deployment |
| Monitoring | Prometheus + Grafana | $0 (self-hosted) | Full observability stack |
| Logging | Loki or ELK | $0-500 | Centralised log management |
| Service mesh | Istio or Linkerd | $0 | Service-to-service security |
| Cost management | Kubecost | $0 | Namespace-level cost tracking |
| Total | $1,000-10,000/month |
Now Kubernetes Makes Sense
At this stage, Kubernetes is justified because:
- Multiple teams deploy independently to the same cluster
- Autoscaling handles traffic spikes with HPA and Karpenter
- Resource efficiency — bin-packing saves money vs. Fargate at scale
- Ecosystem — Helm charts, operators, and tooling accelerate development
- Portability — not locked into a single cloud provider
GitOps for Deployment
At scale, replace imperative deployments with GitOps:
# ArgoCD Application
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-saas-app
spec:
project: default
source:
repoURL: https://github.com/org/k8s-manifests
targetRevision: main
path: apps/my-saas-app/production
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true
selfHeal: true
Every deployment is a Git commit. Every rollback is a git revert. Full audit trail without additional tooling.
The Scaling Decision Matrix
Revenue Stage → Infrastructure Recommendation
Pre-revenue / MVP
└── PaaS (Railway, Render, Fly.io)
No Terraform, no Kubernetes, no microservices.
$0-$50K MRR
└── AWS ECS Fargate + RDS + Terraform
Containers without cluster management.
$50K-$500K MRR
└── EKS + Karpenter + GitOps
Full Kubernetes with cost optimisation.
$500K+ MRR
└── Multi-region EKS + Service Mesh + Platform Team
Dedicated platform engineering.
Common Mistakes We Fix
1. Kubernetes at Pre-Seed
A 3-person startup with $50K ARR running a 6-node EKS cluster costing $800/month. The same app ran on a $25/month Railway instance. We migrated them off Kubernetes and saved $9,000/year — money better spent on product development.
2. No Infrastructure as Code
A Series A startup managing all infrastructure through the AWS console. When their lead engineer left, nobody could recreate or modify the infrastructure. We Terraformed everything in 2 weeks and eliminated that single point of failure.
3. Ignoring Database Performance
A SaaS app hitting performance issues at 10,000 users. The fix was not Kubernetes or microservices — it was adding a database index and a Redis cache layer. Total cost: $30/month for ElastiCache. Always solve the actual bottleneck before adding infrastructure complexity.
4. No Monitoring Until Production Goes Down
Teams ship without monitoring, then scramble to debug production issues by reading raw logs. Set up basic monitoring (even just uptime checks + error tracking) from day one. See our application monitoring guide for what to track.
5. Over-Engineering CI/CD
A startup with 3 engineers and 1 service running a Jenkins server with 15 plugins, shared libraries, and custom Groovy scripts. We migrated them to GitHub Actions — 20 lines of YAML replaced 500 lines of Groovy.
The Stack We Use for Our Own Products
For context, here is what we run at Tasrie IT Services:
- Website: Astro on Cloudflare Pages (static, zero server costs)
- Internal tools: Docker containers on a single VPS
- CI/CD: GitHub Actions
- IaC: Terraform for client infrastructure
- Monitoring: Prometheus + Grafana
We practice what we preach. Simple infrastructure for simple needs. Kubernetes for clients who actually need it.
Need Help Setting Up Your Startup’s Infrastructure?
We help startups build infrastructure that matches their stage — from $5/month PaaS setups to production Kubernetes clusters.
Our startup infrastructure services include:
- Stage 1 setup — deploy to Railway/Render with CI/CD in an afternoon
- Stage 2 migration — move to AWS with Terraform, ECS, and proper monitoring
- Stage 3 scaling — EKS with Karpenter, GitOps, and cost optimisation
- Technical debt cleanup — fix infrastructure shortcuts that accumulate
- Fractional DevOps — part-time infrastructure expertise without a full-time hire
We also offer a free 30-minute consultation to assess your current setup and recommend next steps.