magento-multi-store
Included with Lifetime
$97 forever
Configure multiple websites and store views in Magento with shared or scoped catalogs, separate URL structures, and store-specific settings
platform-magentomagentomulti-storemulti-websitestore-scopecatalogshared-catalogb2bscoped-config
What this skill does
# Magento Multi-Store Setup
## Overview
Magento's multi-store architecture has three levels: Website → Store → Store View. A Website groups stores with a shared customer base and order flow. A Store (under a Website) has its own root category and URL structure. Store Views (under a Store) typically represent languages or locales. Configuration values can be set at Global, Website, or Store View scope — lower scopes override higher ones. Adobe Commerce (B2B) adds Shared Catalogs for per-company product/price visibility control.
## When to Use This Skill
- When running multiple brands or country-specific storefronts from a single Magento installation
- When setting different base currencies, tax configurations, or payment methods per website
- When creating a B2B portal alongside a B2C store with different product visibility
- When implementing localized store views for multiple languages under the same product catalog
- When configuring separate checkout flows, shipping methods, or payment gateways per website
- When managing shared product catalog with website-specific pricing and visibility overrides
## Core Instructions
1. **Create the Website → Store → Store View hierarchy**
> **Note:** Core Magento does not ship `bin/magento store:website:create`, `store:group:create`, or `store:store:create` CLI commands. Create websites, stores, and store views either through **Admin → Stores → All Stores** or programmatically in PHP (shown below). Some third-party modules add CLI equivalents, but they are not part of the core.
Via PHP programmatically (primary method):
```php
<?php
// Create website via DataObject
use Magento\Store\Model\Website;
use Magento\Store\Model\Group;
use Magento\Store\Model\Store;
$website = $objectManager->create(Website::class);
$website->setCode('uk_site')
->setName('UK Website')
->setDefaultGroupId(0) // Set after creating group
->save();
$storeGroup = $objectManager->create(Group::class);
$storeGroup->setWebsiteId($website->getId())
->setName('UK Store')
->setRootCategoryId(3) // Your UK root category ID
->save();
$storeView = $objectManager->create(Store::class);
$storeView->setWebsiteId($website->getId())
->setGroupId($storeGroup->getId())
->setCode('uk_en')
->setName('UK English')
->setIsActive(1)
->save();
```
2. **Configure nginx for multi-website routing**
```nginx
# /etc/nginx/sites-available/magento-multi-store.conf
# Map host to Magento store code (MAGE_RUN_CODE + MAGE_RUN_TYPE)
map $http_host $MAGE_RUN_CODE {
hostnames;
default "";
www.mystore.com ""; # Default (global config)
uk.mystore.com uk_en; # UK store view
de.mystore.com de_de; # German store view
b2b.mystore.com b2b_en; # B2B website
}
map $http_host $MAGE_RUN_TYPE {
hostnames;
default "";
www.mystore.com "";
uk.mystore.com "store"; # Route to store view
de.mystore.com "store";
b2b.mystore.com "website"; # Route to website (different customer base)
}
server {
listen 443 ssl http2;
server_name ~^(.+\.)?mystore\.com$;
root /var/www/magento/pub;
index index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param MAGE_RUN_CODE $MAGE_RUN_CODE;
fastcgi_param MAGE_RUN_TYPE $MAGE_RUN_TYPE;
include fastcgi_params;
}
}
```
3. **Set scoped configuration values**
Configuration can be set at global, website, or store view scope:
```bash
# Set base URL per website
bin/magento config:set --scope=websites --scope-code=uk_site web/secure/base_url "https://uk.mystore.com/"
bin/magento config:set --scope=websites --scope-code=uk_site web/unsecure/base_url "https://uk.mystore.com/"
# Set currency per website
bin/magento config:set --scope=websites --scope-code=uk_site currency/options/base GBP
bin/magento config:set --scope=websites --scope-code=uk_site currency/options/default GBP
bin/magento config:set --scope=websites --scope-code=uk_site currency/options/allow "GBP,EUR"
# Set locale per store view
bin/magento config:set --scope=stores --scope-code=de_de general/locale/code de_DE
bin/magento config:set --scope=stores --scope-code=de_de general/locale/timezone "Europe/Berlin"
# Disable a payment method for specific website
bin/magento config:set --scope=websites --scope-code=uk_site payment/checkmo/active 0
```
Programmatically in PHP:
```php
<?php
use Magento\Framework\App\Config\Storage\WriterInterface;
use Magento\Store\Model\ScopeInterface;
class ScopeConfigManager
{
public function __construct(
private readonly WriterInterface $configWriter,
private readonly \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList
) {}
public function setScopedValue(
string $path,
mixed $value,
string $scope,
int $scopeId
): void {
$this->configWriter->save($path, $value, $scope, $scopeId);
// Flush config cache after write
$this->cacheTypeList->cleanType('config');
}
public function setWebsiteShippingOrigin(string $websiteCode, array $originData): void {
$website = \Magento\Framework\App\ObjectManager::getInstance()
->create(\Magento\Store\Model\Website::class)
->load($websiteCode, 'code');
$this->setScopedValue(
'shipping/origin/country_id',
$originData['country'],
ScopeInterface::SCOPE_WEBSITES,
(int)$website->getId()
);
}
}
```
4. **Manage website-specific product assignment and pricing**
Products can be assigned to specific websites while sharing the global catalog:
```php
<?php
// Assign a product to specific websites
use Magento\Catalog\Model\ResourceModel\Product as ProductResource;
class ProductWebsiteAssignment
{
public function __construct(
private readonly ProductResource $productResource,
private readonly \Magento\Store\Model\StoreManagerInterface $storeManager
) {}
public function assignProductToWebsite(int $productId, string $websiteCode): void {
$website = $this->storeManager->getWebsite($websiteCode);
$this->productResource->websiteToProducts([
['product_id' => $productId, 'website_id' => $website->getId()],
]);
}
public function setWebsitePrice(int $productId, string $websiteCode, float $price): void {
// Use tier prices with website scope for website-specific pricing
$tierPriceResource = \Magento\Framework\App\ObjectManager::getInstance()
->create(\Magento\Catalog\Model\ResourceModel\Product\Attribute\Backend\Tierprice::class);
// Or use price scope: Admin → Config → Catalog → Price → Catalog Price Scope = Website
}
}
```
Enable website-scoped pricing:
```bash
bin/magento config:set catalog/price/scope 1 # 0 = Global, 1 = Website
bin/magento indexer:reindex catalog_product_price
```
5. **Configure Adobe Commerce B2B Shared Catalogs**
Shared Catalogs (B2B feature) allow per-company product and pricing visibility:
```php
<?php
// Assign a company to a custom shared catalog
use Magento\SharedCatalog\Api\SharedCatalogManagementInterface;
use Magento\SharedCatalog\Api\Data\SharedCatalogInterface;
class SharedCatalogManager
{
public function __construct(
private readonly SharedCatalogManagementInterface $sharedCatalogManagement,
private readonly \Magento\SharedCatalog\Api\SharedCatalogRepositRelated in platform-magento
magento-module-development
IncludedBuild custom Magento 2 modules using dependency injection, plugins, observers, and service contracts to extend core functionality cleanly
platform-magento
magento-graphql
IncludedQuery Magento's GraphQL API to build headless storefronts or PWA Studio frontends with products, cart, checkout, and customer operations
platform-magento
magento-indexing-caching
IncludedSpeed up Magento by managing indexers correctly, configuring Varnish full-page cache, and using Redis for session and object caching
platform-magento