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.
What "multi" means in Evolve
Multiple brands, one backend
Deploy separate storefronts for each brand with distinct themes, content, and product assortments. All powered by the same backend services.
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.
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.
Country-specific everything
Different tax rules, shipping options, payment methods, and product availability per country. Configured, not coded.
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.
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
Represent companies and organizational entities. Each has associates, addresses, and is linked to one or more stores.
Associate roles
Users are linked to business units with configurable roles that determine their permissions for ordering, managing lists, and requesting quotes.
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
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.
Brand group on shared infrastructure
A retail group with multiple brands, each with its own storefront, design, content, and product assortment, running in different countries. Each brand-country combination gets its own store in commercetools, fencing catalog, customers, and orders while sharing all backend services.
Per-brand autonomy, shared operations
Each brand team manages its own Storyblok space and storefront deployment independently. All brands share the same backend services, checkout logic, and payment integrations, which reduces total cost of ownership and speeds up rollout of new brands or markets.
Combined B2B + B2C for wholesale and retail
A manufacturer selling direct-to-consumer and to business accounts. B2C customers see retail pricing. B2B associates log in and see company-specific pricing, minimum order quantities, and quote request flows, all from the same storefront URL.
B2B with multiple business units and self-service
A distributor with hundreds of business accounts, each with their own store, pricing channel, and associate permissions. Buyers request quotes, admins manage associates and addresses, all through the standard Evolve storefront.
How the architecture enables this
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
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
New markets, stores, and business models are added through configuration: store keys, locales, currencies, payment methods, and assortment channels.
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
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
Deploy to AWS, Azure, or GCP. Each cloud gets the same Terraform-managed infrastructure. Run different stores on different clouds, or keep everything together.



