Perspective · 3 min read
Where we put the server, and why it was not the cheapest option
The cheap answer was Europe, and for most visitors it would have been invisible. We hosted in Johannesburg anyway, for the two things a CDN never caches.
International hosting gives you materially more machine for your money. That is not a close call, and any South African team that has priced a VPS knows it.
The usual counter-argument is latency, and the usual answer to the counter-argument is a CDN. Both are correct, which is what makes the decision interesting.
The case for hosting elsewhere
Our public pages are cached at Cloudflare's edge, and Cloudflare has points of presence in Johannesburg and Cape Town. A visitor in Sandton requesting the homepage is served from Johannesburg regardless of where the origin server sits. The round trip to Europe is noticeably slower, and it varies with route and time of day — but it is paid once, by the cache, on behalf of everybody.
So for the large majority of requests, hosting in Frankfurt and hosting in Johannesburg are indistinguishable. You would need a stopwatch and a lot of patience to tell them apart.
Given that, the cheaper option looks obviously right.
The two things that are never cached
It is not right, and the reason is that the requests which matter most are exactly the ones a CDN cannot help with.
**The content management admin panel is entirely uncacheable.** Every click is a fresh authenticated request to the origin. It is used daily, for hours at a time, by people sitting in South Africa. Make every interaction in an editing session noticeably slower and the tool feels sludgy in a way that is hard to articulate and easy to abandon. People do not file a ticket saying the CMS got slower. They just stop using it properly, start batching their work, and eventually go back to sending you copy in a document.
**Form submissions are never cached either.** They are POST requests to the origin at the precise moment someone has decided to make contact. That is the highest-value interaction on the entire site, and it is the one where a slow response reads as an unreliable company.
Cache hit rates flatter you here. A site can be 95% cache-hit and still feel slow for every interaction that carries the business.
The third reason
Personal information from the form stays in the country. POPIA does not forbid cross-border processing, and plenty of South African businesses run on international infrastructure entirely lawfully — but the compliance conversation is materially shorter when the answer to "where does this data live" is "Johannesburg", and shorter compliance conversations are worth real money.
What we chose
Four vCPU, 8GB, in Johannesburg. Roughly thirty to fifty dollars a month, which is more than the European equivalent and small enough that the difference is not a business consideration.
The sizing has one thing worth copying: **our images are built in CI, not on the host.** Docker builds are what normally force you to buy a larger machine — the Strapi admin build alone will exhaust a 2GB server. That work happens on GitHub's runners, for free, and the production host only pulls and runs. It changed the question from "what can build this" to "what can run this", which is a much smaller number.
The honest summary
We paid a premium for latency that most visitors will never notice, to protect two interactions that a CDN cannot reach — one used by our own people all day, one used by prospective clients at the moment of highest intent.
If your product has no admin interface and no forms, host it wherever it is cheapest and let the edge do the work. That is a real answer, not a lesser one. The decision turns entirely on how much of your traffic is uncacheable, and that number is specific to what you have built.