Skip to content

Vercel alternatives: why we run Vercel and Cloudflare

For CTOs and engineersCTO decisions · Updated

Filip PapranecFounder, Digitaliko

Vercel alternatives: we run both. Illustration: a preview deployment window for a Next.js site next to an alchemy.run.ts window that declares a Worker, a D1 database and a KV namespace.Vercel alternatives: we run both. Illustration: a preview deployment window for a Next.js site next to an alchemy.run.ts window that declares a Worker, a D1 database and a KV namespace.

The best Vercel alternative depends on the app, so we run both. Next.js sites, including this one, stay on Vercel. New apps run on Cloudflare Workers with a D1 database, declared in one TypeScript file with Alchemy.

The short answer: Vercel wins on Next.js and preview deployments with zero config. Cloudflare wins when the app, its database, cache and storage should live in one account, declared as code and billed per request. Below is how we decide, what the list prices say, our real config, and one problem no listicle mentions: Vercel blocked deploys from commits written by our AI agent.

Vercel or Cloudflare: which app goes where?

We do not pick a host per company. We pick it per app, by what the app needs:

The app needsWhere it runs at our placeWhy
A Next.js marketing site with previewsVercelNext.js works there without config, every branch gets a preview URL
An older Next.js app with Postgres and PrismaVercelIt runs and nobody pays for a move that changes nothing for users
A new app with a database, cache and file storageCloudflare Workers, D1, KV, R2One account, one TypeScript file declares all of it
A whole app on one server you controlA plain VPSFull control, and the bill does not grow per request

The last row is not theory. We moved a client's online marketplace from a managed cloud to a plain VPS. The right host is the one that fits the app today, not the one the last project used.

What do Vercel and Cloudflare cost on paper?

List prices, retrieved on 2026-10-24. They change, so check the pages before you decide:

  • Vercel (pricing): Hobby is $0, Pro is $20 a month with $20 of included usage credit, then pay as you go. The page lists $20 a month per developer seat on Pro.
  • Cloudflare Workers (pricing): the Free plan has 100,000 requests a day. Workers Paid has a minimum of $5 a month per account, with 10 million requests and 30 million CPU milliseconds included.
  • Cloudflare D1 (limits): 500 MB per database on Free, 10 GB on Workers Paid. Free accounts get 5 GB of storage in total.

The trap is not the price of Pro. It is the Hobby plan on a client project:

Hobby teams are restricted to non-commercial personal use only. All commercial usage of the platform requires either a Pro or Enterprise plan.

Vercel
Fair Use Guidelines (retrieved 2026-10-24)

Vercel counts a paid consultant writing the code as commercial use. So a freelancer's free account hosting a client app is a terms problem, not a saving.

We do not publish what we pay. Our bills say nothing about yours: traffic, seats and services differ for every app.

How do we deploy to Cloudflare with Alchemy?

Alchemy describes itself as "a single, type-safe TypeScript program for your cloud". In practice it is one file next to the app. This is the shape of our alchemy.run.ts, shortened and with generic names:

import alchemy from "alchemy";
import { D1Database, KVNamespace, TanStackStart } from "alchemy/cloudflare";

const app = await alchemy("my-app", {
  stage: process.env.ALCHEMY_STAGE || "production",
});

const db = await D1Database("database", {
  migrationsDir: "../../packages/db/src/migrations",
});

const cache = await KVNamespace("cache", { title: "my-app-cache" });

const web = await TanStackStart("web", {
  cwd: "../../apps/web",
  bindings: {
    DB: db,
    CACHE: cache,
    BETTER_AUTH_SECRET: process.env.BETTER_AUTH_SECRET ?? "",
    BETTER_AUTH_URL: process.env.BETTER_AUTH_URL ?? "",
  },
});

await app.finalize();

The database, the cache and the app are declared in the same language as the app itself. No YAML, no clicking in a dashboard. A deploy goes like this:

  1. Change the schema

    The Drizzle schema is TypeScript. drizzle-kit generate writes a SQL migration file.

  2. Run the deploy

    Alchemy creates or updates the D1 database and the KV namespace, and applies the migrations from migrationsDir.

  3. Bind the resources

    The app gets DB and CACHE as bindings, typed, without connection strings.

  4. Publish the Worker

    The TanStack Start build goes to Cloudflare Workers under the same stage.

One honest trade-off. Alchemy keeps its state in a local .alchemy folder by default, and ours is gitignored. So our internal app deploys from a developer machine, not from CI. Alchemy offers a CloudflareStateStore for remote state (docs). We have not set it up yet. For a client app with several people deploying, that comes first.

Why does this site stay on Vercel?

This site is Next.js 16 with static article pages and next/image. On Vercel its vercel.json is literally {}. Every branch gets its own preview URL, which is how we review a new article before it goes live.

Vercel or Cloudflare: which app goes where. Left, Vercel: Next.js sites and older Next.js apps with Postgres, zero config, a preview URL per branch, but deploys are blocked when the commit author is not a team member. Right, Cloudflare Workers: new TanStack Start apps with D1, KV and R2, declared in one alchemy.run.ts file and billed per request.Vercel or Cloudflare: which app goes where. Left, Vercel: Next.js sites and older Next.js apps with Postgres, zero config, a preview URL per branch, but deploys are blocked when the commit author is not a team member. Right, Cloudflare Workers: new TanStack Start apps with D1, KV and R2, declared in one alchemy.run.ts file and billed per request.

