Guide Shopware SEO

How SEO fonctionne on Shopware 6 — the native contrôle it ships (Twig-templated SEO URLs, canonical handling, XML sitemaps, hreflang via the Sales Channel/Domain model, and, in recent versions, native robots.txt and JSON-LD), the version gates que decide ce que vous en réalité obtenir, the traps (rebuild the index après a template modifier, variant contenu dupliqué, seo_url table growth), and pourquoi headless (Composable Frontends) moves the whole SEO checklist into the Nuxt couche.

Première publication : 2 juil. 2026 · Dernière mise à jour : 3 août 2026 · Advanced
Langues

Shopware 6 ships an unusually grand amount of native SEO technique pour a self-hosted platform — Twig-templated SEO URLs per entity type, canonical handling, three-strategy XML sitemap generation, and hreflang derived from the Sales Channel/Domain model — but what's 'native' dépend heavily on votre version: per-domain robots.txt seulement arrived in 6.7.1.0 and JSON-LD données structurées (replacing Microdata) in 6.7.9.0 behind a fonctionnalité flag. The recurring traps are spécifique: vous doit rebuild the SEO index (dal:refresh:index) après modification une URL template, product variants chaque obtenir leur propre URL and can't be canonicalized straight to the parent sans a template override, and the seo_url table grows roughly with variants times languages. Going headless with Composable Frontends (Vue + Nuxt) moves the entier SEO checklist — sitemap, canonical, meta tags, données structurées — into the Nuxt rendering couche, où none of the admin SEO settings appliquer the même façon.

TL;DR — Shopware 6 ships plus native SEO technique que la plupart self-hosted platforms — but “native” is heavily version-gated. SEO URLs are Twig templates per entity type (product / category / landing page), configurable globally or per sales channel; modifier a template and vous doit rebuild the index (dal:refresh:index) or existing URLs won’t mettre à jour. Canonical is a separate system from URL templates: automatic pour categories, semi-manual pour variants (vous peut point un variant at un autre as canonical, but pas straight at the parent sans a template override). The XML sitemap has three refresh strategies (scheduled / live / manual, with sitemap:generate pour manual) and Shopware explicitly disclaims quelconque indexation guarantee. robots.txt n’est pashing-automatic avant 6.7.1.0 (manual fichier + server rewrite) and native per-domain admin editing après. Données structurées simplement migrated from Microdata to JSON-LD in 6.7.9.0 behind the JSON_LD_DATA flag. hreflang comes from the Sales Channel > Domain model, with a cross-sales-channel gap que spawned paid plugins. And going headless (Composable Frontends, Vue + Nuxt) moves the whole SEO checklist into the Nuxt rendering couche.

Evidence for this claim Shopware 6 provides configurable SEO URL templates and sitemap settings, with behavior dependent on version and sales-channel configuration. Scope: Shopware 6 administration; plugins and release versions can change output. Confidence: high · Verified: Shopware documentation: SEO Evidence for this claim Shopware release notes document material SEO-related changes across 6.7 releases, so exact native behavior must be checked by installed version. Scope: Shopware 6.7 release line, not all earlier installations. Confidence: high · Verified: Shopware 6.7 release notes

The frame: native, version-gated, and où vous encore do the fonctionner

La plupart Shopware SEO content is soit a screenshot walkthrough of the admin settings or a pitch from a Shopware agency. Neither indique vous the two choses que en réalité matter: ce que Shopware ships natively dépend on votre version, and the remaining gaps are spécifique and predictable. Sort every task into three buckets — native-and-current, native-only-if-you’re-on-a-recent-version, and still-your-job — and the platform arrête being mysterious.

Shopware itself frames the native side generously: it dit the platform “inclut nombreux SEO fonctionnalités out of the box – from country- and language-specific URLs to meta données, hreflang, and performances optimizations, allowing vous to construire strong SEO sans additional plugins.” That’s largely vrai — with the version caveats ci-dessous, and with a short liste of choses (bulk meta, variant canonicals, cross-channel hreflang, headless rendering) que encore besoin plugins or code.

