Vercel vs a VPS for Next.js: When Self-Hosting Pays Off

Published on

Vercel Pro or a VPS for your Next.js app? Vercel's prices per seat, CDN tier and usage, what changes when you self-host, and a worked monthly cost example.

A technician reading a tablet in a dark data center aisle between rows of server racks with blue and yellow network cables

Your Next.js app runs on Vercel and the invoice has crept past the $20 you signed up for, or you are about to launch a client site that the free Hobby plan doesn't allow. A VPS for a few euros a month looks like an easy saving, but the answer depends on how many people deploy, how much traffic you serve and who looks after the server. Below are Vercel's own prices, checked on 30 October 2026, what changes for Next.js on your own server, and a monthly bill worked out line by line.

Quick answer: Self-hosting pays off for a commercial Next.js site with steady traffic, if someone on the team can run a Linux server. Vercel's Hobby plan is free but for non-commercial use only. Pro is $20 a month with one deploying seat and $20 of usage credit, plus $20 per extra developer who deploys, a paid CDN tier once a month goes past 1 million requests or 1 TB, and usage beyond the credit, all in US dollars before VAT. A VPS costs the same however many people deploy. One next start process runs every Next.js feature, ISR, image optimization and Proxy (formerly Middleware) included; the extra work is the server itself. Stay on Vercel for a free hobby project, for traffic that swings hard or spans continents, or when nobody wants to maintain a server.

What Vercel Charges in October 2026

Vercel's pricing page lists Hobby, Pro and Enterprise, which has custom pricing. Prices are in US dollars and exclude VAT, which Vercel adds based on your billing address.

Hobby is free and restricted to "non-commercial personal use only". The fair use guidelines count payments, ads, selling a product or service, sites that exist mainly for affiliate links and being paid to build or host the site as commercial; donations are fine. Each month Hobby includes 1,000,000 CDN requests, 100 GB of Fast Data Transfer, 4 hours of Active CPU and 5,000 image transformations, among others. You can't buy more: over a limit, you usually wait until 30 days have passed (Hobby plan).

Pro has a $20 monthly platform fee that includes one deploying seat and $20 of usage credit, which expires at the end of each month. Each extra seat that can deploy costs $20 a month; read-only viewer seats are free. New Pro teams get the Flat Rate CDN by default and existing teams can opt in: a monthly capacity tier for CDN requests and Fast Data Transfer instead of a price per unit. Per the pricing FAQ every request counts, static files included:

Flat Rate CDN tierCDN requests a monthData transfer a month
Included with Pro1 million1 TB
$20 a month10 million50 TB
$100 a month50 million50 TB
$300 a month150 million50 TB

A one-day spike doesn't change the bill. A whole billing cycle over your capacity moves you up a tier from the next cycle, and above the top tier you pay on-demand rates. Sites that mainly distribute files or media aren't eligible.

Everything else is metered, including Fast Origin Transfer, the data between the CDN and your functions (CDN pricing). Functions are billed for CPU time while your code runs and for memory while requests are in progress (Fluid compute pricing), at 2 GB (1 vCPU) per instance by default (memory settings). Where rates vary by region, these are Frankfurt (fra1):

ResourceOn-demand rate
Active CPU$0.184 per hour
Provisioned Memory$0.0152 per GB-hour
Function invocations$0.60 per million
ISR reads$0.52 per million
ISR writes$5.20 per million
Image Optimization transformations$0.0601 per 1,000
Fast Origin Transfer$0.06 per GB
Builds on Elastic machines, the default for new Pro teamsfrom $0.0035 per CPU minute

A 3-minute build on a 4-vCPU machine counts as 12 CPU minutes (managing builds). To cap the bill, Spend Management can pause every production deployment at an amount you choose. Vercel checks every few minutes, so the pause can lag, and visitors then see a 503 DEPLOYMENT_PAUSED error until you resume each project by hand.

Which Next.js Features Work the Same on a VPS

The Next.js platform guide puts the minimum plainly: "To run Next.js, your platform needs a Node.js server. That's it." One next start process handles Server Components, ISR, Partial Prerendering, Cache Components, Server Actions, Proxy and after(), and the only extra dependency is the sharp package for image optimization. The self-hosting guide lists what you set up around it:

