The previous website for OsteosOnline cost around 25,000 euros.
That is the kind of amount you try to stay very calm about afterwards, while you know perfectly well there was a small car in there. Or a few months of breathing room. Or, in this case, probably five new systems that nobody nearby understands.
The project was classic. WordPress. External people. Figma. Calls. Feedback. More feedback. Then something that is almost good, but not quite. Then live anyway, because at some point you are just tired of the project and want it done.
And the strange thing is: a site like that does work. Patients find you. Google knows the pages. The locations are in there, the texts are in there, everything runs.
But you do not really own it.
Not in the way something should be yours. For every change you are hanging on someone again. For every structural improvement you are back inside a system that was not built for it. WordPress is fantastic if you want a blog. But for a network of medical practices, with locations, condition pages, booking flows, tracking, structured data, redirects and maybe per-practice reporting later, it starts to feel like driving a truck from a garden chair.
So something stupid had to happen. The sites went again, from scratch.
Not as "we are making a nicer design". That is the visible layer. The real question was whether a machine could be built that can carry a site like this. Not one page, not one landing. A real medical site, with hundreds of URLs that Google already knows something about, and that you therefore cannot get creative with.
For OsteosOnline Belgium there was a baseline of 352 URLs. For the Netherlands, 653. Those are not marketing numbers, those are moving boxes. Every URL is a box with something inside that must not break. A location page. A condition page. An old WordPress route. A language variant. A piece of search traffic you do not accidentally tip into the bin.
So the work does not start with design.
It starts with fear.
Healthy fear. The kind that says: getting this right by hand across hundreds of pages will never work without a safety net. So you build a system that checks you instead of the other way around.
The new sites run on Next.js. The content lives in typed files, not hidden somewhere in a CMS where you need five clicks to find where a sentence sits. Locations live in data. Osteopaths live in data. Conditions live in data. The sitemap is built from that data. So is the structured data. Canonicals and hreflang follow the same logic. The site is no longer a collection of pages. It is a model.
That sounds more boring than "AI built my site", but that is exactly the point. AI that just writes code is an intern on caffeine. A system that knows where the data sits, which routes must exist, which redirects have to keep working, which pages are indexable and which are not, that is something else. That starts to look like a factory.
For Belgium the base ran first: homepage, three locations, the big supporting pages, FAQ, about, experiences. Then the health conditions came on top: 251 condition slugs as the route base, with the most important WordPress content first. For the Netherlands it went further: 7 locations, 251 condition slugs, 224 genuinely migrated WordPress condition pages, a sitemap of hundreds of URLs.
That is the kind of sentence nobody at a birthday party is waiting for. But that is exactly the story.
Because from that moment on a site is no longer "a site". It is something you can extend without being scared all over again each time. Add a location. Improve a condition page. Build baby landing pages. Measure booking events. See which route someone takes before they book. Let an old WordPress URL come in and send it neatly to the right new place, as if nothing ever happened.
That last part matters, because Google does not like people who move without a change of address. So there are redirects in there. Old /osteopaat/ routes go to the new location pages. Old language variants get cleaned up. Junk like xmlrpc.php, that WordPress ghost bots love to pull at, simply gets a 410. Gone. No drama, no ceremony.
And then the tests. Because people say "everything works" far too quickly. In those repos there are Playwright tests that check whether the main routes load, whether the sitemap exists, whether robots.txt answers, whether the redirects do what they should, whether the homepage has MedicalOrganization JSON-LD, whether location pages carry MedicalClinic JSON-LD, whether FAQPage JSON-LD exists, whether canonical and hreflang are right, whether the security headers are there.
Not sexy work. But the work that lets you sleep. For the Netherlands there were, at one point, 220 E2E tests green in the documentation. That is not "I hope it works". That is a machine saying: I looked.
And the nice part: the second site was not a fresh start. The Netherlands was a fork of Belgium, then adapted to the Dutch market. Different locations, different health insurers, different osteopaths, different booking IDs, different WordPress texts. Even the booking URLs turned out not to be simple, because the same osteopath can have a different ID per location. Of course. Because why would anything be easy when it can also be medically-administratively cozy.
That is exactly why it had to go into data. Not into loose pages, not into copy-paste, but into a structure where the complexity gets a place.
That is what was not there before. Before, there was a website. Now there is a factory.
And yes, from the outside that factory just looks like a website for someone with back pain looking for an osteopath in Breda, Antwerp or Londerzeel. That is how it should be. A patient should not feel that half a machine room is running underneath. They want to know: can someone help me, where do I need to be, and can I book an appointment?
But under that calm front sits something worth far more than a nice design: ownership. Changing a text is no longer a ticket. Testing a new page is no longer a project. Wanting to know which campaigns or routes bring bookings, that just gets built into the loop. And when something breaks, the test starts shouting before Google or a patient notices.
So the lesson was not "I built two medical sites with AI". That is too small. The lesson was that 25,000 euros of tuition made it exactly clear what actually had to be built. Not another website. A system that makes websites manageable.
First you pay for a result. After that you build the machine that keeps making results.