Engineering decisions

Vercel, AWS, or a plain VPS: what each one really costs

EdgeBrain Studios12 min read

Choose by who is on call, not by price per gigabyte. A managed platform bills you in money you can read on an invoice. AWS bills you in engineering hours that never appear on one. A plain VPS bills you in somebody’s weekend. For a team shipping a Next.js application with no infrastructure engineer, Vercel is the right default until a specific meter starts hurting, and the meter that hurts first is almost never compute.

The rest is the arithmetic behind that, and the two cases where our own default is the wrong thing to buy.

The three bills, and what unit each is denominated in

Comparisons go wrong because they take one number from each column, and the columns measure different things. A managed platform sells a finished operational posture: deploys, rollbacks, TLS, a CDN, preview environments, DDoS absorption and an on-call rota you never staff. Cloud primitives sell parts, priced individually and cheaply, and charge the assembly cost in salaried time. A VPS sells a machine, and everything above the kernel is yours forever, including at 2am. So the comparison is platform fee against engineering time against operational risk, and anyone quoting only the first is quoting a third of the answer.

Vercel: legible, excellent, and metered in five places

Vercel publishes Pro at $20 per month per seat with $20 of included usage credit. That is the part everyone reads. The bill is the usage-based half underneath, and it has five dials.

Bandwidth is the first cliff, and it arrives early

Vercel includes 1 TB of Fast Data Transfer per month on Pro, then charges from $0.15 per GB, and 10 million edge requests, then from $2 per million. These are the two that surprise people, because bandwidth is the only meter a marketing team can move by accident: one uncompressed hero video, one press hit, one scraper ignoring your robots file.

Put the second terabyte in context. At $0.15 per GB it is roughly $150 for the month. Amazon publishes CloudFront flat-rate plans at $15 per month for 10 million requests and 50 TB of transfer, with no overage charge. These are not comparable products, and a CDN is not a deploy pipeline or a support channel. But if bandwidth is genuinely your dominant cost, the gap between a managed platform and a CDN priced as a commodity is an order of magnitude.

Image optimization is the meter nobody models

Vercel prices image transformations separately from the images, and separately again from reading and writing the cache around them. Published on-demand rates run from $0.05 per 1,000 transformations, with cache reads from $0.40 per million and cache writes from $4.00 per million.

Cache writes are the expensive unit, and generating a lot of them is easier than it looks. Every combination of source image, width and quality is its own transformation, so a responsive component with eight breakpoints across a 2,000-product catalogue is sixteen thousand of them, and anything changing the cache key regenerates the lot. That is a design decision with a price on it, usually made by whoever typed the sizes attribute.

The compute model changed, and the change is subtle

Vercel now bills functions on fluid compute in two units. Active CPU is charged per CPU-hour and pauses while your code waits on I/O. Provisioned Memory is charged per GB-hour for the life of the instance and does not pause. In Washington DC the published rates are $0.128 per CPU-hour and $0.0106 per GB-hour.

Read that pair again, because it inverts the old advice. A route that spends 100ms computing and 900ms waiting on a slow third-party API costs almost nothing in CPU and a full second of memory. Your bill tracks how long functions are alive, not how hard they work, so the cheapest optimisation on this model is making a dependency faster or deleting it. That is also the fix for most of what makes a Next.js site slow. Builds are metered as well, at $0.0035 per CPU-minute multiplied by the machine’s CPU count, and most of a busy team’s builds are preview environments nobody opened.

The add-on cliff

Some requirements are a step rather than a curve. Vercel publishes SAML single sign-on at $300 per month, a HIPAA BAA at $350 per month, and static IPs at $100 per month per project. When an enterprise customer asks for a fixed egress IP to allowlist, that is a line item, not a config change. Same family of surprise as the SSO surcharge in build, buy or self-host authentication.

The concession: it is usually cheaper than you