FeatureOn one VPS with next startWhat you add yourself
ISR and revalidationWorks; the cache lives on the server's diskA shared cacheHandler once you run several instances
Image Optimization (next/image)Works with zero configurationWatch memory: on glibc-based Linux, sharp recommends an allocator such as jemalloc
Proxy, called Middleware before Next.js 16Works with zero configurationNothing; it runs on Node.js by default
Streaming and SuspenseWorksTurn off buffering in nginx, for example with an X-Accel-Buffering: no header
after()WorksStop the server with SIGINT or SIGTERM and allow 10 to 30 seconds for it to finish
Skew protectionBuilt into Vercel ProSet deploymentId; a browser on an old build then gets a full page reload
Preview URLs and rollbacksBuilt into VercelYour own CI, or a self-hosted platform such as Coolify

On one VPS every response comes from one server in one data center. To serve static files from a CDN, set assetPrefix and make sure the CDN respects the Cache-Control headers Next.js sends. Several instances behind a load balancer need three more things: a shared cache handler, a common deploymentId, and the same NEXT_SERVER_ACTIONS_ENCRYPTION_KEY on every instance, set at build time. Without that key, Server Actions fail with "Failed to find Server Action".

What You Take On With a VPS

Vercel's price includes the server work. On a self-managed VPS it is yours.

Node.js. Current Next.js needs Node.js 20.9 or newer (installation). The nodejs package is 18.19.1 in Ubuntu 24.04 and 18.20.4 in Debian 12, so install a current release from nodejs.org instead. Check before you build:

apt-cache policy nodejs   # the version your distribution offers
node --version            # the version you have installed

A build and a process. npm run build and npm run start work as they are. With output: 'standalone' in next.config.js, the build writes .next/standalone with a minimal server.js that runs without node_modules. It leaves out public and .next/static, so copy those in yourself, as the output docs show:

npm run build
cp -r public .next/standalone/ && cp -r .next/static .next/standalone/.next/
PORT=3000 HOSTNAME=127.0.0.1 node .next/standalone/server.js

Keep it running under a process manager, as in our PM2 production guide; our Next.js deployment guide covers the full setup.

nginx and deploys. Next.js recommends a reverse proxy such as nginx in front of the server to deal with malformed requests, slow connection attacks, payload size limits and rate limiting; our nginx guide adds a Let's Encrypt certificate. Vercel deploys every push to your production branch and gives other branches and pull requests preview URLs. On a VPS you build on the server, where the build competes with the live site for CPU and memory, or in CI, as in our GitHub Actions guide.

Upkeep and capacity. Operating system and Node.js updates, the firewall, SSH hardening, backups and a health check such as Uptime Kuma are yours too. Vercel's Fluid compute scales functions up as traffic grows; a VPS has the CPU and memory of its plan, and when that runs short you move to a bigger plan.

A Worked Monthly Cost Example

This example uses Vercel's published rates with assumed usage, not measurements, and leaves out small lines such as image cache reads and writes. Your own numbers are in the usage view of your Vercel dashboard or vercel usage.

Take a shop front end built by two developers that serves 3 million CDN requests and 300 GB a month. Its server-rendered pages make 1.2 million function invocations using 30 hours of Active CPU and 600 GB-hours of memory, which is 300 instance-hours at the default 2 GB, and send 60 GB from the functions to the CDN. ISR serves 2 million reads and 200,000 writes, next/image makes 10,000 transformations, and the team deploys 100 times with 3-minute builds on 4 vCPUs. On Pro, with Frankfurt rates:

ItemHow it is calculatedPer month
Pro platform feeOne deploying seat and $20 of usage credit$20.00
Second deploying seat$20 per seat$20.00
Flat Rate CDN3 million requests is above the included tier, so the 10 million tier$20.00
Function invocations1.2 million × $0.60 per million$0.72
Active CPU30 hours × $0.184$5.52
Provisioned Memory600 GB-hours × $0.0152$9.12
Fast Origin Transfer60 GB × $0.06, not covered by the CDN tier$3.60
ISR2 million reads × $0.52 plus 0.2 million writes × $5.20, per million$2.08
Image transformations10,000 × $0.0601 per 1,000$0.60
Builds100 × 3 minutes × 4 vCPUs = 1,200 CPU minutes × $0.0035$4.20
Usage creditCovers $20.00 of the $25.84 usageminus $20.00
TotalBefore VAT$65.84

