Where to host a web app: Cloudflare Workers vs. Vercel vs. AWS
Cloudflare Workers, Vercel, or AWS for a new web app? Free tiers, pricing, limits, cold starts, databases, and lock-in, plus when a plain container wins.
By Lance King · · 11 min read
You’ve built a web app and now it needs somewhere to live. The three names that come up first are Cloudflare Workers, Vercel, and AWS, and they’re different kinds of thing. Workers is a global serverless runtime with its own storage products. Vercel is a developer platform built around frontend frameworks, especially Next.js. AWS is a full cloud where you assemble the pieces yourself. This guide is for founders and small teams choosing a home for a new app. It compares pricing, limits, data, and lock-in on current facts, and explains when a plain container host like Fly.io, Render, or Railway is the better answer.
The short answer
Choose Cloudflare Workers if you want a low, predictable bill, global reach by default, and you’re comfortable with a runtime that isn’t quite Node.js.
Choose Vercel if you’re building with Next.js or another supported framework and want previews, deploys, and caching to just work, and you’re willing to pay per seat.
Choose AWS if you need specific AWS services, strict control over networking and compliance, or you already have AWS credits and people who know it.
Choose a container platform (Fly.io, Render, Railway) if your app is a long-running server, uses WebSockets heavily, runs background workers, or simply wants to be a normal, always-on server.
What actually matters
1. The pricing model
All three bill differently, and the model matters more than the headline price.
Cloudflare Workers bills mostly on CPU time, the time your code is actually computing, not time spent waiting on a database. The Free plan includes 100,000 requests per day and 10 ms of CPU time per request. The Paid plan is $5 a month and includes 10 million requests and 30 million CPU milliseconds, then $0.30 per additional million requests and $0.02 per additional million CPU milliseconds. Requests for static assets are free and unlimited. (As of October 2026.)
Vercel charges per team seat plus usage. Hobby is free but limited to personal, non-commercial use. It includes 4 hours of Active CPU, 360 GB-hours of provisioned memory, 1 million function invocations, 100 GB of data transfer, and 1 million CDN requests a month. If you exceed a Hobby limit, you usually wait 30 days for it to reset. Pro is $20 per developer seat per month and includes $20 of usage credit. Beyond that, functions cost from $0.128 per Active CPU hour, $0.0106 per GB-hour of memory, and $0.60 per million invocations. Pro includes 1 TB of data transfer (then from $0.15 per GB) and 10 million CDN requests (then $2 per million). (As of October 2026.)
AWS Lambda charges $0.20 per million requests plus $0.0000166667 per GB-second of duration on x86 in the first pricing tier. The free tier includes 1 million requests and 400,000 GB-seconds a month. Duration includes initialization code, so slow cold starts cost money as well as time. New AWS accounts get up to $200 in credits, but a Free plan account closes after six months or when the credits run out, whichever comes first. You’ll also pay separately for API Gateway or a load balancer, data transfer, logs, and any database. (As of October 2026.)
2. Runtime limits
Workers run in V8 isolates (lightweight sandboxes inside one shared runtime process) with 128 MB of memory each. CPU time is capped at 10 ms per request on Free and up to 5 minutes on Paid (30 seconds by default). There’s no hard wall-clock limit on an HTTP request while the client stays connected. A Worker bundle can be up to 64 MiB uncompressed and must finish its startup code within 1 second. Workers provide a subset of Node.js APIs, on by default for new projects. Some modules are only stubs that throw when called, so check your dependencies.
Vercel Functions run full Node.js (plus Python, Bun, and others). Memory is up to 2 GB on Hobby and 4 GB on Pro. Duration defaults to 300 seconds; Pro can raise it to 800 seconds, with 30 minutes in beta. Bundles can be 250 MB uncompressed (5 GB in a beta). Request and response bodies are capped at 4.5 MB, which matters for file uploads; send large files directly to storage instead.
AWS Lambda allows 128 MB to 10,240 MB of memory and up to 15 minutes per invocation. Synchronous payloads are capped at 6 MB each way (streamed responses can go to 200 MB). Zip packages can be 250 MB unzipped, container images up to 10 GB.
3. Cold starts
A cold start is the delay when the platform has to set up a fresh environment before running your code.
Cloudflare says isolates start “around a hundred times faster than a Node process on a container or virtual machine” and that this model “eliminates the cold starts of the virtual machine model.” In practice, your own startup code is the main cost, which is why the 1-second startup limit exists.
Vercel’s Fluid compute, on by default for new projects, reduces cold starts with bytecode caching, pre-warming on production deployments, and by letting one instance serve several requests at once.
AWS says cold starts typically happen in under 1% of invocations and range from under 100 ms to over a second. You can pay for provisioned concurrency to keep environments warm, or use SnapStart on supported runtimes.
4. Where your code runs
Workers run by default in the Cloudflare data center closest to the user, across a network Cloudflare lists at 348 cities. That’s great for latency until your code talks to a database in one region; then every query crosses the world. Smart Placement, or an explicit region setting, moves the Worker near your database instead.
Vercel has 126 points of presence for its CDN but 19 compute regions, which map to AWS regions. Functions default to Washington, D.C. (iad1). Pro teams can run functions in up to three regions.
AWS has 39 regions. You pick them, and running in several is a project you design yourself.
5. Data and storage
Cloudflare has the most built in: D1 (a SQLite-based database, up to 10 GB per database on Paid and 500 MB on Free), Workers KV (a key-value store), R2 object storage at $0.015 per GB-month with no egress fees, and Durable Objects for stateful coordination. Hyperdrive connects Workers to an existing Postgres or MySQL database (on AWS, Google Cloud, Azure, Neon, PlanetScale, and others) with connection pooling and query caching. D1 is single-threaded per database, so it suits many small databases better than one large, busy one.
Vercel offers Blob storage for files and Global Config for small, fast-read settings. Databases come through the Vercel Marketplace from providers like Neon, Supabase, and Upstash, with credentials injected as environment variables. You get a separate bill and a separate vendor for your data.
AWS has everything: RDS and Aurora for relational data, DynamoDB, S3, queues, and more. The tradeoff is setup work: networking, permissions, and backups are yours to configure.
For the database choice itself, see our Postgres vs. MySQL guide.
6. Framework support
Vercel supports many frameworks, including Next.js, SvelteKit, Nuxt, Astro, TanStack, and Remix. Its own feature table shows Next.js getting the most complete support (for example, Runtime Cache is Next.js-only).
Cloudflare publishes guides for React with Vite, Astro, React Router, Vue, SvelteKit, Nuxt, TanStack Start, and Python frameworks like FastAPI. For Next.js, Cloudflare now recommends vinext, a Vite-based reimplementation of the Next.js API that is still in beta, with the OpenNext adapter as another path. Run its compatibility check before moving a production app.
On AWS, Amplify Hosting manages server-side rendering for Next.js 12 through 15, but its docs list gaps, including Next.js streaming and on-demand incremental static regeneration. You can also run Next.js in a container on AWS.
7. Lock-in
Everyone has some. On Workers, the runtime APIs and bindings (D1, KV, Durable Objects) are Cloudflare-specific. On Vercel, the deeper you go into framework features like ISR and Runtime Cache, the more your app depends on Vercel’s infrastructure. On AWS, lock-in comes from the surrounding services: IAM, DynamoDB, and event wiring. A container running a standard web server, talking to standard Postgres, is the easiest thing to move.
Comparison table
Prices in this section are as of October 2026.
| Criterion | Cloudflare Workers | Vercel | AWS (Lambda) |
|---|---|---|---|
| Free tier | 100,000 requests/day, 10 ms CPU each | Hobby: non-commercial only, fixed monthly caps | 1M requests + 400,000 GB-s/month; new-account credits up to $200 |
| Paid entry point | $5/month, usage-based | $20/seat/month with $20 credit | Pay per use, no base fee |
| Billed on | Requests + CPU time | Active CPU + memory time + invocations | Requests + duration (GB-seconds) |
| Max run time | 5 min CPU (Paid); no wall-clock cap on HTTP | 300 s default; 800 s on Pro | 15 min |
| Memory | 128 MB per isolate | Up to 4 GB | Up to 10 GB |
| Cold starts | Isolates, minimal | Reduced by Fluid compute | Under 1% of invocations; paid mitigation |
| Where code runs | Nearest of 348 cities, or near your data | 19 regions (default iad1) |
39 regions, your choice |
| Built-in data | D1, KV, R2, Durable Objects, Hyperdrive | Blob, Global Config; DBs via Marketplace | RDS, Aurora, DynamoDB, S3, and more |
| Best framework fit | Vite-based frameworks, Hono, Astro | Next.js and other major frameworks | Anything in a container; Amplify for Next.js up to 15 |
| Lock-in risk | Runtime APIs and bindings | Framework-specific platform features | Surrounding AWS services |
When a VM or container platform is the better answer
Serverless suits request-response apps. It suits long-running processes less well: WebSocket-heavy apps, background job workers, apps with large native dependencies, or frameworks built to run as one steady server process. For those, a container platform is simpler and often cheaper. Prices as of October 2026:
- Fly.io runs your container as Machines in regions you pick. There’s no free tier for new organizations, only a short trial. The smallest always-on Machine (shared CPU, 256 MB) costs $2.19 per 30 days in its cheapest regions. Volumes cost $0.15 per GB-month, and Managed Postgres starts at $38 a month.
- Render has a free Hobby workspace (plus compute). Free web services spin down after 15 minutes without traffic and take about a minute to wake, and free Postgres databases expire after 30 days. Paid web services start at $7 a month for 512 MB; paid Postgres starts at $6 a month. The Pro workspace is $25 a month plus compute.
- Railway bills per second for CPU (about $20 per vCPU-month) and memory (about $10 per GB-month). The Hobby plan is $5 a month including $5 of usage; Pro is $20 a month including $20. Its database templates for Postgres, MySQL, and Redis are unmanaged, so backups and tuning are on you.
Cloudflare also runs containers alongside Workers on the Paid plan, billed for each 10 ms they’re running, which can be a middle path if the rest of your app lives there.
The catch with container hosting is that you’re running a server: you size it, watch its memory, and pay while it’s idle unless you set up scale-to-zero.
Which one for you
Prices in this section are as of October 2026.
Solo founder, side project turning into a business. Start on Cloudflare’s free plan or Vercel Hobby to prototype. The moment you charge money, Vercel Hobby’s non-commercial rule means moving to Pro. Workers Paid, at $5 a month plus usage, is an inexpensive way to run in production.
Small startup on Next.js. Vercel is the path of least resistance and the most complete Next.js support. Budget for seats as the team grows, and set spend limits. Put your database in the same region as your functions.
Global, read-heavy app or API. Workers’ default placement and free static assets make a strong case, especially with R2 for files and no egress fees.
Regulated company or enterprise customer base. AWS gives you the most control over networks, data residency, and audit trails. It also asks the most of your team. If you lack AWS experience in-house, weigh that cost honestly; our build vs. buy guide can help.
Background-job-heavy or always-on server app. Use Fly.io, Render, or Railway, or containers on AWS.
Mistakes to avoid
- Running a business on Vercel Hobby. Its terms limit it to personal, non-commercial use.
- Putting a global function in front of a single-region database. Use Cloudflare’s placement options, or pick a Vercel or AWS region next to your data.
- Ignoring body-size limits. Vercel caps function bodies at 4.5 MB and Lambda at 6 MB for synchronous calls. Upload files directly to Blob, R2, or S3.
- Assuming every npm package runs on Workers. Test your dependencies early.
- Comparing only compute prices. Data transfer, database, logs, and seats often cost more than compute.
- Relying on a free database for production. Render’s free Postgres expires after 30 days, and free tiers elsewhere pause or cap usage.
Migration notes: keep your app portable by sticking to standard web APIs where you can, keeping data in a standard database rather than a platform-only store, and wrapping platform bindings behind your own small interface. Moving a Next.js app from Vercel to Workers through vinext, or to a container on AWS, is possible but worth a trial run before you commit. Write down why you chose your host in a technical decision record, so the next person knows what assumptions to recheck.
A quick checklist
- Decide whether your app is request-response (serverless fits) or a long-running server (containers fit).
- Check the free tier’s terms, not just its numbers. Commercial use matters on Vercel.
- Confirm runtime limits against your slowest endpoint and largest upload.
- Put compute in the same region as your database.
- Price the whole stack: compute, data transfer, database, storage, logs, and seats.
- Run your framework’s compatibility check on the target platform.
- Identify which platform-specific APIs you’ll depend on, and isolate them.
- Set spend alerts on day one.
Sources
- Cloudflare Workers pricing
- Cloudflare Workers limits
- How Cloudflare Workers works
- Cloudflare Workers placement
- Cloudflare Workers framework guides
- Cloudflare Workers Next.js guide
- Cloudflare Workers Node.js compatibility
- Cloudflare Hyperdrive
- Cloudflare D1 limits
- Cloudflare Containers pricing
- Cloudflare network
- Vercel pricing
- Vercel Hobby plan
- Vercel Functions limits
- Vercel Fluid compute
- Vercel storage overview
- Vercel frameworks
- Vercel global network and regions
- AWS Lambda pricing
- AWS Free Tier
- AWS Lambda quotas
- AWS Lambda execution environment lifecycle
- AWS global infrastructure
- AWS Amplify Hosting support for Next.js
- Fly.io pricing
- Render pricing
- Render free instances
- Railway pricing
- Railway databases