For a marketing site or an early product, Vercel wins on arithmetic and it is not close. Three people on Pro with traffic inside the included tiers pay a low three-figure sum a month for a CDN, a build system, preview environments per pull request, instant rollback and a TLS story nobody thinks about. Reproducing that on primitives is not a weekend, and any engineer who says otherwise has not yet maintained the result.

AWS: the bill that is really an engineering-time bill

AWS is cheap per unit and expensive per decision. Nothing arrives assembled, and the assembly is what you are actually buying with salary.

The canonical example is the NAT Gateway. AWS publishes it at $0.045 per hour plus $0.045 per GB processed in US East. The hourly charge is about $33 a month and reads as noise. The processing charge applies to traffic that never leaves AWS, so a chatty service in a private subnet routed the wrong way pays a transit fee to talk to its own storage. Nobody predicts that line. Everybody finds it.

Egress is the other one. AWS gives every customer 100 GB per month of free data transfer out to the internet, aggregated across all services and regions, then charges per GB on a tiered scale, with cross-zone and inter-region movement priced separately. There is no single number to quote, which is the point: the cost of moving a byte depends on which two places it moved between, so you cannot answer “what will this cost” without a diagram. AWS does publish one partial escape, waiving transfer from AWS origins into CloudFront when you serve through CloudFront.

Now price the part that is not on the invoice. A production footprint means a VPC and its subnets, security groups, an IAM model somebody keeps coherent, infrastructure as code and a state backend for it, log retention, alarms, and a backup someone has actually restored from. That is a role, not a ticket, and against a loaded salary several thousand dollars a month of platform fee is small.

Which gives the only clean rule we have for AWS: go there when a requirement forces it, not when a spreadsheet suggests it. Data residency in a region your platform does not offer. An auditor who wants your VPC flow logs. A workload genuinely compute-heavy for hours. Those are reasons. “It will be cheaper” stops being true the moment you count the person.

The VPS: cheap until it is 2am

The per-unit case for a VPS is genuinely strong. DigitalOcean publishes Basic Droplets from $4 per month for 1 vCPU, 512 MiB and 500 GB of transfer, up to $18 for 2 vCPU, 2 GB and 3 TB, with inbound bandwidth free. Three terabytes of egress for eighteen dollars is a different universe from per-gigabyte platform pricing, and pretending otherwise is dishonest.

Two things are missing from that number. The first is that the floor moves. Hetzner adjusted cloud server prices on 15 June 2026, publishing examples in its own documentation including a CX23 going from €3.99 to €5.49 a month and a CCX13 from €15.99 to €42.99, with existing contracts keeping their terms and new orders paying the new price. A business case resting on a commodity server price rests on somebody else’s procurement costs.

The second is the operational surface, and it is the real bill. Someone owns kernel patching. Someone notices when the cron that renews TLS stops renewing. Someone owns a backup that has been restored from at least once, because an untested backup is a belief rather than a backup. Someone owns log rotation before the disk fills on a Sunday. Someone owns the zero-downtime deploy a platform gave you free. Someone answers the page. A VPS is right when that someone already exists and is already doing this for other systems. Creating the estate for one application is how a $4 server becomes the most expensive line in the company.

Where a serverless model genuinely does not fit

This is where the received wisdom is most out of date, so be precise about what is still true.

Long-running work.Vercel’s published duration table defaults to 300 seconds on every plan, with an 800 second maximum on Pro and Enterprise and an extended 1,800 second ceiling in beta. Thirty minutes covers far more than the old argument assumed. It still does not cover a four-hour nightly reconciliation, and the answer to that is not a longer function. It is a queue and a worker, the subject of background jobs in Next.js when there is no server to run them on.

Persistent connections.Vercel lists WebSocket support as a public beta. Treat “beta” as load-bearing when the feature is the product: a collaborative editor whose entire value is a held connection should not have its core dependency in a beta on any vendor. A chat panel bolted onto a CRUD app is a different risk, and polling or server-sent events often retires the requirement.

Heavy or stateful background work. Video encoding, large imports, anything wanting a scratch disk or a warm cache between runs. Metered compute is not the cheap model for work that runs for hours. A machine is.

