back to evolve homepage

Multi-Tenancy

one platform, every configuration

Multi-brand, multi-language, multi-currency, multi-country, B2B, B2C, or all of the above. Evolve runs any combination from a single deployment, so you scale markets and business models without multiplying infrastructure.

Read the docs
evolve platform
Brand Alpha
Web
Mobile
UKen-GB
GBPB2C
NLnl-NL
EURB2C
Brand Beta
Web
Mobile
AI
UKen-GB
GBPB2C
DEde-DE
EURB2C
Brand Gamma
Web
AI
UKen-GB
GBPB2B
FRfr-FR
EURB2C
StoreContext
Shared Evolve Backend
CatalogCheckoutOrdersContentPaymentSearch
Systems of record
ERPOMSPIMCRM

What "multi" means in Evolve

Multi-Brand

Multiple brands, one backend

Deploy separate storefronts for each brand with distinct themes, content, and product assortments. All powered by the same backend services.

Multi-Language

Every locale, natively

Each request carries a locale that flows through every service. Product names, CMS content, and emails all resolve to the right language automatically.

Multi-Currency

Price in any currency

Currency is part of every request context. Prices, carts, taxes, and checkout all operate in the customer's currency without custom logic.

Multi-Country

Country-specific everything

Different tax rules, shipping options, payment methods, and product availability per country. Configured, not coded.

B2B + B2C

Both business models, one platform

B2B layers on top of B2C with business units, associate roles, quote workflows, and shared shopping lists. No separate deployment needed.

Multi-Store

Unlimited store configurations

Each store defines its own assortment, pricing channel, payment methods, and checkout flow. Add a new market by adding a new store configuration.

StoreContext and BusinessContext: the keys to multi-tenancy

Every request in Evolve carries a StoreContext (a store key, locale, and currency) that flows from the frontend through the GraphQL gateway to every domain service. For B2B stores, a BusinessContext adds the business unit, associate, and permissions. Together they scope all data automatically: catalogs, carts, pricing, and access control.

// StoreContext: set on every request
const fetcher = initClientFetcher("/graphql", {
  defaultHeaders: {
    "X-StoreContext-StoreKey": storeConfig.storeKey,
    "X-StoreContext-Locale": locale,
    "X-StoreContext-Currency": storeConfig.currency,
  },
});

// Any domain service reads the same context
const ctx = readStoreContextFromRequest(request);
// ctx.storeKey → "nl-b2c"
// ctx.locale   → "nl-NL"
// ctx.currency → "EUR"
// BusinessContext: added for B2B stores
const businessContext = {
  businessUnitKey: "acme-corp",
  associateId: "john.doe@acme.com",
  permissions: [
    "CreateOrder",
    "ViewOthersOrders",
    "ManageQuotes",
  ],
};

// B2B services use both contexts together
const pricing = getPricing({
  storeContext,    // → locale, currency
  businessContext, // → contract pricing
});

B2B and B2C from the same backend

Most platforms force you to choose between B2B and B2C, or run separate instances. Evolve runs both from a single set of services. B2B adds a BusinessContext layer that brings company-specific pricing, assortments, and distribution channels.

Business units

Business units

Represent companies and organizational entities. Each has associates, addresses, and is linked to one or more stores.

Associate roles

Associate roles

Users are linked to business units with configurable roles that determine their permissions for ordering, managing lists, and requesting quotes.

Quote workflows

Quote workflows

B2B customers request pricing for a cart. Sellers respond with quotes. Customers accept to create an order. Full lifecycle, built in.

Shared shopping lists

Shared shopping lists

B2C customers get a single wishlist. B2B users create multiple named lists shared within their business unit for team purchasing.

Real-world scenarios

International B2C with localized stores

A fashion brand running Dutch, German, and French storefronts, each with its own language, currency, payment methods, and shipping providers. One backend, three frontend deployments with different store keys.

Expansion without re-platforming

Launching a new country is a configuration change: add a store key, connect the locale and currency, set up local payment and shipping providers. No new infrastructure, no code changes, no separate deployment to maintain.

How the architecture enables this

GraphQL Federation

GraphQL Federation

A single gateway composes all domain services. StoreContext flows through every federated subquery, so commerce, content, search, and checkout all receive the same context.

Vendor independence

Vendor independence

Domain services define their own data model. The underlying commerce engine, CMS, and search provider can be swapped or combined without affecting your stores.

Configuration over code

Configuration over code

New markets, stores, and business models are added through configuration: store keys, locales, currencies, payment methods, and assortment channels.

Cache isolation

Cache isolation

Every cache key is automatically prefixed with store, locale, and currency. Data from one tenant never leaks into another, at every layer of the stack.

Dual-path routing

Dual-path routing

B2C and B2B operations automatically route through different APIs based on the user's business context. The same code serves both models without branching logic.

Multi-cloud deployment

Multi-cloud deployment

Deploy to AWS, Azure, or GCP. Each cloud gets the same Terraform-managed infrastructure. Run different stores on different clouds, or keep everything together.

Ready to simplify your multi-market commerce?

Read the docs