
Self-Hosting on Hetzner vs. Deploying on Vercel: A Real Cost Comparison
We use both Vercel and Hetzner. Not because we can't decide — because they solve different problems at different price points. But the "which one is cheaper?" question comes up on every project, so we finally sat down and compared real numbers.
The Setup
We'll compare costs for three real scenarios from our project portfolio:
- Small MVP — a Next.js app with light traffic (5K monthly visitors, simple CRUD)
- Medium SaaS — a platform with moderate traffic (50K monthly visitors, file uploads, background jobs)
- High-traffic marketplace — a content-heavy app with significant traffic (200K+ monthly visitors, image-heavy, real-time updates)
All prices are monthly. All numbers are from actual invoices, not pricing calculator estimates.
The Numbers
Small MVP (5K monthly visitors)
| Component | Vercel | Hetzner |
|---|---|---|
| Compute | $0 (Hobby) or $20 (Pro) | €4.50 (CX22) |
| Database | $0 (Neon free tier) | Included (self-hosted PG) |
| Bandwidth | Included | Included (20 TB) |
| SSL/Domain | Included | Free (Let's Encrypt + Caddy) |
| CI/CD | Included | Free (GitHub Actions) |
| Total | $0–$20/mo | €4.50/mo |
Winner: Vercel. At this scale, the free tier or Pro plan is unbeatable. Zero ops, instant deploys, preview environments out of the box. The €4.50 Hetzner box works fine, but you're maintaining it yourself.
Medium SaaS (50K monthly visitors)
| Component | Vercel | Hetzner |
|---|---|---|
| Compute | $20 (Pro) | €16 (CX32) |
| Database | $19 (Neon Launch) | Included |
| Blob Storage | $20–40 (Vercel Blob) | €3 (Hetzner Object Storage) |
| Bandwidth | $40/100GB overage risk | Included (20 TB) |
| Background Jobs | $25 (Vercel Cron + Functions) | Included (systemd timers) |
| Monitoring | $0 (basic) | €0 (Grafana + Prometheus) |
| Total | ~$124–$145/mo | ~€19/mo |
Winner: Hetzner. This is where the gap opens up. Vercel's per-feature pricing adds up fast once you need storage, background jobs, and real bandwidth. Hetzner gives you a full server for less than Vercel's database add-on.
Hetzner's price doesn't include your time. If you spend 4 hours per month on server maintenance at a €100/hr rate, that's €400 in hidden ops cost. For a solo founder, Vercel might still be cheaper in total cost of ownership.
High-Traffic Marketplace (200K+ monthly visitors)
| Component | Vercel | Hetzner |
|---|---|---|
| Compute | $20 (Pro) + $150–300 (function invocations) | €36 (CX42) |
| Database | $69 (Neon Scale) | Included |
| Image Optimization | $50–100 (Vercel Images) | €0 (self-hosted Sharp) |
| Bandwidth | $200–500 (image-heavy) | Included (20 TB) |
| CDN | Included | €0 (Cloudflare free) |
| Storage | $60+ (Vercel Blob) | €6 (Object Storage) |
| Total | ~$550–$1,000+/mo | ~€42/mo |
Winner: Hetzner, by a mile. At this scale, Vercel's consumption-based pricing becomes painful. Bandwidth alone can dwarf the base subscription. Meanwhile, Hetzner's flat-rate model means costs barely increase with traffic.
Beyond the Invoice
Cost isn't just the monthly bill. Here's what the spreadsheet doesn't capture:
Where Vercel Wins
- Zero ops overhead. No SSH, no nginx configs, no security patches. Push to git, it's deployed.
- Preview environments. Every PR gets its own URL. This is genuinely valuable for client reviews.
- Edge network. Global CDN included. Your app is fast everywhere without configuration.
- DX speed. From
git pushto live in 30 seconds. On Hetzner, even with CI/CD, it's 2–5 minutes.
Where Hetzner Wins
- Predictable costs. You know exactly what you'll pay next month. No surprise bills.
- Full control. Need a cron job? A message queue? A second database? Just install it.
- Bandwidth freedom. 20 TB included. Stream video, serve images, host downloads — no per-GB charges.
- Data sovereignty. Hetzner data centers are in Germany and Finland. For EU clients with compliance requirements, this matters.
# Our standard Hetzner setup — takes 30 minutes once, then it just works
# Caddy (auto-SSL reverse proxy) + Docker Compose + PostgreSQL
# docker-compose.yml
services:
app:
image: ghcr.io/client/app:latest
restart: always
environment:
DATABASE_URL: postgresql://app:${DB_PASS}@db:5432/app
depends_on:
- db
db:
image: postgres:16
restart: always
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: ${DB_PASS}
caddy:
image: caddy:2
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
volumes:
pgdata:
Our Decision Framework
After deploying dozens of projects on both platforms, here's when we choose which:
Choose Vercel When:
- The client is a solo founder or tiny team with no ops experience
- The project is an MVP that might not survive 3 months
- Preview environments are critical for the workflow (design reviews, client approvals)
- Traffic is low and predictable
- Budget is flexible but time is not
Choose Hetzner When:
- Monthly traffic exceeds ~30K visitors
- The project involves file uploads, image processing, or media serving
- The client has compliance requirements (EU data residency)
- There are background jobs, workers, or scheduled tasks
- Cost predictability matters (bootstrapped startups, fixed-budget contracts)
- We're available for ongoing maintenance
Our favorite pattern: Vercel for the Next.js frontend (SSR, edge caching, preview deploys) and a Hetzner box for the API, database, and background workers. Best DX where it matters, best pricing where it counts.
The Bottom Line
Vercel is a developer experience product. Hetzner is an infrastructure product. Vercel charges for convenience. Hetzner charges for compute.
Neither is wrong. But if you're paying €500+/month on Vercel and your app is a standard Next.js CRUD app — we should talk.
We help teams choose the right infrastructure and manage migrations. Learn more about our Cloud & DevOps services.

