Essay · Published · 6 min read

One Architecture, Separate Brand Worlds

A buyer should see one brand. A seller should see one operation. The platform underneath should see tenants. Building Multi-tenant Commerce meant keeping those three views from ever leaking into each other.

  • Multi-tenant Commerce
  • Architecture
  • E-commerce

Most e-commerce builds answer a relatively contained question: how does one brand sell online well? Multi-tenant Commerce was built against a harder and, I think, more interesting question: how do several genuinely distinct brands — each with their own identity, catalogue and buyers — run on one shared architecture without any of them ever being able to tell, from the inside, that they're sharing anything at all?

Three different views of the same system

The design principle that made this work is what I've started calling separation of worlds. A buyer visiting a storefront sees exactly one brand: its identity, its categories, its promotions, its checkout — with no visible seam suggesting the platform underneath serves anyone else. A seller using the platform sees exactly one operation: their inventory, their orders, their pricing, their analytics, scoped entirely to their own business with no visibility into any other tenant's data. The platform itself, underneath both of those views, sees tenants — isolated contexts sharing common infrastructure for catalogue, cart, orders and fulfilment, with per-tenant branding and feature configuration layered on top.

That's an inversion worth stating explicitly: identity lives at the edge of the system, where a buyer or seller actually interacts with it. Capability lives at the core, shared and reused. Getting that inversion right is what makes a new storefront a matter of configuration rather than a new codebase — and getting it wrong, even slightly, is what makes a multi-tenant platform quietly become ten single-tenant platforms wearing a shared label.

Why building both sides at once mattered

I made a deliberate decision to build the buyer storefront and the seller portal together, as one connected system, rather than building the customer-facing side first and treating seller tooling as a follow-up phase. That decision cost more upfront and paid for itself repeatedly during the build, because building both sides simultaneously forces an honesty that building one side first doesn't: every buyer-facing feature creates a corresponding seller-facing obligation, and if you're not building the seller side at the same time, that obligation becomes invisible until a real seller runs into it as a gap.

A wishlist feature on the buyer side, for instance, seems buyer-only until you consider that a seller needs some way to see which of their products are getting wishlisted, or that feature is invisible data the seller has no way to act on. Promotions on the buyer side imply a seller-side promotions management interface, or every promotion becomes a manual, unscalable operation for whoever runs the platform centrally. Building both sides together surfaces these dependencies while they're still cheap to design for, rather than after a buyer-only launch has already shipped without the seller tooling anyone eventually needs.

Where the architecture had to stay flexible on purpose

Commerce infrastructure that touches money and physical movement — payments, shipping, communications — was deliberately designed adapter-first rather than hard-wired to a single provider. That's a decision with a real cost: an adapter layer is more work upfront than integrating directly with one payment provider and calling it done. The reason for accepting that cost is that a multi-tenant platform, by its nature, is likely to need different providers for different tenants over time — different regions, different regulatory requirements, different existing vendor relationships a new tenant might already have. Hard-wiring to one provider optimises for the first tenant at the expense of every tenant after it.

The build also includes India-specific groundwork such as GST-aware invoicing logic, reflecting the actual regulatory environment the platform needed to operate credibly within, rather than treating tax compliance as a generic problem to solve later with a plugin.

What "completed" means here, precisely

I want to be precise about the platform's status, because "completed application" can be read as claiming more than it should. What's completed is the platform itself: the buyer storefront, the seller portal, the multi-tenant catalogue and branding system, orders, promotions, and seller analytics, with the adapter architecture in place for payments, shipping and communications. What isn't claimed is live commercial deployment — this is a completed build, not a platform I'm describing as currently operating real storefronts with real transaction volume. That distinction matters, and I'd rather state it explicitly than let "completed" imply "launched," which is a different fact entirely.

What almost went wrong

The closest call during this build involved analytics — specifically, an early aggregate-reporting feature intended to give the platform operator a cross-tenant view of overall marketplace health. Building that feature the fast way meant querying "all recent orders" without tenant scoping, aggregating across every tenant on the platform to produce the summary. It worked, technically. It also meant that a sufficiently curious operator-level user could, in principle, infer one tenant's order volume by comparing platform-wide totals against numbers they already had visibility into for their own tenant — a much subtler leak than a direct data breach, but a leak of competitively sensitive information nonetheless.

Catching this before it shipped meant treating "does this feature need cross-tenant data, and if so, how is that access specifically bounded and audited" as a mandatory design question for every operator-facing feature, not just customer-facing ones — a check that's easy to skip precisely because operator tooling feels internal and lower-risk than anything a buyer or seller directly touches. It isn't lower-risk. It's differently risky, in a way that's easier to miss.

The lesson that generalises furthest

The discipline this build reinforced most strongly — and the one I've carried directly into how NxSync ERP's tenant model is being designed — is that multi-tenant isolation is a promise that has to be kept everywhere at once: in the database, in every query, in the branding, in the analytics, in the background jobs. It is not a property you can design correctly once and then stop actively verifying. One feature, built the ordinary way instead of the tenant-scoped way, is enough to turn the architecture's central promise into fiction for whoever's data leaks. Directing this build taught me to review isolation the way an auditor reviews financial accounts: assume nothing is safe by default, and verify the boundary explicitly, on every feature, for as long as the platform keeps growing.

View the full Product and software delivery series

Mohammed Umair builds businesses and the systems they run on — across smart infrastructure, international trade and enterprise software. More about him.