Vercel is built around frontends and Functions, Render around long-running services and databases. How they compare on backends, WebSockets, workers, databases and where your app runs.
Render and Vercel both deploy from a Git push and both host frontends and APIs, so they often land on the same shortlist. They started from opposite ends: Vercel from frontends and serverless Functions, Render from Heroku-style web services, workers and managed databases.
In 2026 the line has blurred, with Vercel adding WebSockets, containers and long-running Daemons, but the defaults still differ. This guide compares the two for backend work and covers when a backend in your own AWS or GCP account with Encore (infrastructure from code) fits.
Each option is covered below, starting with Encore.
Encore is infrastructure from code for TypeScript and Go, with a platform that provisions and deploys into your own AWS or GCP account. You declare Postgres databases, Pub/Sub topics, cron jobs and buckets in code next to your API endpoints, and Encore provisions RDS, SNS and SQS and Fargate on AWS or the GCP equivalents, and Encore provisions an IAM role for the service.

An API with a database and an event that a worker handles after the response:
// orders/orders.ts
import { api } from "encore.dev/api";
import { SQLDatabase } from "encore.dev/storage/sqldb";
import { Topic, Subscription } from "encore.dev/pubsub";
const db = new SQLDatabase("orders", { migrations: "./migrations" });
interface OrderPlaced {
orderId: number;
email: string;
}
export const orderPlaced = new Topic<OrderPlaced>("order-placed", {
deliveryGuarantee: "at-least-once",
});
export const place = api(
{ expose: true, method: "POST", path: "/orders" },
async (p: { email: string; sku: string }): Promise<{ orderId: number }> => {
const row = await db.queryRow<{ id: number }>`
INSERT INTO orders (email, sku) VALUES (${p.email}, ${p.sku}) RETURNING id`;
await orderPlaced.publish({ orderId: row!.id, email: p.email });
return { orderId: row!.id };
},
);
// Runs outside the request, with retries, instead of inside a function timeout.
const _ = new Subscription(orderPlaced, "send-receipt", {
handler: async (e) => {
// call your email provider here, using e.orderId as the idempotency key
},
});
The migration in orders/migrations creates the orders table the queries use:
-- orders/migrations/1_create_orders.up.sql
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
email TEXT NOT NULL,
sku TEXT NOT NULL
);
Run in your terminal to get started locally.
encore run starts Postgres locally, applies the migrations and delivers Pub/Sub messages on your machine, and each push deploys to the environment you connected. The frontend can stay on Vercel: encore gen client writes a typed TypeScript client for the Next.js app, and the Vercel migration guide maps Functions, Cron Jobs and Marketplace databases to Encore.
For coding agents the backend is one codebase where the endpoint, its database and its topic are visible together, so a change to the order flow does not require editing a dashboard or a separate Terraform repository.
Render runs web services, private services, background workers and cron jobs as long-running processes, built from a Dockerfile or a native runtime for Node.js, Python, Ruby, Go, Rust or Elixir. Render Postgres and Render Key Value live in the same workspace, services in a region talk over a private network, and paid services can attach a persistent disk, which disables zero-downtime deploys for that service.
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, so the free tier is for trying the platform rather than production. Render fits classic API servers and workers, with the app and data running on Render's infrastructure, not in your own cloud account.
Vercel builds and serves frontends with framework-aware defaults, and runs backend code as Vercel Functions on Fluid compute. Functions default to a 300 second maximum duration, with a 4.5 MB request and response body limit. Postgres comes through Marketplace providers rather than a Vercel-run database.
Vercel has added backend features through 2026: WebSocket support became generally available in October, and Daemons run containerized queue consumers, though during the beta they run only in production and do not autoscale. Vercel remains the strongest option of the two for Next.js and other frontend frameworks.
A common setup uses both, keeping the frontend on Vercel for its framework integration and previews, and run the backend where long-running processes, queues and databases are first-class. Whether that backend sits on Render or in your own AWS account decides who owns the database, the network and the IAM boundaries.
Pick Vercel for the frontend, and for APIs that fit within Function limits. Pick Render when the backend is a set of long-running services, workers and a database that you want managed in one dashboard.
Pick Encore when the backend should run in your own AWS or GCP account, with Postgres, Pub/Sub and cron declared in TypeScript or Go, while the frontend stays on Vercel.
Vercel runs frontends and backend code as Vercel Functions on Fluid compute, with a 300 second default duration, and connects databases through its Marketplace. Render runs long-running web services, background workers and cron jobs, and offers its own managed Postgres and Key Value stores.
Render is the more direct fit for an always-on API server with workers, persistent disks and a database in the same dashboard. Vercel works for APIs that fit its Function limits and now supports WebSockets and containers.
Define the backend as Encore services in TypeScript or Go, for example an api endpoint backed by an SQLDatabase, and deploy it to an environment connected to your AWS account. Then generate a typed client with encore gen client and call it from the Next.js app on Vercel.
Deploy to your cloud on AWS and Google Cloud
without managing infrastructure
Encore lets developers and agents define application infrastructure directly in code, then automatically provisions it from local development to production in your AWS or GCP account.