Parce que Shopware is self-hosted and open-source-core, it sits differently from the hosted platforms. Où Shopify forces /products/ and /collections/ prefixes and won’t let vous natively edit robots.txt, and BigCommerce hands vous an editable robots.txt and custom Structure d’URLs on a managed stack, Shopware donne vous plus contrôler que quelconque of les — vous pouvez override storefront templates directement — at the cost of owning plus of the outcome, notamment votre propre hosting, indexation rebuilds, and (on headless) votre propre rendering pipeline. It’s closer in spirit to Magento or a self-hosted WooCommerce store que to Shopify.

Structure d’URL: SEO URL templates

SEO URLs live at Settings > Shop > SEO, and they’re configurable per sales channel or globally. Là are three separately-templated entity types — product detail pages, category pages, and landing pages — and the templates utiliser Twig syntax. Shopware’s docs put it plainly: “In the SEO settings vous pouvez define the structure pour the SEO URLs of the product detail pages and categories. Pour ce objectif vous have a variety of variables at votre disposal.”

The mechanics worth knowing:

  • The par défaut product template is {{ product.name }}, and là are 50+ product variables disponible (product number, EAN, manufacturer nom, breadcrumb/categories, custom fields, release date, and plus).
  • Multi-level variables doit be typed by hand. Clicking the variable picker seulement inserts the incomplete parent token — {{ product.translated.name }} has to be finished manually.
  • Vous pouvez truncate long noms. Pour a product nom plus long que, dire, 50 characters, Shopware documents {{ product.translated.name[:50] }} to shorten it in l’URL.
  • The category par défaut uses the breadcrumb: {% for part in category.seoBreadcrumb %}{{ part }}/{% endfor %}.
  • Twig filters fonctionner pour normalization — Par exemple {{ product.translated.name|lower }}/{{ product.productNumber }} — and Shopware notes “in general you can use the available Twig filters.”
  • Conditional (SI) logic handles manquant fields; the docs give a variant-aware exemple en utilisant {% if product.canonicalProductId is not null %}.

The trap almost everyone hits: “Après vous have made changements to the SEO template, it is necessary to rebuild the index so que l’URLs are mis à jour. Vous pouvez do ce from the console en utilisant the command php bin/console dal:refresh:index.” Editing a template seulement affecte newly generated URLs — existing products garder leur old slugs jusqu’à vous rebuild. Si vous modifier the template and “nothing happened,” ce is pourquoi.

Sous the hood, SEO URLs live in a seo_url database table with a dual-URL concept: a technical path_info (the réel route) and a human seo_path_info (the slug), plus sales_channel_id, language_id, is_canonical, and is_deleted/is_modified flags. Custom or dynamic SEO URL routes are ajouté by developers via a SeoUrlRouteInterface implementation registered with the shopware.seo_url.route container tag. Vous don’t besoin ce pour a normal store, but it explique the scale behavior in the pitfalls section ci-dessous.

Balise canonicals

Canonicalization on Shopware is a separate mechanism from l’URL templates — ce is the unique la plupart misunderstood partie of Shopware SEO. Shopware’s propre docs même define the concept the façon Google fait: “UNE URL canonique is l’URL of lune page que the moteur de recherche assumes is the la plupart representative of several duplicated pages on votre site.”

Three choses to garder straight:

  • Categories are canonicalized automatically. Quand a product is reachable via multiple categories (and therefore multiple URLs), Shopware’s marketing describes it as detecting ce and “automatically marks the correct URL, automatically preventing SEO technique problèmes.” Treat the marketing phrasing as a claim to confirmer on votre propre store, but the automatic-category behavior is réel.
  • Variants are seulement semi-manual. Chaque variant obtient its propre SEO URL, and the built-in “Variant for Canonical URL” picker lets vous nominate un variant as the canonical target. Ce que it fait pas do is let vous pouvezonicalize a variant straight back to the parent product — a gap practitioners fix by overriding product-detail/meta.html.twig (or with a plugin) so variants canonicalize to the parent’s SEO URL quand un exists. Si votre variant pages are near-duplicates competing with chaque autre, ce is the fix.
  • There’s a global 301 behavior toggle. Sous “Forwarding behavior,” Shopware peut “output an HTTP 301 redirect when URLs are changed” plutôt que leaving old URLs live après a template edit — the setting que pairs with the dal:refresh:index rebuild ci-dessus.

