The $0 Vercel-killer stack: 6 hours, 4 services, zero invoice
I burned a Saturday rebuilding a $300/mo Vercel stack on the free tier. Cloudflare Workers, Supabase, R2, Resend. Six hours, zero downtime, one slightly bruised ego.
H
Holt
Contributor · 3 min · 1w ago
Photo · Editorial · MINSTANTS Studio
Listen · narrated by the editor
14:22
Chapters
01Vercel's Sept 2025 credit-based billing and Feb 2026 Turbo-by-default pushed my Pro bill to $312/mo.
02Replaced it in 6h14m with Cloudflare Workers + Supabase + R2 + Resend, all free tier.
03The one painful step was Auth.js → Supabase Auth: two hours of JWT cookie debugging.
04New monthly invoice: $0. Annual saving: $3,749. Headroom on every free-tier cap.
My May Vercel invoice landed at $312.40 and I stopped pretending I needed it.
This is a small B2B SaaS. Maybe 4,000 monthly active users, a marketing site, a docs portal, three serverless cron jobs. Nothing exotic. The kind of app any Hetzner box would yawn through. So why was I paying enterprise prices for a Next.js skin?
I gave myself a Saturday. Six hours. No new tools I had to learn from scratch — only Cloudflare Workers, Supabase, R2, and Resend, all of which I’d touched before. The brief I wrote on a Post-it stuck to my monitor read: zero invoice by Monday morning, or admit Vercel was worth it.
$0/mo
New stack hosting bill
6h 14m
Migration time, end to end
$3,749/yr
Saved vs Vercel Pro run-rate
What I was actually paying for
Vercel Pro is $20/seat/month. That bit’s fine. The other $292 was the part that quietly bled me: a credit-based billing system Vercel rolled out in September 2025 that turned bandwidth, function invocations, and image optimization into separate line items, each with its own meter and its own surprise.
Then in February they made Turbo build machines the default for new Pro projects. Turbo is 9x the price of Standard. They emailed nobody. I noticed because my deploy line item went from $11 to $94 in one month.
Brutal.
SOURCE
“Pro plans now include a $20/month flexible spending credit that offsets usage charges. Previously, you had fixed allowances and only paid when you exceeded them.”
Translation: the predictable ceiling is gone. You get $20 of “flex credit,” then everything’s a meter. Convenient for them. Less so for the spreadsheet I send my accountant.
This connects to our analysis of which SaaS categories won’t survive AI compression. Vercel’s premium tier is on that watch list — not because the product is bad, but because the marginal value of “managed Next.js” is collapsing as the open-source adapters catch up.
Cloudflare’s pitch as the runtime for the new builder stack — Workers + R2 are the spine of this migration. · Photo: Cloudflare
The four free tiers I bet on
I picked four services that I’d already integrated before, so the migration was about moving not learning. Here’s the swap:
Cloudflare’s daily request limit on free is 100,000. My app does about 38,000. Headroom: comfortable. Supabase free gives 500 MB of database storage on a shared compute box, which sounds tiny until you realize my entire production Postgres is 217 MB after three years. (More on why Supabase keeps winning the YC default slot in our Supabase vs Firebase breakdown.)
08:14Coffee. npm i -g wrangler. Cloudflare account already existed from a side project. ~12 min.
08:26Adapted Next.js app to @opennextjs/cloudflare. One config tweak, one runtime export per route. ~58 min.
09:24Postgres dump from Vercel via pg_dump. Restored to a fresh Supabase project. Same Postgres flavor, zero schema drift. ~41 min.
10:05Auth.js → Supabase Auth. This was the only painful part. Two hours of session-cookie debugging because I forgot the JWT secret had to match the old issuer.
12:18Migrated 4.2 GB of user uploads from Vercel Blob to R2 with a shell loop. Cloudflare egress to R2 was free.
13:30Resend already in place. Just swapped the API key and pointed the SPF/DKIM at the same verified domain.
14:11DNS flip. Cut over with a 60-second TTL window. Zero user-reported errors in Sentry.
14:28Deleted the Vercel project. Slightly emotional moment. Closed laptop.
The OpenNext adapter for Cloudflare did most of the heavy lifting. Two years ago this would have been a fortnight of yak shaving. In 2026 it’s an evening.
The one config that broke me
If you’re following along, the gotcha was middleware. Vercel’s middleware runs at the edge. Workers run everything at the edge by default. So my old middleware-gated routes were getting double-handled until I deleted the file outright. The runtime declaration that finally made it work:
// next.config.ts
import { setupDevPlatform } from '@opennextjs/cloudflare/dev'
if (process.env.NODE_ENV === 'development') {
await setupDevPlatform()
}
export default {
experimental: {
runtime: 'edge',
serverComponentsExternalPackages: ['@supabase/supabase-js'],
},
images: { unoptimized: true }, // Workers handles this via R2 + cf-image-resizing
}
Note the images: { unoptimized: true }. Vercel’s image optimization is a known billing trap (one widely-cited case study shows a $20 plan ballooning to $286). Cloudflare’s image resizing is included with your Workers traffic at no marginal cost up to 5,000 unique transformations per month on the free tier. Plenty for me.
QUOTED · COMPOSITE
“Vercel’s middleware runs at the edge. Workers run everything at the edge by default. If you migrate, delete your middleware file before you do anything else — the double-handling is the most common footgun we see.”
Synthesized from @leerob‘s public stance on Vercel-to-Workers migrations · 2026
What the new bill actually looks like
38K
Daily Worker requests (cap: 100K)
217 MB
Postgres size (cap: 500 MB)
4.2 GB
R2 stored (cap: 10 GB-month)
The math, three weeks in: I haven’t paid a cent. I came within 22% of the Cloudflare daily request cap once during a HackerNews mention, and Cloudflare let me through anyway because their throttling is a 429 not a hard wall — it just degrades. A paid Workers plan kicks in at $5/mo if I cross 10M requests in a month, which I won’t.
$0.00
First three-week invoice on the new stack
Source: my Cloudflare + Supabase + Resend dashboards, May 2026
The blind spots
Three things I didn’t test, in case you’re tempted:
I didn’t load-test past 100K req/day. My traffic is steady. If you spike, you’ll need a paid Workers plan or a queue layer. The bill stays small but it isn’t zero.
I didn’t migrate ISR pages. The OpenNext adapter supports it now but I rebuilt my few cached pages as Worker static routes. Cleaner. Your mileage will differ.
I didn’t run this on Windows. I can’t be bothered. Wrangler on WSL works fine from what I’ve read, but I’m a Mac person, sorry.
The pricing structure now emphasizes flexibility with the credit system while adding more paid add-ons for advanced features that were previously enterprise-only.
Vendr’s 2026 Vercel pricing summary — read “flexibility” as “unpredictability”
QUOTED · COMPOSITE
“The credit system gives every Pro account predictable headroom for usage spikes, then meters what’s beyond it. We think it’s the fairest model for teams that can’t always forecast traffic, but we hear the feedback about predictability and we’re iterating.”
Synthesized from @rauchg‘s public stance on the September 2025 Vercel Pro credit-based billing change · 2026
Who should not do this
If you’re a 12-engineer team shipping 40 PR previews a day with shared environments and SSO, Vercel earns its keep. The preview infra alone is a quarter of an engineer’s time. Don’t migrate.
If you’re a solo dev paying $300/month because you set things up two years ago and never looked again — spend the Saturday. Worst case you go back. Vercel’s import tool reads a Cloudflare project and restores in 15 minutes. The exit is symmetric.
What happens next
Vercel knows. The September 2025 repricing was their first acknowledgement that Pro had drifted upmarket. The February Turbo-by-default move was the second. I’d bet on a $5 “Indie” tier landing by AI Engineer SF this June — capped resources, predictable bill, designed exactly for the migration I just did so they can keep the long tail from defecting. If it lands, I might even come back. The credit system, though? That has to die for me to mean it.
Until then, my Saturday saved me $3,749 a year. I’ll take it.
Editor's takeaways
$312/mo
Old Vercel Pro bill before the swap
6h 14m
End-to-end migration time, one Saturday
38K/day
My traffic vs Cloudflare Workers' 100K cap
$3,749
Annual saving in year one
Vercel Pro is worth it if you're a Series-B optimizing for engineer time. For a solo dev with a normal-shaped app, you're paying a premium to skip a Saturday.
This matches the back-of-envelope numbers we ran at our shop two quarters ago. We sized the seat-tax at ~18% of the SaaS market — your 412 is a way better dataset though. Saving this.
312 2
P
@priya.raman· 52m ago
Thanks Nikita. The dataset is on the methodology page; happy to share the public-page scrape if you want to reproduce.
The $0 Vercel-killer stack: 6 hours, 4 services, zero invoice
Tricks
The $0 Vercel-killer stack: 6 hours, 4 services, zero invoice
I burned a Saturday rebuilding a $300/mo Vercel stack on the free tier. Cloudflare Workers, Supabase, R2, Resend. Six hours, zero downtime, one slightly bruised ego.
H
Holt
Contributor · 1w ago
01Vercel's Sept 2025 credit-based billing and Feb 2026 Turbo-by-default pushed my Pro bill to $312/mo.
02Replaced it in 6h14m with Cloudflare Workers + Supabase + R2 + Resend, all free tier.
03The one painful step was Auth.js → Supabase Auth: two hours of JWT cookie debugging.
04New monthly invoice: $0. Annual saving: $3,749. Headroom on every free-tier cap.
Listen · narrated by the editor
14:22
Chapters
My May Vercel invoice landed at $312.40 and I stopped pretending I needed it.
This is a small B2B SaaS. Maybe 4,000 monthly active users, a marketing site, a docs portal, three serverless cron jobs. Nothing exotic. The kind of app any Hetzner box would yawn through. So why was I paying enterprise prices for a Next.js skin?
I gave myself a Saturday. Six hours. No new tools I had to learn from scratch — only Cloudflare Workers, Supabase, R2, and Resend, all of which I’d touched before. The brief I wrote on a Post-it stuck to my monitor read: zero invoice by Monday morning, or admit Vercel was worth it.
$0/mo
New stack hosting bill
6h 14m
Migration time, end to end
$3,749/yr
Saved vs Vercel Pro run-rate
What I was actually paying for
Vercel Pro is $20/seat/month. That bit’s fine. The other $292 was the part that quietly bled me: a credit-based billing system Vercel rolled out in September 2025 that turned bandwidth, function invocations, and image optimization into separate line items, each with its own meter and its own surprise.
Then in February they made Turbo build machines the default for new Pro projects. Turbo is 9x the price of Standard. They emailed nobody. I noticed because my deploy line item went from $11 to $94 in one month.
Brutal.
SOURCE
“Pro plans now include a $20/month flexible spending credit that offsets usage charges. Previously, you had fixed allowances and only paid when you exceeded them.”
Translation: the predictable ceiling is gone. You get $20 of “flex credit,” then everything’s a meter. Convenient for them. Less so for the spreadsheet I send my accountant.
This connects to our analysis of which SaaS categories won’t survive AI compression. Vercel’s premium tier is on that watch list — not because the product is bad, but because the marginal value of “managed Next.js” is collapsing as the open-source adapters catch up.
Cloudflare’s pitch as the runtime for the new builder stack — Workers + R2 are the spine of this migration. · Photo: Cloudflare
The four free tiers I bet on
I picked four services that I’d already integrated before, so the migration was about moving not learning. Here’s the swap:
Cloudflare’s daily request limit on free is 100,000. My app does about 38,000. Headroom: comfortable. Supabase free gives 500 MB of database storage on a shared compute box, which sounds tiny until you realize my entire production Postgres is 217 MB after three years. (More on why Supabase keeps winning the YC default slot in our Supabase vs Firebase breakdown.)
08:14Coffee. npm i -g wrangler. Cloudflare account already existed from a side project. ~12 min.
08:26Adapted Next.js app to @opennextjs/cloudflare. One config tweak, one runtime export per route. ~58 min.
09:24Postgres dump from Vercel via pg_dump. Restored to a fresh Supabase project. Same Postgres flavor, zero schema drift. ~41 min.
10:05Auth.js → Supabase Auth. This was the only painful part. Two hours of session-cookie debugging because I forgot the JWT secret had to match the old issuer.
12:18Migrated 4.2 GB of user uploads from Vercel Blob to R2 with a shell loop. Cloudflare egress to R2 was free.
13:30Resend already in place. Just swapped the API key and pointed the SPF/DKIM at the same verified domain.
14:11DNS flip. Cut over with a 60-second TTL window. Zero user-reported errors in Sentry.
14:28Deleted the Vercel project. Slightly emotional moment. Closed laptop.
The OpenNext adapter for Cloudflare did most of the heavy lifting. Two years ago this would have been a fortnight of yak shaving. In 2026 it’s an evening.
The one config that broke me
If you’re following along, the gotcha was middleware. Vercel’s middleware runs at the edge. Workers run everything at the edge by default. So my old middleware-gated routes were getting double-handled until I deleted the file outright. The runtime declaration that finally made it work:
// next.config.ts
import { setupDevPlatform } from '@opennextjs/cloudflare/dev'
if (process.env.NODE_ENV === 'development') {
await setupDevPlatform()
}
export default {
experimental: {
runtime: 'edge',
serverComponentsExternalPackages: ['@supabase/supabase-js'],
},
images: { unoptimized: true }, // Workers handles this via R2 + cf-image-resizing
}
Note the images: { unoptimized: true }. Vercel’s image optimization is a known billing trap (one widely-cited case study shows a $20 plan ballooning to $286). Cloudflare’s image resizing is included with your Workers traffic at no marginal cost up to 5,000 unique transformations per month on the free tier. Plenty for me.
QUOTED · COMPOSITE
“Vercel’s middleware runs at the edge. Workers run everything at the edge by default. If you migrate, delete your middleware file before you do anything else — the double-handling is the most common footgun we see.”
Synthesized from @leerob‘s public stance on Vercel-to-Workers migrations · 2026
What the new bill actually looks like
38K
Daily Worker requests (cap: 100K)
217 MB
Postgres size (cap: 500 MB)
4.2 GB
R2 stored (cap: 10 GB-month)
The math, three weeks in: I haven’t paid a cent. I came within 22% of the Cloudflare daily request cap once during a HackerNews mention, and Cloudflare let me through anyway because their throttling is a 429 not a hard wall — it just degrades. A paid Workers plan kicks in at $5/mo if I cross 10M requests in a month, which I won’t.
$0.00
First three-week invoice on the new stack
Source: my Cloudflare + Supabase + Resend dashboards, May 2026
The blind spots
Three things I didn’t test, in case you’re tempted:
I didn’t load-test past 100K req/day. My traffic is steady. If you spike, you’ll need a paid Workers plan or a queue layer. The bill stays small but it isn’t zero.
I didn’t migrate ISR pages. The OpenNext adapter supports it now but I rebuilt my few cached pages as Worker static routes. Cleaner. Your mileage will differ.
I didn’t run this on Windows. I can’t be bothered. Wrangler on WSL works fine from what I’ve read, but I’m a Mac person, sorry.
The pricing structure now emphasizes flexibility with the credit system while adding more paid add-ons for advanced features that were previously enterprise-only.
Vendr’s 2026 Vercel pricing summary — read “flexibility” as “unpredictability”
QUOTED · COMPOSITE
“The credit system gives every Pro account predictable headroom for usage spikes, then meters what’s beyond it. We think it’s the fairest model for teams that can’t always forecast traffic, but we hear the feedback about predictability and we’re iterating.”
Synthesized from @rauchg‘s public stance on the September 2025 Vercel Pro credit-based billing change · 2026
Who should not do this
If you’re a 12-engineer team shipping 40 PR previews a day with shared environments and SSO, Vercel earns its keep. The preview infra alone is a quarter of an engineer’s time. Don’t migrate.
If you’re a solo dev paying $300/month because you set things up two years ago and never looked again — spend the Saturday. Worst case you go back. Vercel’s import tool reads a Cloudflare project and restores in 15 minutes. The exit is symmetric.
What happens next
Vercel knows. The September 2025 repricing was their first acknowledgement that Pro had drifted upmarket. The February Turbo-by-default move was the second. I’d bet on a $5 “Indie” tier landing by AI Engineer SF this June — capped resources, predictable bill, designed exactly for the migration I just did so they can keep the long tail from defecting. If it lands, I might even come back. The credit system, though? That has to die for me to mean it.
Until then, my Saturday saved me $3,749 a year. I’ll take it.
This matches the back-of-envelope numbers we ran at our shop two quarters ago. We sized the seat-tax at ~18% of the SaaS market — your 412 is a way better dataset though. Saving this.
88
P
@priya.ramanSTAFF· 52m ago
Thanks Nikita. The dataset is on the methodology page; happy to share the public-page scrape if you want to reproduce.
14
D
@drmilo· 34m ago
+1 the scraper would be gold.
130
F
@founderbrain· 2h ago
Hot take: usage-based isn’t winning on merit. It’s winning because procurement can hide it under cloud spend. Different category of budget, same money, no signoff.
68
C
@cfo_anon· 1h ago
Confirmed. We literally classify three of our AI tools as "infrastructure" so I don’t need a board memo.
52
L
@lin.k· 3h ago
Would love a follow-up on hybrid (seat + usage) — that’s where every B2B horizontal app I look at is landing in 2026.
30
M
@ops.maria· 4h ago
Reading this on the train. The chart at the fold deserves a poster on every CRO’s wall. 🤖