Tutorials Search / Shipping & infrastructure / Deploy on Render
📝 Written ● Beginner Updated 2026-05-13

Deploy on Render

Render is the most Heroku-shaped of the post-Heroku PaaSes — same five service types, same flat monthly pricing, same "connect a repo, deploy" flow. The trade against Railway is less magic in detection; the trade against Fly is fewer regions. The win is that the bill is the bill.

If you've used Heroku at any point in the last decade, Render's UI is going to feel deeply familiar. Web services, background workers, cron jobs, static sites, managed databases — same five-service mental model, same per-service settings pages, same "this branch builds and deploys automatically" workflow. The fact that this shape feels like home to so many developers is exactly why Render's adoption has been steady: nothing new to learn if you'd shipped on Heroku, with all the things you wished Heroku would fix.

The most concrete improvement over Heroku is pricing. Render's plans are flat per service per month — a web service is $7, a worker is $7, a managed Postgres is $7+, a static site is free. The bill at the end of the month is the same as the bill at the start. This sounds boring, and it is, and that's the point. For projects where you want to know exactly what you're paying before the month begins, Render is the friendliest answer.

The trade-offs are real but bounded. Render has fewer regions than Fly (a handful, all in North America/Europe/Asia, not 30+). Auto-detection of stacks is rougher than Railway — you'll often write a tiny render.yaml or set explicit start commands. Cold starts on the free tier are 30–60 seconds, which is fine for a personal site but terrible for anything user-facing. None of these are dealbreakers; they're the cost of "boring works."

What you'll learn

Step 1: Sign up + connect GitHub

1

Render.com, GitHub OAuth

Sign up at render.com with your GitHub account. The OAuth flow asks for repo access — scope it to specific repos rather than "all" for safety. No credit card required until you create a non-free service.

Render also supports GitLab and Bitbucket if you're not on GitHub.

Step 2: Pick a service type

2

Five shapes

Render's service types:

  • Static Site — built from your repo's static assets. Free. Good for plain HTML, React/Vue SPAs (after build), documentation sites. CDN-served globally.
  • Web Service — a long-running HTTP server. The most common type. $7/month for the starter tier; bigger plans available.
  • Background Worker — a long-running process with no HTTP port. For job queues, message consumers, etc. $7/month.
  • Cron Job — a script that runs on a schedule. Cheap; charged per run.
  • Private Service — a web service only reachable from your other Render services. For internal APIs. $7/month.

Plus managed databases: Postgres, Redis, Key Value — separate products at their own per-month prices.

Step 3: Deploy a web service

3

The most common flow

Click New + → Web Service. Pick the repo. Configure:

  • Name: anything; this becomes part of the URL.
  • Region: closest to your users.
  • Branch: usually main.
  • Build command: what to run to build (e.g., npm install && npm run build).
  • Start command: what to run to start the server (e.g., npm start).
  • Plan: Free (with cold starts) or Starter ($7/month, always-on).

Click Create Web Service. Render builds and deploys; the URL is live in a few minutes.

The free tier has cold starts. A free web service that hasn't received a request in 15 minutes is spun down. The next request wakes it up — taking 30–60 seconds. Fine for hobby projects you visit occasionally; not okay for anything with real users. The $7 Starter tier doesn't have this.

Step 4: Add a Postgres database

4

Managed; one click

From your dashboard, New + → PostgreSQL. Pick name, region (same as your service ideally), plan ($7/mo starter is fine for most apps). Render provisions a managed Postgres in a couple of minutes.

To connect: copy the "Internal Database URL" from the Postgres dashboard, set it as the DATABASE_URL env var on your web service. Internal URLs only work within Render's network — they're private and don't go over the public internet. There's also an "External Database URL" if you need to connect from outside Render (e.g., from your local machine), but use the internal one for the service.

Step 5: Environment variables

5

Per-service Environment tab

Each service has an Environment tab where you set env vars. Secret variables are masked; non-secret ones aren't. Add API_KEY=..., NODE_ENV=production, etc. as needed. Render auto-redeploys when you save changes — you don't need to manually trigger.

Render also has Environment Groups — sets of variables you can attach to multiple services. Useful when several services share secrets (a worker and a web service both need the database URL).

Step 6: Custom domain + TLS

6

One CNAME, Render handles TLS

Service settings → Custom Domains → Add Custom Domain. Render gives you a CNAME target. Add it at your DNS provider:

  • Name: your subdomain (or @ if your DNS provider supports apex CNAMEs).
  • Value: the target Render provided.

Within minutes Render validates and issues a free TLS cert (Let's Encrypt under the hood). Auto-renews forever; you don't think about it again.

Step 7: render.yaml for production discipline

7

Infrastructure-as-code, optional

If you don't want the dashboard to be the source of truth for your config, put a render.yaml at the repo root:

services:
  - type: web
    name: my-api
    env: node
    buildCommand: npm install && npm run build
    startCommand: npm start
    plan: starter

databases:
  - name: my-postgres
    plan: starter

Commit it. From now on, the config in git is the truth. Render's "Blueprints" feature reads render.yaml when you create the project; for an existing project you can switch to it via Settings.

Step 8: When Render isn't the right pick

8

Three cases

  • You want global edge. Render's regions are limited. Fly.io wins for multi-region by a wide margin.
  • You want the absolute easiest onboarding. Railway's detection is friendlier; Render asks you to specify build/start commands more often.
  • You want pay-only-for-what-you-use. Render's flat plans mean a barely-used service still costs $7/month. Railway's usage-based pricing is cheaper for low-traffic projects.
The free tier is enough for testing, not production. Free web services have cold starts. Free Postgres has a 90-day retention limit and gets deleted after that. Both are explicit in the docs but easy to miss; if anything matters, use the paid tier from day one.

What's next