Where to host your web app: how to choose
By Flavio Copes
Compare static hosts, serverless platforms, PaaS options, and VPS providers using current prices, limits, database needs, and operational tradeoffs.
“Where should I host this?” is the question I get most after “which framework should I learn?”.
Your choice depends on what you are building and whether you need a database. Traffic and budget narrow the options further. Once you know those four things, the list gets short.
I checked the pricing pages again on September 13, 2026. I included those prices here, along with the tradeoffs that are harder to find. Prices change, so check them again before signing up.
If you are in a hurry, I would choose:
- Cloudflare for a static site such as a blog, docs, or landing page. It is free, allows commercial use, and has no bandwidth bill.
- Netlify for a static site when you want the most polished Git workflow and forms without server code. The free plan allows commercial use, but watch the monthly credits.
- Railway or Render for a full-stack app you want to
git pushand forget. Expect around $5–7 a month. - Vercel for a Next.js app, after reading its free tier rules.
- A Hetzner or DigitalOcean VPS for a small Docker container and database on a budget. DigitalOcean starts at $4 a month. Hetzner’s cheapest plan costs about €6 a month with IPv4 and is sold only in Germany and Finland. Add your time.
- Cloudflare Workers or Google Cloud Run for an API that needs to scale to zero.
- A PaaS when you never want to think about servers. You pay more for that convenience.
The four questions
Start with these questions before opening a pricing page.
What are you building?
This answer removes most of the options.
A static site is made of HTML, CSS, JavaScript, and images. It does not run server code for each request. This includes blogs, docs, portfolios, landing pages, and React apps that talk to someone else’s API. Almost every host can serve one, often for free.
A full-stack app runs server code for requests. It may use server-side rendering, API routes, or sessions. Next.js, Astro in SSR mode, SvelteKit, Remix, Laravel, Rails, and Django all fit here. You need a host that runs a process or a serverless platform that runs functions.
An API has the same hosting needs, without the front end.
If you packaged the app as a Docker container, choose a container host or install Docker on a server.
A background worker or bot can keep running without waiting for HTTP requests. Discord bots, queue consumers, and scrapers are common examples. A permanent Discord gateway connection needs a continuously running process. Scheduled jobs and queue consumers can also use serverless platforms within their execution limits.
Treat WordPress as its own category. You need PHP, MySQL or MariaDB, and persistent storage for uploaded files. You must also handle WordPress, plugin, and server updates, plus backups.
Do you need a database?
If you do, you can let the app host manage it. Render, Fly.io, DigitalOcean, Heroku, and Laravel Cloud sell managed Postgres alongside your app. Railway offers a Postgres template, but classifies it as unmanaged. You remain responsible for enabling backups, tuning, monitoring, and maintenance. Netlify Database is managed Postgres billed through the same credits as your site.
You can also use an external service such as Neon, Supabase, Turso, or PlanetScale. The app lives on one host and the database lives on another. This works with many app hosts, but check supported drivers, regions, networking, and connection pooling first.
Running Postgres on the same VPS avoids a separate database-service fee. It uses the server’s CPU, memory, and storage, and you own the backups.
I covered this choice in Where to host a PostgreSQL database. For our hosting decision, remember that the database brings a second decision and a second bill.
How much traffic?
Most side projects get almost no traffic. “Just starting” is the right answer for nearly every new project.
Free tiers have limits. Usage-based hosts may charge per request, per GB transferred, and per CPU second. An idle project can be free on static or scale-to-zero plans. Always-on services, managed databases, and VPS instances usually keep billing without traffic.
What is your budget?
Your budget might be free, about $10, about $25, or open-ended.
You can host static sites and small apps for free. Around $5–10 buys a small PaaS app or an entry-level VPS. With around $25, you can combine a small PaaS app with an entry-level managed database. The exact limit depends on traffic and resource use.
The four kinds of hosting
Hosting options fall into four broad groups.
Static hosting and request-driven compute
Cloudflare Pages, Netlify, and Vercel can build and serve static files from a CDN. Cloudflare Workers, Netlify Functions, Vercel Functions, Deno Deploy, and Google Cloud Run run dynamic code with different runtimes and billing models.
Dynamic code runs in managed instances or isolates. The platform can reuse them across requests and remove them after an idle period. Cloud Run builds or accepts a container image, and needs extra configuration if you want its static files behind a CDN.
These platforms work well for static sites, frameworks with compatible adapters, and APIs with spiky traffic. Dynamic compute can scale to zero, although plan fees, builds, storage, bandwidth, and other resources may still cost money.
WebSocket support varies. Workers supports WebSockets, while Vercel Functions supports them in public beta. Deno Deploy supports them but can evict an instance. Cloud Run supports connections for up to 60 minutes, so clients must reconnect.
Local files are often temporary. Workers has a virtual filesystem with request-local /tmp, while Vercel and Cloud Run also provide temporary writable storage. Persistent data belongs in a database, object storage, or a mounted volume. Traditional database connections may need pooling or a serverless driver.
PaaS: platform as a service
Railway, Render, Fly.io, Heroku, DigitalOcean App Platform, and Laravel Cloud are application platforms, but they do not all work the same way.
You deploy code or a container. The platform manages the runtime, routing, logs, restarts, and TLS. Depending on the service and its settings, the process may stay running or scale to zero when idle.
These platforms fit many full-stack apps, APIs, workers, and bots. Check filesystem persistence, ports, request limits, Docker support, and background-process rules first.
A VPS often gives you more raw CPU and memory for the price. A PaaS also includes deployment, routing, TLS, logs, and restart management, so compare the whole setup.
VPS: your own server
VPS providers include Hetzner, DigitalOcean Droplets, Akamai Cloud (formerly Linode), Vultr, OVHcloud, Netcup, Contabo, and AWS Lightsail.
You rent a virtual machine, usually running Linux. You install Docker, a reverse proxy, your app, and the database. Backups, updates, and monitoring are also your job.
Many plans have a monthly price or cap, and you get full control. IPv4, storage, backups, transfer overages, and taxes may cost extra. You can run several small Docker projects on one box if its resources and CPU architecture fit them.
You also become the ops team. If Postgres fills the disk at 3 AM, nobody fixes it for you.
I have a free VPS course that goes from creating the server to running an app behind HTTPS, and a Linux server security course for the hardening part.
The big clouds
The big three are AWS, Google Cloud, and Azure. They offer almost every kind of infrastructure, usually behind a price sheet with forty rows.
They make sense when a team has compliance needs or cloud credits. You may also need a specific service that nobody else offers.
For a solo project, I prefer the parts that stay simple on their own. Google Cloud Run runs containers, AWS Lightsail works as a plain VPS, and S3 or R2 store files.
What the pricing page doesn’t say
Most hosting catches live in the fine print. It took me years to learn which lines matter.
Vercel’s Hobby plan only covers personal, non-commercial projects. Commercial projects need Pro, which starts at $20 a month for one deploying seat. Usage above its included credit and allowances costs extra.
Netlify allows commercial projects on its Free plan. The fine print there is the credit system. Every plan gets a monthly pool of credits, and production deploys, bandwidth, requests, and Functions compute all drain the same pool.
The Free plan gives you 300 credits a month. A production deploy costs 15 credits, so 300 credits are 20 deploys and nothing else. Bandwidth costs 20 credits per GB, so the same 300 credits are 15 GB of traffic. Requests are cheap at 2 credits per 10,000. Deploy previews, branch deploys, rollbacks, and form submissions cost nothing.
When the pool is empty, every project on the account shows a “Site not available” page until the next billing cycle. On Free you cannot buy more credits. Personal costs $9 a month for 1,000 credits. Pro costs $20 for 3,000 credits and includes unlimited team members. Both paid plans can top up, at $5 per 500 credits on Personal and $10 per 1,500 on Pro.
Usage billing still needs attention. Vercel Pro and Cloud Run charge beyond their allowances. Configure budget alerts on day one. If the provider supports a hard cap or automatic project pause, enable it explicitly because an alert alone may not stop spending. Railway and Laravel Cloud let you set a hard usage limit that stops services. Cloud Run has spend caps, still in preview as I write this.
Data transfer deserves its own check. New Vercel Pro teams get Flat Rate CDN by default since September 2026. It includes 1 TB of data transfer and 1 million CDN requests a month for a fixed bill. Spikes above that are served and not billed, within Vercel’s fair use rules, and sustained traffic above it means a higher tier. Teams still on usage-based billing get 1 TB of Fast Data Transfer and 10 million Edge Requests, then pay regional on-demand rates. Cloudflare Pages static assets and Workers have no egress charge.
Hetzner Cloud servers in Europe include at least 20 TB of outgoing traffic. US and Singapore allowances are lower, and IPv4 is billed separately. This can decide the winner for a media-heavy site.
Hetzner also raised its Cloud prices on June 15, 2026. The cheapest plan, the CX23, went from €3.99 to €5.49 a month before VAT and IPv4, and it is sold only in Germany and Finland. The US and Singapore plans now start at €15–17. Guides that quote €4 Hetzner servers are out of date.
Managed Postgres is billed separately on Render, Fly.io, DigitalOcean, Heroku, and Laravel Cloud. Railway Postgres uses the same metered project resources as your app, but remains an unmanaged database template. On a VPS, Postgres has no separate service fee but still consumes server resources and backup storage.
Stopping a server does not always stop its invoice. Vultr, AWS Lightsail, Hetzner, DigitalOcean, and Akamai continue billing stopped instances. Delete the instance to stop its compute charge, then check for separately billed disks, IPs, and snapshots.
Some sticker prices leave out part of the cost. Scaleway bills flexible IPv4 separately at about €0.005 per hour, or roughly €3.65 a month. Hetzner bills Primary IPv4 separately at €0.50 per month, excluding VAT. Netcup sells VPS plans on a discounted 12-month term or with hourly billing and no minimum term.
Cloudflare Workers is not a normal Node.js server process, but nodejs_compat supports many Node APIs. Its virtual filesystem can read bundled files and write request-local files under /tmp. Packages that need unsupported APIs or native binaries may still fail.
The current Deno Deploy supports Deno and Node applications. It can run npm dependencies, subprocesses, FFI, native addons, and filesystem operations. Instances remain disposable, so persistent data still belongs elsewhere. Its Free plan includes 1 million requests, 20 GiB of egress, and 10 hours of active CPU a month. Pro costs $20 a month.
Heroku removed its free tier in 2022. Fly.io has no ongoing free allowance, but new accounts get a trial lasting two Machine hours or seven days, whichever comes first. Hetzner has no general permanent free tier, although promotions may offer credits.
My picks by project type
These are the options I would choose today for each project and budget.
Static site
For a free static site, I would use Cloudflare. Pages allows commercial projects and does not meter static requests or bandwidth. The Free plan still limits builds, projects, file counts, and individual asset sizes.
I would stay on Cloudflare for a paid static project too. It can remain free within those limits, although paid account features, extra build capacity, R2 storage, and R2 operations can create costs without server code.
Netlify is the other host I would pick for a static site. Connect the repo and every push builds. Every pull request gets its own preview URL, and forms work without writing server code. The Free plan allows commercial use.
Count the credits before you commit to it. Twenty production deploys use the whole Free allowance, so a site that deploys every day needs Personal at $9 a month. A media-heavy site burns through the 15 GB of bandwidth even faster.
Full-stack app, Node or similar
For free hosting, use Cloudflare Workers when your framework has an adapter and its dependencies work with the Workers runtime. Workers Free includes 100,000 dynamic requests per UTC day and 10 milliseconds of CPU per invocation. Static-asset requests are free and unlimited. Workers Paid costs $5 a month and includes 10 million requests and 30 million CPU milliseconds.
A personal, non-commercial project can use Vercel Hobby. Railway also has a Free plan with $1 of usage a month for one small service.
Netlify Free can host a commercial full-stack app. Your server code runs as Netlify Functions, which bill compute at 10 credits per GB-hour. A function gets 1 GB of memory by default, so one hour of total function time costs 10 credits. Traffic, deploys, and requests come out of the same 300. Netlify supports Astro, Next.js, Nuxt, and the other common frameworks.
With about $5–10, I would choose Railway or Render. Railway Hobby costs $5 monthly and includes $5 of usage. Render offers a $7 Starter service. Both provide Git-connected deploys, logs, and Postgres you can add to the project. Remember that Railway’s database template is unmanaged.
Netlify Personal at $9 fits this budget too, if your app is static files plus functions rather than a long-running process. You get 1,000 credits and the option to top up.
Render’s Starter service is $7 and its smallest paid Postgres plan is $6, so about $13 a month covers a small app with a managed database. Railway bills the app and database resources by usage, so its total is not fixed. If you use Next.js on a commercial project, Vercel Pro starts at $20 before extra usage.
API with a database
Add the app and database prices as two separate services.
A small VPS with Postgres on the same box avoids a separate managed-database bill. DigitalOcean Basic Droplets start at $4, while its 1 GiB plan costs $6. Hetzner’s CX23 costs €5.49 a month plus €0.50 for IPv4, before VAT, and only in its German and Finnish locations. You handle the backups.
For an easy setup, I would use Railway. Hobby has a $5 monthly minimum, including $5 of usage. Your app and Postgres consume metered CPU, memory, storage, and network resources, so the final total depends on usage.
To scale to zero, pair Cloudflare Workers with D1 or Cloud Run with Neon. Workers and D1 both use serverless, usage-based models. With Cloud Run, an external database stays available while the container scales to zero.
Docker container
Railway, Render, Fly.io, Heroku, DigitalOcean App Platform, and Cloud Run can run Docker-based applications. Netlify does not run containers. It builds from your repo and deploys static files plus functions.
Choose based on how much server work you want. An entry-level VPS can run a small Docker app with Caddy for roughly €5–7 a month before VAT. Check its CPU architecture, memory, disk, transfer, IPv4 price, and backup needs. Persist Caddy’s /data directory so certificates survive container replacement.
A PaaS can run the same container while handling restarts and TLS. Its cost depends on the provider, resources, and whether the service stays active.
I have a free Docker course and a Caddy course if you want to go the VPS way.
Background worker or bot
A Discord bot that maintains a permanent gateway connection needs an always-running process. Use Railway with Serverless disabled, a paid Render worker, a Fly.io worker process, Heroku Basic, a DigitalOcean App Platform worker, or a VPS. Netlify Functions run per request, on a schedule, or as background jobs capped at 15 minutes, so they do not fit a bot that must hold a connection open.
If a script runs every hour and exits, compare a scheduled function or job with an always-on worker. Scheduled execution is often cheaper, but duration, memory, and plan limits decide the actual cost.
WordPress
A VPS is cheap, but you must manage the web server, PHP, MySQL or MariaDB, uploaded files, updates, and backups. If you do not want that maintenance, pay for managed WordPress hosting.
Laravel
Laravel Cloud is built for Laravel. Its Starter plan costs $5 a month plus usage and includes $5 in monthly usage credit. The first month is free. Compute can scale to zero, and you can set a hard spending limit.
A VPS with Forge also works. Forge manages deployments, queues, and scheduled jobs, but you still pay for and maintain the server and data services.
How I host my own things
These are the hosts I use for my own projects.
This blog is a static Astro site on Cloudflare Pages. It has about 2,000 posts and more than 3,000 tracked image files. It ran on Netlify for years, and the Git-push workflow was never the problem. I moved it in June 2026 to keep everything on Cloudflare, which already handled my DNS and Turnstile. Pages does not meter its static requests or bandwidth.
The site is mostly static, with five Pages Functions. They handle purchases, course access, newsletter signup, sponsor inquiries, and the AI-assisted app idea tool. I explained the platform in Cloudflare Workers and the Cloudflare course.
StackPlan is a full-stack Astro app with auth, a database, and a paid plan. It runs on Cloudflare Workers with D1 as the database. I wrote about the pieces in Astro SSR with D1 and Drizzle ORM and Better Auth in Astro on Cloudflare Workers. Both services have generous included usage, although the final cost depends on requests, CPU time, database rows, and storage.
My analytics runs on a self-hosted Plausible instance on a VPS. I pay a flat price without per-pageview billing, and I own the data. Updates and backups are my responsibility. The complete setup is in How to self-host Plausible Analytics.
I have used Railway for Astro apps with Postgres and Fly.io for Astro apps. I reach for Railway when I want a Git-connected deployment and a database in the same project. See Deploying an Astro + PostgreSQL app on Railway for that setup.
I do not run Kubernetes for side projects. I also avoid AWS when a simpler host can do the same job.
How to make the final choice
Start with Cloudflare for a static site because Pages does not meter static requests or bandwidth. Pick Netlify instead when you want its forms and its build workflow, and count your monthly deploys against the credits. If the app needs a server process and you want less ops work, compare a PaaS with a VPS. Add the database price and check whether the service sleeps.
Entry-level VPS plans commonly start around $4–7 a month before VAT. They work well when your budget is tight or you want to run several small projects, but you pay with your time. For spiky traffic and compatible code, Workers or Cloud Run use usage-based billing and can scale idle HTTP services to zero.
Before deploying, read the free tier terms and configure budget alerts. Enable a hard cap or automatic pause when the provider offers one.
I built HostingPicker around these four questions. Answer them and it lists the hosts that fit, including the price and catch for each. It is free.
Want me to talk about your product? You can sponsor this site.