Almost any team can ship version one. The question that decides whether a product survives is what happens when the person who wrote it has left and the requirements have moved twice.
Anything where the data model has opinions. A brochure site has pages; an application has state that several people can change at once, permissions that decide who sees what, and business rules that were obvious to whoever wrote them and to nobody since.
In practice that means dashboards, internal tools, marketplaces, booking and scheduling systems, anything with roles and approvals, and storefronts whose checkout does not match what a hosted platform assumes.
The difficulty is rarely any single feature. It is that the features interact, and each one added after launch has to fit alongside every decision made before it. That is why the early structural choices matter more than they seem to at the time.
Often you should, and we will say so. If your business fits inside what the platform assumes, renting it is cheaper and faster than anything we could build, and we would rather tell you that than take the work.
The case for building starts when the mismatch sits somewhere load-bearing. Payment that does not work the way the platform expects. A permissions model with more than three roles. Data you need to move somewhere else later. Those are the points where workarounds accumulate, and where the total cost of the rented option quietly overtakes the built one.
One of our own projects is exactly this: a storefront built rather than rented, because cash on delivery in Lebanon does not fit inside a hosted checkout.
It means a developer who has never seen the codebase can find the thing they need to change and change only that.
Concretely: ordinary conventions rather than a private house style, no clever abstraction written for a second use case that never arrived, and the parts most likely to change kept apart from the parts that will not. Tests where a mistake would be expensive, not everywhere for the sake of a number.
This is checkable, which is the point. You can hand the repository to another developer and ask them how long it would take to add a field. Their answer is the real measure of the work.
Twenty minutes. If it isn’t work we should take, we’ll say so on the call.
Also