One Magento installation can run several brands, countries and languages. Getting the structure right is the most important decision in a multi-store project, because it controls how customers, prices, catalogues and configuration are shared. This guide explains the hierarchy and walks through a typical setup.

Websites, Stores and Store Views

LevelWhat it controlsTypical use
WebsiteCustomers (by default), base currency, prices (with website price scope), payment and shipping settingsA brand or a country with its own pricing
Store (store group)Root category — the catalogue tree shownDifferent catalogues on the same website
Store viewLanguage, translated content, display currency, themeEnglish and French versions of the same store

A common setup for a UK merchant selling to Ireland and France is one website for the UK (GBP) and one for the EU (EUR), with English, Irish-English and French store views. A brand portfolio often uses one website per brand.

Step 1: Create the Structure

In the admin go to Stores → All Stores and create, in order: the root category (Catalog → Categories), the website, the store with that root category, and the store views. Each needs a unique code such as uk, eu, eu_fr — the codes are used in server routing, so choose them carefully.

To keep environments consistent, export the structure to configuration files after creating it:

bin/magento app:config:dump scopes
git add app/etc/config.php

Other environments then receive the same websites and store views on bin/magento app:config:import or setup:upgrade.

Step 2: Set Base URLs

bin/magento config:set --scope=websites --scope-code=eu web/secure/base_url https://www.example.eu/
bin/magento config:set --scope=websites --scope-code=eu web/unsecure/base_url https://www.example.eu/
bin/magento config:set --scope=stores --scope-code=eu_fr web/secure/base_url https://www.example.eu/fr/
bin/magento config:set --scope=stores --scope-code=eu_fr web/unsecure/base_url https://www.example.eu/fr/

Step 3: Route Domains With Nginx

The web server tells Magento which website or store view to load through MAGE_RUN_CODE and MAGE_RUN_TYPE. With Nginx, map the host to a code:

nginx site configuration
map $http_host $MAGE_RUN_CODE {
    default          base;
    www.example.co.uk  base;
    www.example.eu     eu;
}

server {
    listen 443 ssl;
    server_name www.example.co.uk www.example.eu;
    set $MAGE_ROOT /var/www/magento;
    set $MAGE_RUN_TYPE website;
    include /var/www/magento/nginx.conf.sample;
}

The nginx.conf.sample shipped with Magento passes these variables to PHP-FPM. For store views on subfolders, either add the store code to URLs (Stores → Configuration → General → Web → Add Store Code to URLs) or map paths to store view codes with MAGE_RUN_TYPE store.

Step 4: Currencies, Prices and Tax

  • Set the catalog price scope to Website (Stores → Configuration → Catalog → Price) if websites need different prices.
  • Set base and display currencies per website, and schedule currency rate imports if you show converted prices.
  • Configure tax rules and price display (including or excluding tax) per website to match each market.
  • Enable payment and shipping methods per website — for example Klarna for Nordic stores and Afterpay for Australia.

Step 5: Translations and Content

Set the locale per store view (General → Locale Options). Install language packs or add your own translations, translate product names and descriptions at store view scope, and create CMS pages and blocks per store view or assign shared ones to several views.

Step 6: International SEO

  • Add hreflang annotations linking equivalent pages across store views — Magento does not output them by default, so use a well-maintained module or a small custom one.
  • Generate an XML sitemap per store view and submit each in Google Search Console.
  • Translate URL keys for categories and products so URLs match the language.
  • Keep canonical tags self-referencing within each store view.

Common Pitfalls

  • Changing the website structure after launch — customer accounts and orders are tied to websites, so restructuring later is costly.
  • Forgetting that Varnish and the full-page cache store pages per store; purge correctly after deployments.
  • Session cookies set for the wrong domain, causing logouts when moving between stores.
  • Indexers running much longer with many store views — plan server capacity accordingly.

Frequently Asked Questions

Should customers be shared between websites?

Customer account sharing can be global or per website (Stores → Configuration → Customers → Account Sharing Options). Share globally for one brand across countries; keep per website for separate brands.

Can each store view have a different theme?

Yes. Themes are assigned per store view in Content → Design → Configuration, so you can run different Hyvä child themes per brand.

How many store views can Magento handle?

There is no hard limit; dozens are common. Indexing time and content management effort grow with each view.

🚀

Planning a multi-store setup?

We design the structure, routing, tax and SEO for multi-brand and multi-country Magento stores.

Multi-Store Development
MS
About the author

Written by the Magento Services engineering team — Magento 2, Adobe Commerce and Hyvä specialists since 2014. We write about problems we solve on real client stores.