The database, which is the honest hard part. Serverless functions scale out horizontally and Postgres counts connections, so a pooler is not optional. Managed databases also meter egress on their own side of the wire: Supabase publishes Pro at $25 per month with 8 GB of disk then $0.125 per GB, and 250 GB of egress then $0.09 per GB. A dashboard pulling wide result sets on every load pays twice, once on database egress and once on transfer out to the browser. If you are also deciding how tenants share that database, read one database or one per customer before you pick a host, because that choice constrains this one.

A decision rule by stage

StageDefaultWhat moves you off it
Marketing site, brochure, docsManaged platform, free or Pro tierNothing, realistically
Early product, no infra engineerManaged platform plus a managed PostgresA meter that exceeds a day of engineer time per month
Growing SaaS, first infra hirePlatform for the app, a machine for the workersBandwidth, or a job that will not fit in a function
Compliance or residency requirementCloud primitives, staffedThe requirement was never real
Existing staffed estateWhatever that estate already runsNothing. Consistency beats optimality

Row two carries the threshold worth internalising. Convert the platform bill into engineer-days at your own loaded cost. Under about one engineer-day a month, migrating destroys value. Past three or four the arithmetic flips, and even then only if the person doing the migration is not the person who should be shipping features. That is our framing rather than a study.

What we default to, and why

We default to a managed platform for the application with a managed Postgres behind it, then move the one workload that does not fit onto a small dedicated machine rather than moving the whole system. Most of what people call outgrowing a platform is one cron job, one report generator, or one image pipeline. Move the one thing.

Two commitments make that reversible, and we hold to both on every web application we build. The account is yours from day one, in your name and on your billing card, so the platform relationship is never mediated through us. And the application does not lean on a vendor primitive it cannot leave: file storage behind an interface, jobs on a queue rather than a proprietary trigger, no business logic in edge middleware. That discipline is the whole reason a host change stays a week of work instead of a rewrite.

Where this shows up in our prices: a marketing site is $7,500 to $15,000, an internal tool or dashboard is $18,000 to $34,000, and a SaaS platform or MVP is $28,000 to $45,000, with ongoing support from $2,500 a month. Those bands are estimates in US dollars, not quotations; the quote that follows scoping is fixed in writing before kickoff.

Note the ratio, because it is the point of the whole article. A hosting decision swinging your bill by a couple of hundred dollars a month sits inside a build costing tens of thousands. Spending three weeks of engineering on the smaller number is a bad trade, and we will say so rather than bill for it.

The two cases where hiring us for this is wrong

If you already employ a platform or SRE engineer, do not pay an agency to pick a host. They will pick better than we will, because they know your traffic shape, your compliance posture and what they are willing to be paged for at 3am. Spend the money on their tooling budget instead.

And if the question is purely “my bill went up, where do I move”, you probably do not have a hosting problem. Read the usage breakdown first. In our experience it is one of four things: an unoptimised media asset, an image component generating far more transformations than intended, a function held open by a slow upstream call, or a bot nobody rate-limited. All four are a day of work. Our scoping sprint is $3,500, and if a day of work is the whole answer we would rather say so than sell you a replatform.

The compressed decision

Start on a managed platform. Watch four meters: data transfer, image transformations and their cache writes, function instance lifetime, and build minutes. Convert the bill into engineer-days at your loaded cost each quarter, and while it is under a day, change nothing. When one meter dominates, move that workload to a machine and leave the rest. Go to cloud primitives when a requirement forces it and you have hired the person who will own it. Take a VPS when you already have an estate and a rota, not when you have a spreadsheet.

Keep the exit cheap throughout: your account, your billing, no logic welded to a vendor primitive. And if you want a second opinion, send the usage breakdown rather than the invoice total and tell us which meter is moving.

Got a version of this problem?

Send a paragraph describing what you’re trying to build and what’s currently in the way. We reply inside two working days with a scope, a price and a start date. If we’re not the right people for it, we say that instead.