Next.js can run on Cloudflare too. The OpenNext adapter deploys Next.js to Workers and supports Next.js 16. We have not moved this site there, so we cannot tell you how it compares. Moving a site that works, only to change hosts, is work with no result for anyone who reads it.

The same goes for older client apps. A system we built for a freight forwarder runs Next.js with Postgres and Prisma on Vercel. It stays there. New apps start on Cloudflare because that is where our template lives, not because the old ones failed.

Why did Vercel block deploys from our AI agent?

Our AI colleague works on issues in its own account and opens pull requests. After we merged one of its PRs, the production deploy on Vercel did not run. The deployment state was BLOCKED with the code TEAM_ACCESS_REQUIRED.

The reason: Vercel blocks deployments whose commit author is not a member of the Vercel team. A squash merge keeps the agent as the author. We tried merging with a different author email. That did not help, because GitHub adds a Co-authored-by line with the agent, and Vercel blocks co-authors too. Other teams hit the same with agent co-authors (Vercel community thread).

What works is a deploy without git metadata:

git archive origin/main | tar -x -C /tmp/site-export
cp -r .vercel /tmp/site-export/
cd /tmp/site-export && vercel deploy --prod

The other way is a Vercel seat for the agent. On Cloudflare the question never came up, because Alchemy deploys from code, not from commit authors.

Which other Vercel alternatives are there?

The usual lists name the same hosts. One line each, and an honest note on what we know:

  • Netlify: a similar model to Vercel, git-based deploys and previews. Not tested by us in production.
  • Render: long-running services and managed Postgres. Not tested by us.
  • A VPS with Coolify: your own server with a deploy UI on top. We run plain VPS workloads, Coolify we have not used in production.

If someone sells you a list of ten hosts, ask which of them they run today.

Is your app ready to leave Vercel?

Go through it before you start a move. Each point is a question your repo can answer:

The first point surprises most teams. A Next.js app on Vercel often uses platform features nobody wrote down. Find them before the move, not after.

How we decide what an agent may change, and what code checks before a merge, is in Harness engineering in practice.

Want an app that runs where it fits?

We build and run web applications on Vercel, Cloudflare or your own server, with the infrastructure in your account and in code. See custom web application development. AI writes all of our code today, and a senior is accountable for the result. Since 2023 we have delivered 15+ production projects.

We get back to you within two business days, and together we pick what to fix first.

If you'd rather talk first, book a 15-minute meeting with Filip.

Which of your apps is on its host only because nobody moved it?

In short

  • Pick the host per app, not per company: Next.js sites on Vercel, new apps with a database on Cloudflare Workers and D1.
  • Vercel Hobby is non-commercial only. A client project needs Pro.
  • Alchemy declares the Worker, D1 and KV in one TypeScript file. Its state is local by default.
  • Vercel blocks deploys from commit authors outside the team, AI agents included. A git-less export deploy or a seat fixes it.

Frequently asked questions

What is the best Vercel alternative?

It depends on the app. For a Next.js site, Vercel itself is hard to beat. For an app that needs a database, cache and storage in one account, billed per request, we use Cloudflare Workers with D1. Netlify, Render or a VPS with Coolify are other options, but we have not run them in production.

Is Cloudflare Workers cheaper than Vercel?

On list prices the entry point is lower: Workers Paid starts at $5 a month per account with 10 million requests included, Vercel Pro is $20 a month with $20 of usage credit (both retrieved 2026-10-24). What you actually pay depends on traffic, seats and which services you use, so compare with your own numbers.

Can I run Next.js on Cloudflare?

Yes, through the OpenNext adapter, which deploys Next.js to Cloudflare Workers and supports Next.js 16. We have not moved this site there, so we cannot say how it behaves compared with Vercel.

Can I use the Vercel Hobby plan for a client project?

No. Vercel says Hobby is for personal, non-commercial use, and that includes a paid consultant writing the code. A client project needs Pro or Enterprise.

Why does Vercel block my deployment?

One common cause: the commit author or a Co-authored-by line is not a member of the Vercel team. That happens with commits written by AI agents. Deploy a git-less export of the code, or give the agent a seat.

Ask AI about this article

The AI also draws on our other articles and experience from real projects.

ChatGPTClaudePerplexity
Engineering

Other articles

CTO decisions

Claude Code pricing for a team: plans, API and agents

Claude Code pricing from Anthropic's public list (October 2026): Pro, Max, Team seats, Enterprise and API tokens. Which one fits developers, which one an always-on agent and a CI reviewer run on, and the guardrails that stop a background agent from burning the budget.

CTO decisions

Better Auth vs Clerk: why we chose Better Auth

Better Auth vs Clerk comes down to where your users and sessions live. We moved from NextAuth to Better Auth in every new app and never picked Clerk. Our real config, the plugins we run, Clerk pricing and when Clerk is the better call.

CTO decisions

Drizzle vs Prisma: why we run both in production

Drizzle vs Prisma from two ORMs we run in production: Prisma on Postgres in older client apps, Drizzle on Cloudflare D1 in everything new. Real config, the migration flow, what Prisma 7 changed and when we would not switch.

Time to stop planning and start solving.

Contact

  • Digitaliko s.r.o.
    Šípková 377/17
    958 03 Malé Uherce, Slovakia
  • Get in touch
    info@digitaliko.com
    +421 950 595 506
    WhatsApp