I get asked what I use to run a one-person studio that serves clients across seven metros. Here is the actual stack — no affiliate links, no kickbacks, no “10 tools every web designer needs in 2026” listicle energy. Just what I pay for, what I gave up on, and what I would change if I were starting again next week.
Hosting + edge — Cloudflare Workers, Hyperdrive, R2
Everything I ship runs on Cloudflare Workers. Marketing sites, the CRM API, the client portal, the admin dashboard — seven Workers in production, all behind one account.
Why not Vercel: I priced it out at the volume I run. For the traffic shape of a marketing site plus a few small SaaS surfaces, Vercel was going to cost me roughly three times what Cloudflare does, and most of the bill was for “function invocations” on routes that are perfectly cacheable. Cloudflare’s pricing is per-request with a generous free tier and Workers Paid is a flat $5/seat. My monthly Cloudflare bill across compute, Hyperdrive, R2, and KV is under $40.
What it costs me to be honest about the tradeoffs: the Worker size limit is real. If you try to ship a Next.js app with a maximalist node_modules, you will hit the 10MB compressed bundle ceiling and you will be unhappy. The learning curve on Durable Objects is steep — the docs are good now, they were not eighteen months ago. Cold starts on Workflows do happen and you will feel them on a long-running audit job. None of these are dealbreakers for me, but I would not pretend they are not there.
Hyperdrive is the unsung piece. It is a connection pooler that lives at the edge and lets a Worker talk to Postgres without burning a fresh TCP+TLS handshake on every request. Without it, latency to Neon would be unworkable from a Worker.
R2 holds every uploaded asset — client photos, PDFs, screenshots. Egress is free, which is the whole reason it exists.
Database — Neon Postgres
One Postgres database, branched per environment. Branching is the killer feature. When I am working on a schema migration, I branch main, run the migration on the branch, point a preview deploy at the branch, and if it works I merge the migration to main. If it does not work I delete the branch. Total cost of an aborted migration: zero.
Why not Supabase: I respect Supabase and I have shipped two projects on it. For my workload — where I want raw Postgres, my own auth layer, and no opinion about my edge function runtime — Neon is the cleaner fit. Supabase is excellent if you want the batteries included. I wanted the batteries somewhere else.
Auth — Better Auth
Better Auth is a TypeScript library that gives you sessions, magic links, passkeys, and OAuth out of the box, backed by your own database. It is not a SaaS. There is no per-user pricing.
I started on Clerk. Clerk is a beautiful product. The free tier ends at 10,000 monthly active users and the next tier is $25/mo plus $0.02 per MAU after the first 10k. Sounds fine until you do the math on a five-year horizon and realize you are renting your own user table forever. I migrated off in a long weekend. Passkeys, magic links, password fallback, and a real session table I can query directly. The hidden cost of “free until 10k users” is that you are building a business on top of a pricing curve someone else controls.
CRM + ops — VertaFlow
Yes, the same VertaFlow we sell. I am going to be transparent about this: I run my entire client pipeline, contract signing, deposit collection, and project board on the product we sell. That is partly dogfooding and partly the reason it exists — I needed it for myself before I sold it to anyone else. Every quirk I have hit, I have fixed in the next release. Every feature on the roadmap got there because I wanted it on a Tuesday morning.
Email — Resend
Resend handles all transactional email — magic links, audit-complete notifications, contract reminders, invoice receipts. The API is straightforward, the React Email integration is clean, and the dashboard is the first email dashboard I have used that does not feel like a 2014 web app.
Honest warning: deliverability got rocky for about three weeks when I crossed roughly 20k sends/month earlier this year. Some Gmail accounts started bucketing to Promotions, a couple of corporate Microsoft tenants dropped messages outright. I tightened DMARC, warmed a dedicated IP, and it recovered. We are still on Resend and watching the next volume jump. If you are sending a million emails a month, you probably want Postmark or a dedicated ESP with a deliverability team on call.
Analytics — PostHog
PostHog, on their cloud (I gave up on running ClickHouse myself after two weekends). I use the product analytics, session recordings on the admin and CRM, and the feature flags. Free tier is generous up to one million events, then it gets cheap-ish.
I tried Plausible early on. Plausible is clean and the privacy story is great, but it does not give me funnels or session recordings, and at studio scale the data I want is closer to a product than a marketing site.
Error tracking — Sentry
Every Worker reports to Sentry. Release tags via CF_VERSION_METADATA.id so each error ties back to the exact deploy. The team plan is $26/mo and the value-per-dollar is the highest of anything on this list.
Site framework — Astro + TanStack Start
The marketing sites are Astro. Static generation for ~400 pages, MDX for the blog, an island of interactivity only where it earns its weight. Lighthouse 99 across the board.
The SSR Worker that handles dynamic paths — checkout, contracts, sign-in — runs TanStack Start. It is a thin SSR React framework with file-based routing that ships to a Cloudflare Worker without OpenNext or a Vercel adapter or anything in between. If you want SSR React without the Next.js footprint, it is worth a serious look.
The math
Here is the monthly bill at current volume, versus the equivalent SaaS-stack price I quoted at the start of Why I Built VertaFlow:
| Layer | What I run | My cost / mo | SaaS-stack equivalent |
|---|---|---|---|
| Hosting + edge | Cloudflare Workers + Hyperdrive + R2 | ~$35 | Vercel Pro: $20–$120+ |
| Database | Neon Postgres | $19 | Supabase Pro: $25 |
| Auth | Better Auth (library) | $0 | Clerk: $25 + per-MAU |
| CRM + ops | VertaFlow (ours) | $0 (internal) | HubSpot Starter: $90 |
| Resend | $20 | Mailchimp + Postmark: $50+ | |
| Analytics | PostHog Cloud | $0 (under free tier) | Mixpanel Growth: $25 |
| Error tracking | Sentry Team | $26 | (no swap) |
| Total | ~$100 | ~$255–$355+ |
Two caveats. First, the SaaS-stack column is the equivalent at my current scale — at ten times the volume both columns get more expensive, but the SaaS column grows faster. Second, my time building and maintaining the boring choices is not free. If you are not the kind of operator who enjoys reading a Postgres EXPLAIN ANALYZE for fun, the SaaS stack is buying back your weekends, and that is a legitimate trade.
What I tried and dropped
- Nx for the monorepo. We ran on Nx for about eight months. The graph was great, the caching was great, the Nx Cloud bill and the lock-in were not. Migrated to Turborepo in a week. The dev experience is meaningfully simpler and the remote cache now lives in a Cloudflare R2 Worker we control.
- Clerk for auth. Covered above. Lovely product, wrong pricing shape for an operator who plans to be around for a decade.
- Capacitor for a mobile shell of the client portal. We shipped a TestFlight build, watched the actual usage data for six weeks, and discovered that every client who installed it opened it twice and then went back to the web app. Killed the project, deleted the repo, did not look back. The web app on mobile Safari is a perfectly good product and the App Store review cycle was a tax we did not need to pay.
- Buildkite + GitHub Actions. We ran a hybrid CI for a stretch. Replaced both with a local lefthook gate plus Cloudflare Workers Builds for the deploy. CI is now free, fast, and lives next to the code it ships.
Quick check
Want to know what Google sees on your site right now?
Drop your URL and we’ll run a real Lighthouse audit — performance, SEO, accessibility, best practices. Plain-English summary in 30 seconds. Always free. No credit card.
If you want this stack built for you — the boring choices, the honest tradeoffs, the thing you can actually maintain after I hand it over — start at /contact and tell me what you are running today. I will tell you what I would change and what I would leave alone.