Ce maps directement onto Google’s propre stance que canonicalization is a hint and que duplicate variant/parameter URLs are normal in ecommerce — the general mechanics are in canonicalization, qui ce article is the Shopware-specific companion to.

XML sitemap

Le sitemap lives at Settings > Shop > Sitemap. Shopware “generates a standard sitemap que is compressed and mis en cache in the fichier system,” and pour grand catalogs “the sitemap is divided into several files and can be generated in the background” — the multi-file split que garde chaque fichier à l’intérieur le sitemaps.org / Google limites of 50 000 URLs and 50 MB uncompressed.

Là are three refresh strategies, and the difference matters:

  1. scheduled — generated automatically on a scheduled task at a définir interval.
  2. live — créé quand none exists, and recreated une fois the refresh temps elapses.
  3. manually — automatic generation is off entirely; “le sitemap va seulement be créé si vous appel the suivant command manually: php bin/console sitemap:generate. In ce cas, it is necessary to run ce command à nouveau chaque temps a nouveau URL is ajouté or an old un is supprimé.”

Two choses personnes miss:

  • The public URL is sitemap.xml, and there’s aucun human-facing /sitemap page. Shopware is explicit: “Shopware 6 ne fait pas provide a visitor sitemap (suffix /sitemap après votre domain). The index fichier sitemap.xml is créé pour evaluation by Google.”
  • A sitemap guarantees nothing. Shopware states outright que it “ne peut pas guarantee que every URL va be crawled and indexé. Ce toujours dépend on the moteur de recherche provider.” A sitemap is a discovery aid, pas an indexation promise — même as on every autre platform.

Ajout or excluding custom URLs (au-delà products/categories) isn’t an admin toggle — it’s developer fonctionner via custom UrlProvider classes, documented in Shopware’s developer sitemap guides.

robots.txt — vérifier votre version premier

Ce is the la plupart version-sensitive partie of Shopware SEO, so date-stamp it avant vous advise anyone.

  • Avant 6.7.1.0 (la plupart older installs): nothing is generated automatically. Shopware’s docs dire “the robots fichier n’est pas créé automatically in Shopware 6, but has to be créé manually as a text fichier” placed in /public/. Pour multi-domain setups vous serve a per-domain fichier with a server rewrite — Apache RewriteRule ^robots\.txt$ robots/%{HTTP_HOST}.txt [NS] or the NGINX equivalent rewrite ^/robots\.txt$ /robots/$host.txt — pointing at a /public/robots/<domain>.txt structure.
  • From 6.7.1.0 onward (July 2025 release): native per-domain robots.txt management shipped in the admin — vous “peut define individual robots.txt rules pour chaque domain in the Admin sous Settings > General > Basic information.” Ce commencé as a Hacktoberfest 2024 community contribution.

So the myth “Shopware doesn’t let you edit robots.txt” is seulement vrai pre-6.7.1.0. Confirmer the store’s version avant telling someone to “just edit it in the admin” — older stores encore besoin the manual-file-plus-rewrite approach. The admin field (“Rules pour robots.txt” sous Settings > General > Basic information) is a free-text area merged straight into que domain’s robots.txt, so it accepts complet User-agent: / Allow: / Disallow: blocks, pas simplement flat rules — confirmed les deux in Shopware’s current docs and in a 6.7.10.0 fix (éviter duplicate robots.txt directives pour user-agent blocks) que specifically reproduces the bug en utilisant per-user-agent blocks in que field.

Données structurées: the Microdata → JSON-LD migration

Shopware went via a réel architecture shift ici in 6.7.9.0: the storefront déplacé from scattered inline Microdata to JSON-LD emitted as a <script type="application/ld+json"> block in the <head>. It’s behind a fonctionnalité flag, JSON_LD_DATA, and is off by par défaut — with the flag on, JSON-LD is injected and the old Microdata is supprimé. The Microdata is deprecated and slated pour removal in 6.8.0.0.

