Every URL on this site started returning a 503 at a quarter to three on a Thursday morning. Not a slow build, not a half-finished deploy β every single page, with a one-line body reading usage_exceeded.
The part I keep coming back to is what the billing page said at that exact moment: the monthβs credits, untouched. The enforcement fired while the meter read zero, and there was nothing in the dashboard I could press to clear it. An error state I could not reach, applied to a resource I was apparently not using.
Nobody noticed for hours, on account of the hour. For a blog that is almost a non-event β you wait, or you file a ticket, and the words come back either way. But the blog was not the only thing living behind that account.
Three sites, one shared bucket
Three things lived on Netlify: this blog, Aura β a multi-store platform where inventory is shared across stores rather than duplicated per shop β and BitzyStore, my own small site that syncs against the same inventory as my eBay store. I built BitzyStore that way because I do not need Shopifyβs full wardrobe of features, and because the budget is a shoestring, not a basket.
RoleRiff, my career-tech SaaS, was never on Netlify. It runs on Cloudflare, and Cloudflare handles it entirely, end to end. Hold onto that, because it turns out to be the whole argument.
I pay for GitHub and I pay for hosting, and between them the quotas go quickly. That is normal, and it is fine β you buy what the work needs. What is not fine is discovering the ceiling by falling through it, or paying one vendor to do a job a second vendor I already own is doing for nothing.
The one vendor I never actually picked
Here is the embarrassing part. When I restarted this whole journey, Netlify was still the new thing everyone recommended, I had used it and liked it, and so I used it again. No comparison, no spreadsheet, no evening spent reading pricing pages. I just went with what I already loved.
That is not how I choose anything else. It is not even close.
How I pick when I actually pick
When I sat down and did this properly the last few times, the reasoning was obvious in retrospect:
- Neon over Supabase. I wanted Postgres that scaled to zero and a model I could reason about, not a platform I had to learn top to bottom.
- Backblaze over AWS. Backups should cost a predictable small amount, not require a cert to price correctly.
- MUX over the alternatives. Video was a problem I wanted to stop thinking about.
- BitzyStore over Shopify. A site that mirrors my eBay inventory does not need an app store, a theme marketplace, or a monthly bill that grows when I do not.
Every one of those got a proper look. Netlify got nostalgia.
What it was costing, since that is what this comes down to
| Netlify | Cloudflare | |
|---|---|---|
| Hosting this blog | US$9.99 a month | Free tier |
| Running RoleRiff | β | Already on it |
| DNS and the edge for every project | Account number two | Already on it |
| What I hand over each month | US$9.99 | US$0 |
I want to be careful with that table, because US$9.99 is not a lot of money and I am not going to pretend this move was about saving it. A static blog asks almost nothing of a CDN, so I am sitting comfortably inside Cloudflareβs free tier β but if this site needed a paid plan tomorrow, I would buy it without the flinch.
That is the actual change. I am not avoiding paying for Cloudflare. Cloudflare already runs RoleRiff end to end and serves every other project I have, so I have effectively already decided it is worth money to me. What ended was the second invoice β a vendor charging me to do work the vendor I had already chosen was doing anyway.
Fewer bills, and not a smaller one. Both of those are wins, but only the second one was the point.
Why Cloudflare, specifically
Three things, in order:
- It was already half the chain. Cloudflare sat in front handling DNS and the edge β the nameserver move I wrote about a few weeks back. So the site already touched it on every request.
- The free tier covers the entire job. This is a static site. It builds to files, and Workers serves files. There is no server to keep alive and no seat to buy.
- It removes a vendor rather than adding one. After the move, one company does the DNS, the edge and the serving. Fewer accounts, fewer invoices, fewer quotas to run into at a quarter to three on a Thursday.
The thing that had kept me on Netlify was never a feature. It was a habit I had never taken out and looked at.
What the pipeline does now
The shape barely changed:
- Before β push, Netlify builds, Netlify serves, Cloudflare fronts it.
- After β push, GitHub Actions builds, a Cloudflare Worker serves, Cloudflare fronts it.
Astro still builds the same dist/, and the _headers file still decides what the site is allowed to be remembered for β though Cloudflare applies it differently enough to Netlify that I had to rework it, and that follow-up is already planned. The deploy is a single wrangler deploy as the last step of the build, so a type error fails the run while the live site keeps serving the previous version.
The only real change is that the middle two boxes now belong to the same company as the edge.
What I would tell someone starting again
Do the analysis on every vendor, including the one you already like. Liking a product is a perfectly good reason to evaluate it β it is not a reason to skip the evaluation, because the thing you loved two years ago is not necessarily the thing you are paying for today.
And if a hosting provider can take your whole site offline over a meter you cannot see, that is worth an evening of comparison shopping before it happens again.
If you have moved a site off Netlify β or you have a vendor you stayed with longer than you should have, I would like to hear about it. π