A good app is not a hundred custom builds wearing one name. It is one codebase that bends per store without splintering.

The trick is configuration over code. Every merchant-specific choice lives in settings and feature flags, never in a branch. When a store needs something new, we add a switch, not a fork, and every other store gets the option for free.

The hard part is the upgrade path. A store on last year's settings has to keep working when we ship this year's engine, so every change is additive and every migration is reversible.

Done right, one release reaches every merchant at once. On paper it reads like a hundred projects. In the repository it is one.