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
| Level | What it controls | Typical use |
|---|---|---|
| Website | Customers (by default), base currency, prices (with website price scope), payment and shipping settings | A brand or a country with its own pricing |
| Store (store group) | Root category — the catalogue tree shown | Different catalogues on the same website |
| Store view | Language, translated content, display currency, theme | English 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:
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.
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.