Monthly base cost and billing predictability
Vercel Pro starts at $20/month plus $20 of included usage credit. The base is clear, but once the credit runs out the bill becomes variable: Fast Data Transfer, Edge Request, function invocations, ISR writes, and image transformation are all billed separately. Vercel's bot protection and AI-bot managed rulesets come OFF by default; the Spend Management cap exists on Pro but checks spend every few minutes rather than continuously. If you don't set both up deliberately, sudden traffic spikes can push the bill up disproportionately.
On Hetzner VPS the picture flips: the monthly fee is fixed, and the bill doesn't change as long as you stay under the included traffic quota. But let's be honest — in 2026 Hetzner made two price increases (April 1, June 15); the dedicated vCPU lines (CCX/CPX) rose over 100% in some configurations, while the shared lines (CX/CAX) moved more moderately (30-38%). "Fixed and cheap" is still true, but now it depends on which line you pick.
The hidden cost item is human-hours: if DevOps time is a capability you already have, the marginal cost is low; if it has to be learned from scratch, the real cost can approach Vercel's.
Bandwidth, Edge Request, and ISR Write unit prices
Vercel's official regional price table is clear: Fast Data Transfer includes the first 1TB, after which it's $0.15-$0.35 per GB. Fast Origin Transfer has no included quota — it starts at $0.06/GB and goes up to $0.43 depending on region. Edge Request includes 10M per month, after which it's $2.00-$3.20 per 1M requests (fra1: $2.60). There's no such thing as an included quota for ISR: 1M write units cost $4.00-$6.40 (fra1: $5.20), 1M read units cost $0.40-$0.64. Note that the unit isn't a page — one write unit means 8 KB of data; a large page can consume dozens of units in a single revalidation. Function invocation is $0.60/1M, image transformation is $0.05-$0.0812/1K.
On Hetzner + Cloudflare, the picture is different: Hetzner includes a traffic quota with the server price — the official product page describes this as "generous included traffic, very low price for extra data transfer"; confirm the current GB figure from your own account. Put Cloudflare in front and static traffic is already served from the CDN. The equivalent of ISR-write is writing to disk: not a dollar bill, but disk I/O.
Tipping point: if your volume stays under the included quotas, the difference is negligible; once you go over, Vercel's bill grows while Hetzner's stays fixed.
DevOps load: zero configuration or manual management?
On Vercel, deployment is automatic after a git push: build, TLS, CDN, preview deployment, and rollback are all managed by the platform. The pricing table includes "Automatic CI/CD" and "Instant Rollback" as included features.
On Hetzner VPS, that responsibility is entirely yours. Next.js's official self-hosting documentation recommends putting a reverse proxy (nginx) in front — protection against malformed requests and rate-limiting should be kept separate from the server process. The official docs also note that Image Optimization can consume excessive memory on glibc-based Linux.
In concrete terms: TLS renewal, security updates, process management (systemd), log rotation, and a build-lock discipline to prevent concurrent builds. This site's portfolio-ssr.service setup works exactly this way: a systemd unit + nginx + Cloudflare, plus a deployment script with build-lock/RAM-checks/health-retry. Setting this up takes real engineering time — this is the cost item most "self-hosting is cheap" articles skip.
ISR, streaming, and Image Optimization: what do you actually lose on self-host?
A common misconception: "if you switch to self-hosting, you lose ISR/Image Optimization/Proxy." According to the official Next.js documentation, this is WRONG — a Node.js/Docker deployment "supports all features." Image Optimization and Proxy work with next start with zero extra configuration.
The real structural difference is in exactly one place: the ISR cache. On Vercel, it runs on a team-shared, distributed Data Cache. On self-host, the cache is written to each server instance's local disk file system by default. On a single instance (like this project), that's fine; once you move to multiple instances, each instance has its own cache, and users can see stale pages — the fix is a shared cache handler (Redis/NFS).
Expecting ISR to work with next export is another trap — export produces a fully static build, and ISR doesn't work in this mode. This is a limitation that comes from the wrong deployment mode, not from standalone/Docker.
For single-instance setups (most portfolios/blogs/mid-sized SaaS), the difference is practically zero; but for systems that need horizontal scaling, it introduces a real engineering cost.
Build/CI automation, scaling model, and CDN control
On Vercel, build, CI/CD, preview deployment, and scaling all come in one package. The Fluid Compute architecture bills functions on an Active-CPU + Provisioned-Memory basis by region (official figures like $0.184/hour CPU + $0.0152/GB-memory in Frankfurt) — capacity grows automatically as traffic increases. The CDN belongs to Vercel and covers a large number of regions.
On Hetzner VPS, build/CI is something you set up yourself (GitHub Actions or a custom script). Scaling isn't automatic — it's manual, either vertical (bigger server) or horizontal (adding a load balancer). That's a disadvantage during sudden traffic spikes, but no waste for predictable traffic.
On the CDN side, the Hetzner + Cloudflare combination offers strong control: cache purge and edge rules are entirely in your API token. This project's production triggers an automatic cache purge after every deploy. On Vercel, flexibility (region count, automatic distribution) wins on one axis, while Cloudflare's detailed rule engine wins on a different axis.
Data residency, KVKK/GDPR, backups, and outage discipline
For a project under KVKK/GDPR, data residency isn't an abstract criterion. Hetzner explicitly lists its data centers: Germany (Falkenstein, Nürnberg), Finland (Helsinki), the US (Hillsboro, Ashburn), and Singapore since 2024. The Germany and Finland facilities are ISO/IEC 27001 certified, and the company is headquartered in Germany — you know exactly where your data sits.
On Vercel, static content is cached on the global CDN on every plan; you choose the region for functions and the ISR cache — per the official documentation's table, Hobby gets a single region, Pro gets 5 regions, Enterprise gets all regions. So region selection exists, but it's limited by plan.
Backup responsibility falls on you at the application layer in both models — the platform only guarantees the infrastructure. On Hetzner, you set this up entirely yourself (on this project: daily automatic backups plus a monthly restore rehearsal). For outages/rollback, Vercel offers "Instant Rollback" out of the box; on Hetzner the equivalent is a fail-safe deploy discipline that leaves the previous version running in service if a build fails. Both providers have their own transparent status page, though the communication style differs.