The Real Cost of 'Free' Vercel Deployments
Vercel's free tier is bait. Here's how we deploy production apps on Cloudflare Pages for $0/month and Hetzner for $50/month.
Core Concept
Every Next.js tutorial says: “Deploy to Vercel in one click!”
The trap:
- Free tier: 100GB bandwidth/month
- You hit that in Week 2 with 5K users
- Vercel Pro: $20/month (still limited)
- Vercel Enterprise: $thousands/month
At scale, Vercel costs 10x more than self-hosting.
The Constraint
The hidden costs of Vercel:
| Usage Tier | Bandwidth Limit | Cost | Actual Cost at 10K Users |
|---|---|---|---|
| Hobby (Free) | 100GB/month | $0 | N/A (you’ll exceed this) |
| Pro | 1TB/month | $20/mo | $20 (if you’re lucky) |
| Overages | Per GB | $0.15/GB | +$300/mo (if you serve images) |
Math:
- 10K users × 50MB/month = 500GB bandwidth
- Free tier covers 100GB
- Overage: 400GB × $0.15 = $60/month
For a static site that could be $0 on Cloudflare Pages.
The Solution
We use different platforms for different app types.
1. Static Sites → Cloudflare Pages (Free)
Best for: Landing pages, blogs, documentation
Why:
- Unlimited bandwidth (truly free)
- Global CDN (180+ data centers)
- Automatic HTTPS
- Deploy via GitHub (same DX as Vercel)
Cost: $0/month (even at 1M visitors)
How to deploy:
# Connect your repo to Cloudflare Pages
# Set build command: npm run build
# Set output directory: dist
# Done.
We use this for:
- Company website (this site)
- Documentation sites
- Portfolio pages
2. Dynamic Apps → Hetzner VPS ($50/month)
Best for: Apps with backend, APIs, databases
Why:
- 8 vCPU + 16GB RAM for $50/month (vs $200/month on AWS)
- European data centers (GDPR compliant)
- 99.9% uptime SLA
- No bandwidth overages
How to deploy:
# Docker Compose + Caddy reverse proxy
docker-compose up -d
We use this for:
- API servers (Node.js, Rust)
- Background workers
- Ollama inference (AI models)
3. Edge Functions → Cloudflare Workers ($5/month)
Best for: API endpoints, middleware, webhooks
Why:
- 10M requests/month on free tier
- Sub-10ms latency globally
- V8 isolates (not containers, so instant cold start)
We use this for:
- Image resizing (on-the-fly)
- Stripe webhooks
- Geolocation-based routing
The Architecture Comparison
Vercel setup (expensive):
Next.js on Vercel: $20/mo base + overages
Database: $25/mo (PlanetScale/Supabase)
Images: $50/mo (Vercel image optimization)
Total: $95/month (at 10K users)
Our setup (efficient):
Astro on Cloudflare Pages: $0/mo
API on Hetzner VPS: $50/mo
Database: Supabase (included in VPS budget)
Images: Cloudflare R2 ($1/mo)
Total: $51/month (at 10K users)
Savings: $44/month = $528/year per project
At 10 ventures: $5,280/year saved.
The Trade-Off
What you lose:
- One-click deploys (you need basic DevOps)
- Vercel Analytics (use Plausible instead)
- Preview deployments (Cloudflare has this too)
What you gain:
- 50% lower costs
- No vendor lock-in (move hosts in 1 hour)
- Better performance (Cloudflare’s CDN > Vercel’s)
- Learning (you own your infrastructure)
The Deployment Script
Our standard deploy (Hetzner VPS):
# SSH into server
ssh root@your-server
# Pull latest code
cd /var/www/your-app
git pull origin main
# Rebuild containers
docker-compose down
docker-compose up -d --build
# Done. Zero downtime with health checks.
Time: 2 minutes (vs 15 minutes with AWS CodePipeline)
The Investor Math
At Series A, VCs calculate your burn rate.
Bad:
Revenue: $50K/month
Infrastructure: $5K/month (Vercel + AWS)
Burn: 10% of revenue on hosting
Good:
Revenue: $50K/month
Infrastructure: $500/month (Cloudflare + Hetzner)
Burn: 1% of revenue on hosting
The difference: 9% margin improvement = higher valuation.
Example: Dropbox went from AWS to their own data centers and saved $75M/year. Their IPO valuation jumped accordingly.
The First Principle: Infrastructure should be boring and cheap. Spend your capital on customer acquisition, not on Vercel’s margin.