A client came to me with a Vercel bill that had gone from $0 to $340/month in four months. Their traffic had barely changed. The product had not grown. But the bill had. Here is where it was coming from, and what the actual options are.
Vercel is genuinely good at what it does. Git-push deploys, preview URLs, edge middleware, automatic SSL: the developer experience is real. But the pricing model has a structure that catches small teams off guard, and once you are past the free tier, costs can grow in ways that are not immediately obvious from the dashboard.
The four places bills grow
1. The free tier prohibits commercial use
Vercel's Hobby plan is free, but it cannot be used for commercial projects. The terms are explicit about this. If your app makes money, takes payments, or is used as part of a business, you need the Pro plan. That is $20 per user per month, minimum. A team of three goes to $60/month before a single function has executed.
Many teams start on Hobby, build a product, start getting users, and then get an email. Others stay on Hobby quietly until an audit. Either way, the jump to Pro is $60-100/month for a small team before any usage-based charges apply.
2. Serverless function execution costs
Every API route in a Next.js app deployed to Vercel runs as a serverless function. Each invocation has a cost. The Pro plan includes a certain number of function invocations per month. Once you are over the limit, you pay per invocation.
The issue is that most developers do not think about invocation count when building API routes. A Next.js app that calls /api/user on every page load, plus/api/notifications every 30 seconds, plus various other endpoints, adds up fast with real users.
The fix: add aggressive caching headers to API routes that do not need to be fresh on every request. Move genuinely heavy API logic to a separate backend if the function execution time is significant.
// Next.js API route: set cache headers where appropriate
export async function GET() {
const data = await getSomethingThatDoesNotChangeOften();
return Response.json(data, {
headers: {
// Cache for 5 minutes at the CDN edge
'Cache-Control': 'public, s-maxage=300, stale-while-revalidate=600',
},
});
}3. Bandwidth overages
Each plan includes a bandwidth allowance. When you exceed it, Vercel charges per GB of overage. If your app serves large files, has unoptimized images, or starts getting real traffic, bandwidth can become a meaningful line item quickly.
The common fixes:
- Use
next/imageproperly. It automatically serves WebP and resizes to the requested dimensions, which reduces transfer size by 60-80% compared to serving the original. - Move static assets (PDFs, videos, large downloads) to S3 or Azure Blob Storage and serve them directly from there, not through Vercel.
- Enable compression for your responses if it is not already active.
4. Preview deployments on every branch
Vercel automatically creates a preview deployment for every branch push. That is genuinely useful for reviewing changes. It also means every branch in your repository consumes build minutes and function invocations if someone visits the preview URL. For a busy team with many branches, this adds up.
You can configure Vercel to only create preview deployments for specific branches, or only for pull requests rather than every push.
The honest alternatives
If your Vercel bill is over $100/month and the primary driver is function execution or compute rather than a specific feature (like Edge Middleware or Analytics), it is worth evaluating alternatives.
The realistic options for a Next.js app:
- Coolify on Hetzner: A Hetzner CX22 server costs about $4.50/month. Coolify is free and open-source. It gives you git-push deploys, SSL, and preview environments. You manage the server. The total cost for a small team: under $10/month. The tradeoff: you are now responsible for server uptime.
- Railway: Predictable pricing, good Next.js support, no per-seat charges. Better for teams that want managed infrastructure without Vercel-level costs.
- DigitalOcean App Platform: Per-app pricing rather than per-seat. Easier to predict costs than Vercel for function-heavy apps.
- Netlify: Still Vercel's closest competitor. Similar feature set, sometimes more generous free tier. Worth comparing on your specific usage patterns.
The right choice depends on whether your team needs specific Vercel features (Edge Middleware, Analytics, AI SDK server actions) or just git-push deploys and SSL. If it is the latter, there are significantly cheaper options.
What to do right now
- Check your Vercel usage dashboard. Go to Settings → Usage. Identify which metric is driving the overages.
- If it is function invocations: add caching to API routes that can tolerate it.
- If it is bandwidth: audit your image handling and move large static files off Vercel.
- If it is the per-seat Pro cost and most team members only occasionally access the dashboard: consider whether everyone actually needs a seat.
- If the bill is above $150/month and growing: seriously evaluate Coolify on a cheap VPS. The migration for a standard Next.js app is usually a few hours of work.
$ migrate --off-vercel
If the Vercel bill is the problem and you want to move to a VPS setup without doing it yourself, I can handle the migration. Usually a few hours of work.
$ ./request-devops-help.sh →