Une fois vous flip the flag, the JSON-LD output is substantially richer que the old Microdata:

  • Product — tout product images, VideoObject pour product videos, AggregateRating with ratingCount, up to the 10 la plupart recent Review items, OfferShippingDetails/ShippingDeliveryTime pour single-price products, Dimensions as QuantitativeValue, itemCondition, typed seller info, and gtin13 (EAN) / mpn quand présent.
  • WebSite with SearchAction (enables Google’s Sitelinks search box).
  • Top-level Organization (shop logo).
  • ItemList on category / search-result pages, plus BreadcrumbList.

Chaque schema type lives in its propre overridable Twig template sous storefront/layout/structured-data/. The même 6.7.9.0 release aussi ajouté per-product Ouvrir Graph fields in the admin SEO tab — custom og:title, og:description, and og:image, defaulting to the product’s meta title/description/cover image quand unset — so social shares and some search-result previews peut now diverge intentionally from the meta tags sans a plugin.

The practical takeaway: ce is a myth-buster. Plenty of practitioner posts and paid Store extensions (“JSON-LD Rich Snippets pour product pages”) predate the native fonctionnalité. Si you’re on 6.7.9.0+, vérifier si vous encore besoin que plugin avant buying it — and si you’re on an older version, that’s exactly quand a plugin encore earns its garder. Google’s Product données structurées guidelines are the spec ce output targets, and Google exige données structurées to reflect visible page content — so fill the fields vous vouloir in the markup.

International SEO: hreflang via Sales Channel + Domain

Shopware doesn’t have a standalone hreflang editor. hreflang is derived from the Sales Channel > Domain model: chaque sales channel peut have multiple domains, and chaque domain maps to un language, un currency, a snippet définir, and a unit system — définir up with its “own virtual URL, language, currency, snippet set and its own unit system.”

Two settings do the SEO fonctionner:

  • A localization mode dropdown with two options: ISO standard, “utile, pour exemple, si vous utiliser différent (country-specific) language variants que may utiliser leur propre country-specific terms,” qui produces complet region-language codes comme en-US vs en-GB; and navigateur language localization, qui is language-only (plain en). Utiliser ISO standard quand vous genuinely have regional variants.
  • A par défaut domain que, après vous enable the hreflang meta tag, “va serve as a fallback pour tout languages” — Shopware’s version of Google’s x-default.

The connu weak spot: ce fonctionne dans a unique sales channel’s domains, but cross-sales-channel hreflang — separate sales channels per country/TLD running near-duplicate catalogs — n’est pas natively lié. Que gap is exactly ce que paid “Hreflang Manager” store extensions exist to solve. I’d treat the cross-channel gap as a strong community/marketplace signal plutôt que a documented Shopware limitation, but it’s a recurring pain point on the forums.

Un chose Shopware’s propre docs don’t spell out que Google exige: hreflang doit be bidirectional (retourner tags) and inclure an x-default. Si you’re nouveau to the return-tag requirement, the general mechanics are in hreflang — Shopware’s default-domain setting handles the x-default side, but vous encore vouloir to vérifier the retourner tags resolve.

Headless: Composable Frontends (Shopware Frontends)

Shopware’s headless option is “Shopware Frontends” (formerly “Composable Frontends” / “PWA”) — a Vue.js + Nuxt toolkit que consumes the Shopware Store API, distinct from the par défaut Twig/Symfony storefront. It ships a component library, an API client, reusable “composables,” and generated TypeScript types; the référence “Vue Demo Store” is construit on Nuxt + Tailwind.

Here’s the partie every autre guide skips: going headless moves essentially tout SEO responsibility into the Nuxt couche, and none of the admin SEO settings appliquer the même façon. The SEO URL templates, the canonical settings, le sitemap admin toggle, and the nouveau robots.txt admin panel are tout Symfony-storefront (Twig) fonctionnalités. A Composable Frontends construire nécessite its propre:

  • Rendering mode que produces crawlable HTML — Nuxt SSR (or hybrid / ISR / edge rendering) pour le SEO-relevant pages. A pure client-side-rendered (SPA) construire reintroduces the classic JavaScript-rendering SEO risk, so headless is pas automatically meilleur pour le SEO — a badly configuré headless storefront peut be worse que the par défaut Twig un.
  • Sitemap generation, balise canonicals, données structurées, and meta-tag injection implemented in the Nuxt app (typically via Nuxt’s head/SEO-meta composables), usually encore pulling slugs and product données from the même Shopware SEO URL / Store API données.

So the myth “going headless with Shopware fixes/improves SEO” is faux as stated. SEO outcome dépend entirely on how vous configurer rendering in Nuxt. Ce is the même trap as quelconque headless construire — the platform-agnostic version lives in JavaScript SEO and CMS headless SEO.

Courant pitfalls at scale

The practitioner pain points cluster in three places:

  • Par défaut misconfigurations. Practitioner audits flag que “Supprimer Category ID from URL” ships définir to Aucun by par défaut (worth enabling pour cleaner URLs), que pagination signals are off by par défaut, and que blog/archive pagination pages are worth noindex-ing parce que ils “add no value; they only take up crawl budget.” Un widely repeated claim — que Shopware auto-adds nofollow to tout external liens — I’d vérifier contre a réel install avant repeating; it wasn’t confirmed contre Shopware’s propre docs.
  • Product-variant contenu dupliqué. Ce is the unique la plupart recurring Shopware SEO complaint. Chaque variant obtient its propre URL (/SW10000.1, /SW10000.2, …) with inherited, near-identical descriptions, so variants compete unless vous pouvezonicalize les — and, per the canonical section ci-dessus, the built-in picker can’t point straight at the parent sans a template override.
  • seo_url table growth on grand multilingual catalogs. Row count roughly follows (parent + active variants) × number of languages — a practitioner deep dive puts a 9-variant product à travers 17 languages at ~153 rows pour a unique product family. Frequent template edits multiply history rows plus loin. At scale the fixes are: generate SEO URLs pour parent products seulement (pas every variant), prune soft-deleted / non-canonical rows periodically, and ajouter composite indexes. Ce is pourquoi a grand Shopware store peut feel slow and accumulate odd duplicate SEO URLs.

Quand native outils are suffisant vs. quand vous besoin a plugin or dev fonctionner

The rough threshold echoed à travers practitioner sources: native outils are suffisant pour petit, simple catalogs (on the order of a few hundred products), and plugins or custom development become necessary at meaningful scale — thousands of SKUs, deep variant matrices, nombreux languages, or cross-sales-channel international setups. Concretely, reach pour a plugin or code quand vous besoin bulk title/meta patterns, canonical-to-parent pour variants, cross-sales-channel hreflang, custom sitemap entries, or JSON-LD on a pre-6.7.9.0 version. Everything sinon — SEO URL templates, category canonicals, the sitemap, single-channel multi-domain hreflang, and (on current versions) robots.txt and JSON-LD — is native.

Shopware vs the hosted platforms — the honest version

ShopwareShopifyBigCommerce
HostingSelf-hosted / Shopware cloudHosted SaaSHosted SaaS
Structure d’URLTwig templates, entièrement customForces /products/, /collections/Entièrement custom, aucun forced prefixes
robots.txtNative admin from 6.7.1.0 (manual avant)Pas natively editableEditable in admin
Built-in schemaNative JSON-LD from 6.7.9.0 (flagged)App requisYes (Cornerstone)
hreflangNative via Sales Channel/Domain (single-channel)App / theme fonctionnerManual
Headless optionComposable Frontends (Vue + Nuxt)HydrogenCatalyst (Suivant.js)
Index rebuild stepYes (dal:refresh:index)Pas exposedPas exposed

Tout of les rank fine. Shopware’s genuine advantage is contrôler — Twig-templated URLs, overridable storefront templates, and a grand native fonctionnalité définir que garde growing by version. Its genuine cost is que vous propre plus of the pipeline: votre hosting, votre index rebuilds, votre version awareness, and — si vous go headless — votre entier rendering and SEO-tag couche. Comme Magento and self-hosted WooCommerce, and unlike Shopify or PrestaShop’s simpler defaults, que trade favors teams with development capacity.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.