Multi-store setup in Magento 2 — architectuur en valkuilen
Terug naar blog

Multi-store setup in Magento 2 — architectuur en valkuilen

AuthorRuthger Idema
6 april 202611 min leestijd

Eén Magento-installatie, vijf webshops, drie talen, twee valuta's. Klinkt efficiënt. Totdat je begrijpt hoe website, store en store view zich tot elkaar verhouden. De architectuurkeuzes die je nu maakt, bepalen hoeveel pijn je later hebt.

Multi-store setup in Magento 2 — architectuur en valkuilen

Eén Magento-installatie die vijf webshops aanstuurt. Op papier elegant. In de praktijk een architectuurkeuze met verstrekkende gevolgen voor performance, beheer en internationaliseringskosten.

De meeste problemen bij multi-store setups ontstaan niet bij de implementatie. Ze ontstaan zes maanden later, als je een prijsactie wil inrichten voor één markt maar merkt dat je structuur dat niet toelaat.

Dit artikel legt de architectuur uit. Inclusief de valkuilen die we bij klanten tegenkomen.

Wat je leert in dit artikel

  • De hiërarchie van website, store en store view in Magento 2
  • Wanneer je kiest voor multi-store versus aparte installaties
  • Shared catalog en de impact op performance
  • Internationalisering: talen, valuta en belastingregels
  • Concrete configuratie-aanpak met codevoorbeelden

De drie-laags hiërarchie

Magento 2 werkt met drie niveaus. Veel developers begrijpen dit oppervlakkig, maar de implicaties zijn diepgaand.

Global (installatie)
└── Website A (NL)
│   ├── Store A1 (standaard)
│   │   ├── Store View: Nederlands
│   │   └── Store View: Engels
└── Website B (DE)
    ├── Store B1 (standaard)
        └── Store View: Duits
Website is het hoogste niveau. Hier stel je betaalmethoden, valuta en prijzen in. Klanten die op Website A shoppen delen geen sessie met klanten op Website B. Store zit onder de website. Hier configureer je de root category — het startpunt van je catalogusstructuur. Eén website kan meerdere stores hebben met elk een eigen catalogushiërarchie. Store view is het laagste niveau. Hier stuur je taal en valuta-weergave aan. Hetzelfde product, dezelfde prijs, maar weergegeven in een andere taal.

De valkuil: scope-misverstanden

Magento-configuratie kent de begrippen "global", "website" en "store view" scope. Een instelling op global niveau geldt voor alles. Een instelling op website niveau overschrijft de global waarde voor die website.

php
// Lees een config waarde op store view scope
$configValue = $this->scopeConfig->getValue(
    'general/locale/code',
    \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
    $storeId
);

// Lees op website scope
$websiteValue = $this->scopeConfig->getValue(
    'payment/mollie/active',
    \Magento\Store\Model\ScopeInterface::SCOPE_WEBSITE,
    $websiteId
);

De valkuil: je past een instelling aan in de admin terwijl je een store view geselecteerd hebt. Magento slaat die waarde op voor die store view. Later snap je niet waarom de instelling op andere store views anders is.

Controleer altijd op welke scope je werkt. De URL in de admin bevat store/[id]/ als je op store view scope zit.

Multi-store versus aparte installaties

Dit is een strategische keuze die we te vaak te laat zien worden gemaakt.

SituatieAdvies
Zelfde producten, meerdere talenMulti-store (store views)
Zelfde producten, meerdere valutaMulti-store (websites)
Volledig andere catalogus per marktOverweeg aparte installaties
Eigen team per markt met eigen deploymentsAparte installaties
Gedeeld team, gedeelde codebaseMulti-store
Sterk afwijkende checkout-flows per marktAparte installaties

De scheidslijn is operationeel: als marketing in Duitsland volledig autonoom moet kunnen werken zonder afhankelijk te zijn van een centrale deployment, zijn aparte installaties cleaner.

Multi-store klinkt efficiënt maar verhoogt de complexiteit van elke wijziging. Een template-aanpassing moet werken voor alle stores. Een extensie-update raakt alle markets tegelijk.

Shared catalog en B2B

Voor B2B multi-store setups is de Shared Catalog module relevant. Hiermee wijs je specifieke catalogi toe aan klantgroepen, inclusief klantspecifieke prijzen.

De performance-impact is merkbaar. Shared Catalog voegt joins toe aan vrijwel elke productquery.

php
// Shared catalog koppelen aan klantgroep via code
$sharedCatalog = $this->sharedCatalogManagement->getPublicCatalog();
$this->sharedCatalogManagement->assignCustomerGroups(
    $sharedCatalog,
    [$customerGroupId]
);

Benchmarks die wij zien: categoriepagina's laden 40-60% trager in installaties met Shared Catalog en meer dan 50.000 producten, zonder aanvullende caching strategie. Full Page Cache (FPC) dempt dit effect, maar vraag je af of je die complexiteit wil toevoegen als een andere architectuurkeuze het probleem vermijdt.

Internationalisering in de praktijk