Over a year that is 12 × $65.84 = $790.08 before VAT, and $60 of each month is fixed: two seats and the CDN tier. If the server-rendered work triples with traffic, the $20 CDN tier still covers it up to 10 million requests, the usage lines other than builds triple to $64.92, and the month comes to $109.12. A third developer adds $20 whatever the traffic.

On a VPS the same shop is one line. As of 30 October 2026, our Standard VPS costs €4.99 a month for VPS-S (3 vCores, 4 GB RAM, 60 GB NVMe, 10 TB traffic) and €8.99 for VPS-M (4 vCores, 8 GB RAM, 80 GB NVMe, 10 TB), including VAT, in an EU data center. Paying a year ahead takes 10% off, which makes VPS-S €53.89 a year. The plans are self-managed, and backups are not in the plan price; you can arrange them through a support ticket.

That price changes with the plan, not with developers or requests. Whether one VPS-M carries this shop depends on your code, so watch CPU and memory after the move and go up a plan if either runs short. To compare fairly, convert Vercel's total at the day's rate and add your VAT. Then add what the VPS column leaves out: your hours for the work in the previous section, backups, and a CDN if your visitors are spread across continents. For a single developer who stays inside the included tier and the credit, it is $20 before VAT against €4.99, and the hours decide it.

Which One Fits

Stay on Vercel when:

  • the project is personal, non-commercial and within Hobby's limits;
  • your team relies on preview URLs for every pull request and on Instant Rollback, which on Pro reaches every earlier production deployment, and nobody wants to run a server;
  • traffic swings hard from week to week, or your visitors are spread across continents and you want a CDN without setting one up.

Move to a VPS when:

  • seats and a CDN tier make up most of your bill, as in the example;
  • traffic is steady and someone will patch, back up and monitor the server;
  • you run more than the website: a database, a worker, a bot or scheduled jobs can share the VPS, while Vercel cron jobs call your production URL over HTTP on a schedule;
  • you handle large uploads or long connections. A Vercel Function takes at most 4.5 MB of request or response body and returns 413: FUNCTION_PAYLOAD_TOO_LARGE above that (limitations), and each function, WebSocket connections included, ends at its maximum duration: 300 seconds by default, up to 800 on Pro, or 1,800 in a beta. On your own server these are settings, such as nginx's client_max_body_size (default 1m) and Next.js's serverActions.bodySizeLimit (default 1 MB).

Or take a middle path:

  • A site without server features doesn't need Node.js. With output: 'export', next build writes plain HTML, CSS and JavaScript to an out folder that any web server can host, but ISR, Proxy, Server Actions and the default image loader don't work in a static export. Our web hosting starts at €2.49 a month for that.
  • For push-to-deploy on your own server, a self-hosted platform such as Coolify builds a preview for each pull request; see our Coolify and Dokploy guide.

FAQ

Can I use Vercel's free Hobby plan for a client or business site? No. A site that takes payments, sells something, shows ads or is built by someone who gets paid counts as commercial, and commercial use needs Pro or Enterprise. Our free hosting comparison covers other free plans and their terms.

Does ISR work when I self-host Next.js? Yes. Under next start the cache sits on the server's disk, which works automatically for one instance with persistent storage. With several instances each keeps its own cache, and revalidateTag() on one doesn't reach the others. Next.js's answer is a shared cacheHandler, for example on Redis, with cacheMaxMemorySize: 0 and a refreshTags() method that syncs tags between instances.

Does next/image work on a VPS? Yes, with zero configuration under next start, through the sharp package. On glibc-based Linux, Next.js notes it may need extra configuration to prevent excessive memory use, and sharp recommends an alternative allocator such as jemalloc. You can also switch optimization off, or point next/image at a separate image service with a custom loader.

What happens to my Vercel bill when a post goes viral? The Flat Rate CDN absorbs a one-day spike. Function, ISR and image usage is billed on demand once the credit is gone, and a whole month above your capacity moves you up a CDN tier from the next cycle. If Spend Management pauses production, visitors get 503 DEPLOYMENT_PAUSED. On a VPS the bill stays the same, and the risk moves to the server, which slows down or fails when it runs out of CPU or memory.

Can I move a Next.js app from Vercel to a VPS without code changes? Usually the Next.js code runs as it is, since a Node.js server supports every Next.js feature. Check what is tied to Vercel: cron jobs in vercel.json need a scheduler on the server, and NEXT_PUBLIC_ variables are written into the JavaScript bundle at build time, so set them wherever you build.

Sources

All opened on 30 October 2026: