What Cloudflare can still do to us

We moved TipBop and TyreStack to Cloudflare in a day and made it the default for everything. This is the case against that, from our own standard: five ways it fails, the limits we accepted, and four conditions that would send us back.

5 set large on a pale grey background beside a terminal listing five ways Cloudflare can fail us and what we do about each, from a data centre failing to a global outage where we wait, above the words: Ways the platform can fail us, and what we do about each
3 of 5copies that confirm every D1 write, in different data centres
30 daysof point-in-time restore on D1, in place
10 GBper D1 database, the ceiling we design around
4written conditions under which we would build on Google Cloud again

One row of the table in our Cloudflare standard reads, in full: a global Cloudflare outage, every product is down, wait, accepted risk. We wrote it ourselves on 20 October, the day we moved TipBop off Google Cloud, and it is the sentence a sceptical client should read first.

The outage post explains why we left. This one is the other half: what we gave up by going all in on one vendor, and what we did so that a bad day there is a slow day and not a lost business.

Five ways it goes wrong

The standard lists them in a table, and the table is more useful than any promise would be. Each row is a failure, what happens, and how we get back.

What failsWhat we doHow long we are downA machine or data centre failsEvery write is on 3 of 5 copiesNothing to doNo failover time is publishednone expectedWe ship a bad deployOur bug, liveRoll the Worker backOne commandsecondsBad data in the databaseA bug, or an admin mistakeRestore in placeAny minute in the last 30 daysminutesAccount suspended, or data lostThe platform copy is goneRebuild from the nightly exportHeld outside Cloudflare, restore-testedplan: about 30 minA global Cloudflare outageEvery product is down togetherWaitNothing we run can helpas long as it takes
From the standard we wrote on 20 October. The bottom row is the one we cannot fix, so it is the one we planned around.

The first three rows are the platform doing its job. Every write to D1, the database we use, is confirmed on three of five copies in different data centres before we are told it succeeded, so a failed machine or building is Cloudflare’s problem and not ours. We cannot give you a failover time for it, because Cloudflare does not publish one. A bad deploy rolls back in seconds, and bad data can be wound back in place to any minute in the last 30 days. Those are the failures that happen most, and they are cheap.

The last two rows are the honest ones. If our account is suspended or the platform loses data, we rebuild from a copy that does not live on Cloudflare. And if Cloudflare itself has a bad day, we wait.

The size of the bad day

The objection is fair, and our own hosting review made it. Written the morning of the zone outage, it pointed out that every product already sat behind Cloudflare’s DNS and proxy, so the estate’s real single point of failure was Cloudflare before we moved a thing. It counted three Cloudflare incidents in 2025 that would have hurt us, from about 25 minutes to about six hours for the long one. Our later standard records that same November outage as about three hours. We never reconciled the two numbers, so we plan for the longer one.

Moving the back end changed what is in the request path. Before, a Cloudflare outage and a Google outage were two separate ways to be down. Now it is one platform, and that platform is the one that was already in front of everything. That is concentration, and we chose it with open eyes because it removed a vendor from the path instead of adding one. We still say plainly that it makes a Cloudflare bad day a whole-estate bad day.

The backup that lives somewhere else

What turns that from a business risk into an inconvenience is where the copy is kept. Every product writes a nightly export outside Cloudflare, a full D1 dump plus every Durable Object’s SQLite data, into a storage bucket at the other cloud. The reason it is there is the same reason our Google-hosted databases were copied to Cloudflare storage before the move: a backup on the platform that failed fails with it.

An export is only a backup once it has been restored. So each night the export is loaded into a scratch environment and checked, and an email goes to our alerts inbox if it fails. The standard puts a rebuild in a fresh account at about 30 minutes. That is the plan’s figure, not a measured one, and we only count a number as ours once we have timed it, as we did with the 41-second rollback.

The same exports are our way out. They are plain SQLite, which any other platform can read, so leaving Cloudflare is a project and not a hostage situation.

What we gave up

Every platform has things it will not do. These are the ones we chose to live with, and what each costs.

Interactive transactionsAccepted

D1 commits each statement as it runs. Only a batch is atomic, and you cannot hold one open across a call to Stripe. It cost us a rewrite of two money paths, and we proved the replacement with tests that try to pay out twice.

A UK data centreAccepted

D1 can be pinned to the EU, not to London. UK data protection law accepts the EU, so it is lawful, but every privacy notice has to say "the EU" and name Cloudflare as a sub-processor. A contract that demands UK-only data is one of our reasons to go elsewhere.

A paid uptime guaranteeAccepted

Below Cloudflare's enterprise tier there is no financially backed service level. The shared-core Cloud SQL we replaced had none either, so this is a gap we already had, not a new one.

A free choice of databaseAccepted

D1 stops at 10 GB per database, with 30 seconds for a query. For per-customer data, a Durable Object per tenant gives each its own database with real multi-step transactions. We design to those ceilings now, rather than meet them in production.

When we would go back

The standard ends with a section nobody expects from a document like this: when not to use Cloudflare. It names four conditions, and any one of them is enough to send a project back to Cloud Run and Cloud SQL in London, with the exception written down before anything is built.

And when we do go back, the standard says what that database must look like: regional, on a dedicated core, from its first real customer. One zone and a shared core are for beta, which is exactly the lesson of 20 October.

What it costs, and what it does not buy

The numbers that tempted us are estimates, so we label them as such. At 20 customers each, our standard puts the platform bill for one product at the figures below, and the biggest is a guess.

Estimated monthly platform cost at 20 customers each

Midpoints of the ranges in our standard. ZooLog's range is wide because the price of its AI features is the unknown.

ZooLog£20 to £40Booking system£5 to £15TyreStack£5 to £15TipBop£0 to £4

Source: Estate Cloudflare architecture standard, 20 October 2026

None of this says Google Cloud was bad. Our own review said to stay and add high availability, and on its terms that was sound advice. We went the other way because cost, reliability and restore speed pointed there, and because the effort of moving was not a reason to stay. If a condition in the list above turns up, we will be back on Google Cloud for that project, and we will write it up here.