My Vercel bill was $237.84 last month.
For a tech blog.
Not a SaaS with 10,000 users. Not an e-commerce platform. A blog with ~50,000 monthly visitors that should cost, at most, $20 to host.
The culprit? Serverless function invocations. Image optimization. Bandwidth overages. Edge network charges. Death by a thousand microtransactions.
So I moved everything to a $5/month Hetzner VPS. The migration took a weekend. The result?
- Cost: $5/month (down from $237).
- Performance: 40% faster TTFB (Time to First Byte).
- Control: Full root access. No vendor lock-in. No surprise bills.
This is the Vercel alternatives 2026 guide I wish existed when I started. If you're bleeding money on serverless, here's your escape plan.
The Serverless Pricing Trap
Serverless is great in theory. Pay only for what you use. Scale infinitely. No server management.
In practice, serverless pricing is designed to be unpredictable. You can't budget because you don't know what you'll be charged until the bill arrives.
My Vercel breakdown:
- Function invocations: $89 (I had SSR pages that ran functions on every request).
- Image optimization: $67 (Vercel charges per-image-transform).
- Bandwidth: $52 (beyond their "generous" free tier).
- Edge middleware: $29 (I used it for geolocation once).
None of these were unreasonable in isolation. Together, they added up to hosting costs that rivaled a dedicated server farm.
The VPS vs Serverless 2026 decision is simple: serverless for unpredictable, spiky workloads; VPS for steady traffic you can forecast.
A blog has steady traffic. I should've been on a VPS from day one.
The Migration: Next.js on a $5 VPS
Here's exactly what I did:
1. Get a VPS
I chose Hetzner because they're cheap and European (GDPR-friendly). Alternatives: Vultr, Linode, DigitalOcean. Any $5-10/month VPS works.
Specs: 2 vCPU, 2GB RAM, 40GB SSD. More than enough for a Next.js blog.
2. Dockerize the App
Created a simple Dockerfile:
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine AS runner
WORKDIR /app
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/public ./public
EXPOSE 3000
CMD ["node", "server.js"]
The standalone output from Next.js is key—it bundles everything into a minimal deployment.
3. Set Up Caddy as Reverse Proxy
Caddy handles HTTPS automatically (no Let's Encrypt headaches):
mehitsfine.app {
reverse_proxy localhost:3000
encode gzip
}
That's the entire Caddyfile. Automatic HTTPS. Gzip compression. Done.
4. Deployment Script
#!/bin/bash
git pull origin main
docker build -t myapp .
docker stop myapp || true
docker rm myapp || true
docker run -d --name myapp -p 3000:3000 myapp
SSH in, run the script, done. Zero-downtime deploys can come later; this is good enough to start.
Image Optimization Without Vercel
Vercel's image optimization was a huge chunk of my bill. Alternatives:
Option 1: Build-Time Optimization
Use next/image with unoptimized: true, then pre-optimize images during build:
npm install sharp
// next.config.js
module.exports = {
images: { unoptimized: true }
};
Use a build script to resize and compress images before deployment. No runtime cost.
Option 2: Cloudflare Images
Cloudflare's image CDN is ~$5/month for most sites. Way cheaper than Vercel, and globally distributed.
Option 3: Self-Hosted imgproxy
For full control, run imgproxy on your VPS. Open source, fast, configurable.
I went with Option 1 (build-time optimization) because my images don't change often. Simpler is better.
Performance: VPS vs Vercel
I expected worse performance on a VPS. I was wrong.
Time to First Byte (TTFB):
- Vercel Edge: 180-250ms
- Hetzner VPS (German DC): 90-130ms for EU visitors
For US visitors, Vercel's edge wins. But 70% of my traffic is EU. For them, the VPS is faster because it's closer.
Cold starts:
- Vercel serverless: 300-800ms cold start on first request.
- VPS: No cold starts. The server is always running.
The cutting cloud hosting costs story isn't just about money. It's often about performance too. Serverless has overhead that dedicated servers don't.
If I needed global edge performance, I'd use Cloudflare CDN in front of the VPS. Costs $0 for the free tier, and gives me edge caching worldwide.
When to Stay on Vercel
I'm not saying Vercel is bad. I'm saying it's not right for everything.
Stay on Vercel if:
- You have spiky, unpredictable traffic (0 to 100K requests in an hour).
- You need instant global edge deployment (critical for user-facing apps).
- Your team doesn't want to manage infrastructure.
- You're in the free tier and staying there.
Move to VPS if:
- You have steady, predictable traffic.
- Your costs are exceeding $50/month on serverless.
- You're comfortable with basic Linux/Docker operations.
- You want control over your stack.
The escape serverless pricing move isn't for everyone. But for indie developers, bloggers, and small SaaS apps, it's often the smart financial choice.
Conclusion
The Verdict
I went from $237/month to $5/month. My site is faster for my primary audience. I have full control over the stack.
The migration took one weekend. The skills I learned (Docker, Caddy, basic server management) are portable and valuable.
If your cloud bills are growing faster than your revenue, consider the VPS escape hatch. It's not as scary as serverless marketing makes it seem.
Start small. Migrate one project. See how it feels. You might never go back.
Made the switch from serverless to VPS? Share your experience on Twitter/X @mehitsfine.
Tags: