SaaS costs add up fast when you're shipping solo

When you're a solo builder shipping multiple products, the usual stack bleeds money quietly. Google Workspace for email. Vercel or Netlify for hosting. PlanetScale for databases. AWS S3 for storage. OpenAI for AI. Each one is "only $5-20/month" — until you're running 10 projects and paying $200+/month before a single user signs up.

The typical solo builder bill: Google Workspace ($7/user) + Vercel Pro ($20) + PlanetScale ($39) + S3 ($5-20) + OpenAI API ($20+) + domain email forwarding ($3-5) = $94-111/month just to keep the lights on.

I was paying this. Then I discovered that Cloudflare gives away an absurd amount of infrastructure for free — and not "free tier with gotchas" free. Actually free, at scale, for production workloads.

Everything I run on Cloudflare — for $0

Here's my actual production stack. Not a demo. Not a side project. Real sites with real traffic.

Workers

Full backend APIs, server-side rendering, cron jobs. 100K requests/day free. I run 10+ workers handling scraping, content generation, and API endpoints.

Pages / Workers Assets

Static sites and SPAs with global CDN. Unlimited bandwidth. Zero cold starts. Every project page, landing page, and blog you're reading right now.

D1 (SQLite)

Serverless SQL databases. 5GB free. I store 9,000+ coupons, store metadata, and full content across multiple D1 databases. Zero config, zero maintenance.

R2 (Object Storage)

S3-compatible storage with zero egress fees. 10GB free. Images, assets, backups. No surprise bills when traffic spikes.

Email Routing

Custom domain email (anything@yourdomain.com) forwarded to Gmail. Catch-all rules, per-address routing. Replaces Google Workspace for receiving email.

Workers AI

Run open-source LLMs (Llama, Qwen, Mistral) at the edge. 10K neurons/day free. I use it for content generation, chat assistants, and data processing.

KV (Key-Value)

Global key-value store for config, sessions, and caching. 100K reads/day free. Fast, globally replicated, zero setup.

Cron Triggers

Scheduled Workers that run on a cron. I run scraping agents every 4 minutes across multiple projects. No external scheduler needed.

What I actually pay vs. what I'd pay elsewhere

Service Traditional Cloudflare
Hosting (10 sites) $20-50/mo $0 (Workers + Assets)
Database $39/mo (PlanetScale) $0 (D1, 5GB free)
Object Storage $5-20/mo (S3 + egress) $0 (R2, no egress)
Custom Email $7/mo (Google Workspace) $0 (Email Routing)
AI / LLM $20+/mo (OpenAI) $0 (Workers AI free tier)
Cron / Scheduling $5-10/mo (EasyCron, etc.) $0 (Cron Triggers)
CDN / Cache Included or $10+ $0 (global CDN default)
Total ~$111/mo $0/mo

That's roughly $1,332 saved per year versus the traditional stack — without giving up anything I actually need.

How I actually use this in production

Workers as full backends. Every project I ship runs on Workers. Not just static sites — full Hono.js APIs with routing, middleware, auth, and database queries. My coupon aggregator runs a Worker that scrapes 6,000+ stores on a 4-minute cron, processes the data, and serves it through a frontend — all on one Worker.

name = "my-project"
main = "src/index.ts"
compatibility_date = "2025-01-01"

# Free database
[[d1_databases]]
binding = "DB"
database_id = "your-d1-id"

# Free object storage
[[r2_buckets]]
binding = "BUCKET"
bucket_name = "my-assets"

# Free AI
[ai]
binding = "AI"

# Free cron (every 4 min)
[triggers]
crons = ["*/4 * * * *"]

D1 as the only database I need. SQLite at the edge, globally replicated, zero cold starts. I run full-text search, complex joins, and analytics queries — all within the free tier. 5GB covers more than you'd think when you're storing structured data.

Email Routing instead of Google Workspace. I set up raj@rajvardhman.com in about 2 minutes. Cloudflare adds the MX records automatically, I verified my personal Gmail as the destination, and now all email to my domain lands in my inbox. No $7/month Google Workspace required.

Workers AI for the chat on this site. The "Ask Raj's AI" chat you see on this page? It runs Qwen3-30B on Workers AI. No OpenAI API key. No monthly bill. The model runs at the edge, returns in under 2 seconds, and costs me nothing.

R2 for zero-egress storage. The killer feature of R2 isn't the storage — it's the zero egress fees. With S3, you pay every time someone downloads a file. With R2, bandwidth is free. For image-heavy sites, this alone saves $20-50/month.

Custom domain email in 5 minutes (no Google Workspace)

This is the easiest win. If you're paying $7/month/user for Google Workspace just to get you@yourdomain.com, stop.

  1. Go to Cloudflare Dashboard → your domain → Email → Email Routing
  2. Click Enable — Cloudflare auto-adds MX and TXT records
  3. Add your personal email as a destination address and verify it
  4. Create a catch-all rule (*@yourdomain.com → your Gmail)

That's it. Every email to any address at your domain now arrives in your existing inbox. Reply using Gmail's "Send as" feature to make it look like it came from your custom domain.

Advanced: Email Workers. Want to go further? Cloudflare Email Workers let you programmatically process incoming emails. Parse them, store in D1, filter spam, trigger webhooks — all in code. I'm building a full inbox UI this way. Inbound is free. Outbound needs an external service (Resend, SES), but that's $0 on their free tiers too.

Where Cloudflare's free tier falls short

This isn't a Cloudflare ad. Here's where the free tier has real limits:

The $5 upgrade. If you outgrow the free tier, the Workers Paid plan at $5/month is the best value in cloud computing. 10M requests, 30s CPU time, 10GB D1, 10GB R2 — that's a full production infrastructure for the price of a coffee.

How to migrate in a weekend

If you're running a typical Next.js / Vercel / PlanetScale stack, here's the migration path:

You're using Replace with Effort
Vercel / Netlify Workers + Hono.js ~2 hours
PlanetScale / Supabase D1 (SQLite) ~1 hour
AWS S3 R2 ~30 min (same API)
Google Workspace email Email Routing ~5 min
OpenAI API Workers AI ~15 min
EasyCron / cron jobs Cron Triggers ~5 min

The biggest shift is mindset. Cloudflare Workers use the V8 isolate model, not containers. No filesystem, no long-running processes, no Node.js globals. If you're used to Express, switch to Hono.js — it's designed for Workers and feels identical.

import { Hono } from 'hono'

const app = new Hono()

app.get('/', (c) => c.text('Hello from Cloudflare'))

app.get('/api/users', async (c) => {
  const users = await c.env.DB.prepare(
    'SELECT * FROM users LIMIT 50'
  ).all()
  return c.json(users.results)
})

export default app

The best infrastructure is the one you don't pay for

I'm not saying Cloudflare is perfect. I'm saying that for a solo builder shipping multiple products, the free tier covers 95% of what you need. The remaining 5% costs $5/month.

I've been running this stack for months across 10+ production sites. My total Cloudflare bill: $0. My infrastructure worries: zero. Everything just runs, globally, at the edge, with no servers to maintain.

The best part? When one of my projects takes off, Cloudflare scales automatically. No capacity planning, no cold starts, no "your free tier has been exceeded" emails at 3 AM. It just handles it.

Stop paying for infrastructure. Start building.

← All writing Say hello →