Drie elementen die je vroeg moet inrichten: talen, valuta en belastingregels.

Talen en vertalingen

Magento haalt vertalingen op uit CSV-bestanden per module. Voor een taalwissel per store view volstaat dit in veel gevallen.

# app/i18n/Vendor_Module/nl_NL.csv
"Add to Cart","Toevoegen aan winkelwagen"
"In stock","Op voorraad"
"Out of stock","Uitverkocht"

Productnamen en -beschrijvingen zijn store view-specifiek. Je beheert ze in de producteditor door de store view te wisselen. Dit werkt prima voor kleine catalogi. Bij 10.000+ producten wordt dit een importoperatie.

Valuta en prijzen

Prijzen in Magento zijn per website ingesteld. Je kunt de basisvaluta van de installatie instellen en automatisch omrekenen, maar wij raden dit af voor productieomgevingen. Gebruik altijd handmatig ingestelde prijzen per website.

Automatische omrekening fluctueert met wisselkoersen. Dat geeft klantenservice-problemen als een klant een prijs ziet die morgen anders is.

Belastingregels per markt

Elke markt heeft eigen btw-regels. Configureer deze via Stores > Tax Rules. Per rule koppel je een productklasse, klantklasse en belastingpercentage aan een geografische zone.

Voorbeeld voor NL B2C:
- Tax Rule: NL B2C 21%
- Customer Tax Class: Retail Customer
- Product Tax Class: Taxable Goods
- Tax Rate: Netherlands 21%
- Zone: Netherlands (postcode: *)

Vergeet niet dat digitale diensten binnen de EU onder het OSS-systeem (One Stop Shop) vallen. Dit heeft implicaties voor rapportage die buiten Magento native worden afgehandeld.

Performance bij multi-store

Elke store view voegt overhead toe aan cache-generatie. Magento genereert per store view aparte cache-entries voor pagina's en blocks.

Een installatie met 5 store views genereert 5x zoveel cache-entries als een single-store. Dit heeft impact op:

  • Full Page Cache grootte: zorg dat je Varnish of Redis genoeg geheugen heeft
  • Index-duur: reindex-jobs lopen voor elke store view
  • Deploy-tijd: static content deploy genereert assets per store view en taal
bash
# Static content deployen voor specifieke locales
php bin/magento setup:static-content:deploy nl_NL de_DE en_US -j 4

# Reindex uitvoeren
php bin/magento indexer:reindex catalog_product_price catalog_category_product

# Cache-grootte inspecteren
redis-cli info memory | grep used_memory_human

Wij zien in de praktijk dat een multi-store setup met vier store views de deploy-tijd verdubbelt tot verdriedubbelt ten opzichte van single-store. Plan dit in je deployment pipeline.

Veelgemaakte fouten

1. Alle store views in één website stoppen voor talen én landen

Als je Nederland en Duitsland in één website stopt met elk een store view, deel je betaalconfiguratie. Je kunt dan geen aparte betaalmethoden per markt instellen. Gebruik aparte websites voor aparte markten.

2. Global scope gebruiken voor markt-specifieke configuratie

Wat op global scope staat, geldt voor alle websites. Pas dat aan voor één website en je hebt een override op website scope nodig. Dit stapelt zich op tot een ondoorzichtige configuratiematrix.

3. Productdata vertalen via CSV-import zonder store view scope

Een bulk-import zonder store_view_code kolom schrijft data naar de default store view, niet naar de beoogde taal. Voeg altijd de store view scope toe aan je importbestand.

csv
sku,name,store_view_code
PROD-001,"Fietshelm rood",nl_NL
PROD-001,"Fahrradhelm rot",de_DE
4. Shared catalog activeren zonder performance-test

Activeer Shared Catalog nooit zonder benchmarks op een representatieve dataset. De query-overhead is direct merkbaar op categoriepagina's.

Conclusie

Multi-store in Magento 2 is krachtig, maar de architectuurkeuzes aan het begin bepalen hoeveel vrijheid je later hebt. De website-store-store view hiërarchie is geen detail — het is het fundament van je beheer- en internationaliseringslogica.

Neem de tijd om dit goed in te richten voordat je begint met producten importeren. Eenmaal live is een herstructurering van de store-hiërarchie een grootschalige operatie.

Wij helpen regelmatig bij het opzetten of saneren van multi-store configuraties. Bekijk onze Magento 2 diensten of neem contact op als je voor deze keuze staat. De officiële Adobe Commerce documentatie bevat de volledige referentie voor multi-store configuratie.


Meer over de kosten en architectuurkeuzes bij Magento 2? Lees ook Magento 2 kosten en TCO berekening.
Ruthger Idema

Geschreven door Ruthger Idema

15+ jaar ervaring in e-commerce development. Gespecialiseerd in Magento, Shopify en Laravel maatwerk.

Meer over ons team →
Deel dit artikel:

Wil je jouw e-commerce naar het volgende niveau?

Plan een vrijblijvend gesprek met onze experts over Magento, Shopify of Laravel maatwerk.

Plan een Tech Check