SEO-Probleme in Shopware 6, die erst auffallen, wenn man genauer hinschaut
Vor ein paar Monaten habe ich mir einen Shopware-6-Shop angeschaut, der auf den ersten Blick alles richtig gemacht hat. Sauberes Theme, vernünftige Produkttexte, Meta-Descriptions gepflegt, sogar die Ladezeiten waren ordentlich. Trotzdem dümpelte die organische Sichtbarkeit irgendwo im Keller. Keine Rankings für Produktnamen, keine Impressionen auf Kategorie-Keywords, praktisch unsichtbar. Der Betreiber hat an den Texten gefeilt, an den Bildern, an den Beschreibungen — und nichts hat geholfen. Das Problem lag nicht im Content. Das Problem lag in der Art, wie Shopware URLs erzeugt, Canonical-Tags setzt und mit Filtern umgeht. Und ehrlich gesagt: Ich sehe das bei fast jedem Shopware-Shop, den ich mir genauer anschaue.
Die URL-Explosion, die niemand bestellt hat
Shopware 6 erzeugt von Haus aus eine erstaunliche Menge an URLs, und die meisten davon willst du nicht im Index haben. Jede Filterkombination in der Kategorie-Ansicht kann eine eigene URL bekommen — Farbe Rot plus Größe XL plus Hersteller Adidas, das sind drei Filterparameter, und Shopware generiert dafür eine abrufbare Seite. Bei einem Shop mit 20 Farben, 15 Größen und 50 Herstellern reden wir schnell über tausende Kombinationen, die alle crawlbar sind und alle denselben oder sehr ähnlichen Content zeigen. Google crawlt das alles brav durch, verbraucht dein Crawl-Budget, und am Ende hast du für keine einzige dieser Seiten genug Autorität, um irgendwo zu ranken.
Dazu kommen Paginierungsseiten. Seite 1, Seite 2, Seite 3 einer Kategorie — jede mit eigener URL, jede mit teilweise überlappenden Produkten, wenn zwischen zwei Crawls Produkte verschoben werden. Und dann sind da noch die Produktvarianten. Ein T-Shirt in fünf Farben erzeugt unter Umständen fünf separate URLs mit fast identischem Content, nur die Farbe im Titel unterscheidet sich. Das summiert sich.
Wie schlimm es wirklich ist, siehst du in der Sitemap. Ein kurzer Befehl im Terminal zeigt dir, wie viele URLs dein Shop tatsächlich an Google meldet.
curl -s https://shop.de/sitemap.xml | grep '<loc>' | wc -l
Wenn da eine Zahl rauskommt, die deutlich über deiner tatsächlichen Produkt- und Kategorieanzahl liegt, weißt du, dass du ein Problem hast. Bei dem Shop, den ich eingangs erwähnt habe, standen 38.000 URLs in der Sitemap — für einen Shop mit 400 Produkten und 25 Kategorien. Das ist der Moment, in dem man aufhört zu optimieren und anfängt aufzuräumen.
Duplicate Content durch Mehrfachzuordnung
Das nächste Problem ist fast noch heimtückischer, weil es nach einem Feature aussieht. Shopware erlaubt dir, ein Produkt mehreren Kategorien zuzuordnen. Ein Bluetooth-Lautsprecher kann unter „Elektronik“, unter „Geschenkideen“ und unter „Neuheiten“ erscheinen. Klingt praktisch, erzeugt aber für dasselbe Produkt drei verschiedene URLs mit identischem Content. Google sieht drei Seiten, die dasselbe sagen, und muss entscheiden, welche die „richtige“ ist. Meistens entscheidet Google falsch — oder verteilt die ohnehin schwache Autorität auf alle drei, sodass keine davon rankt.
Du kannst das sofort prüfen, indem du die Titel der Produktseite über verschiedene Kategoriepfade vergleichst. Ruf dasselbe Produkt über zwei verschiedene Kategorien auf und schau dir den Title-Tag an. Wenn er identisch ist, hast du Duplicate Content. Und selbst wenn Shopware den Kategoriepfad in die URL einbaut — für Google zählt der Content auf der Seite, nicht der Pfad in der Adresszeile.
Canonical-Tags: Wo Shopware sie setzt und wo nicht
Canonical-Tags sind das Werkzeug, mit dem du Google sagst, welche von mehreren ähnlichen Seiten die maßgebliche Version ist. Shopware 6 setzt Canonicals auf Produktdetailseiten, das funktioniert meistens korrekt. Aber auf gefilterten Kategorieseiten, auf paginierten Seiten und auf Variantengruppen fehlen sie oft oder zeigen auf die falsche URL. Das ist kein Bug im klassischen Sinne, es ist einfach ein Bereich, den Shopware nicht von Haus aus vollständig abdeckt.
Prüfen kannst du das schnell im Terminal. Ein curl auf eine gefilterte Kategorieseite zeigt dir sofort, ob ein Canonical gesetzt ist und wohin er zeigt.
curl -s "https://shop.de/kategorie/?color=rot&size=xl" | grep -i canonical
Wenn da nichts zurückkommt, fehlt der Canonical komplett. Wenn eine URL zurückkommt, prüf ob sie auf die ungefilterte Kategorieseite zeigt — denn das ist die Version, die Google indexieren soll. Alles andere erzeugt entweder Duplicate Content oder lenkt die Indexierung auf Seiten, die nie jemand über die Suche finden wird.
Im Shopware-Storefront-Theme kannst du den Canonical über einen Twig-Block erzwingen. Das ist der sauberste Weg, weil du damit direkt in der Template-Hierarchie arbeitest und keine zusätzlichen Plugins brauchst.
{% block layout_head_canonical %}
{% if page.listing is defined and page.listing.currentFilters|length > 0 %}
<link rel="canonical" href="{{ seoUrl('frontend.navigation.page', { navigationId: page.header.navigation.active.id }) }}">
{% else %}
{{ parent() }}
{% endif %}
{% endblock %}
Dieser Block prüft, ob Filter aktiv sind, und setzt den Canonical dann auf die saubere Kategorieseite ohne Parameter. Bei allen anderen Seiten greift das Standard-Verhalten. Das ist simpel, aber es löst ein Problem, das viele Shops über Monate mit sich herumschleppen, ohne es zu merken.
Filterseiten aus dem Index halten
Neben Canonicals gibt es noch einen zweiten Hebel, und der ist mindestens genauso wichtig: Meta-Robots-Tags. Filterseiten sollten grundsätzlich ein noindex, follow bekommen. Google soll den Links auf der Seite folgen, damit es die verlinkten Produkte findet, aber die Filterseite selbst hat im Index nichts verloren. In Shopware kannst du das über ein eigenes Plugin oder über einen Theme-Override lösen, der auf Listing-Seiten mit aktiven Filtern ein entsprechendes Meta-Tag injiziert.
Die robots.txt ist dafür übrigens nur bedingt geeignet. Du kannst dort Filterpfade blockieren, aber dann folgt Google auch den Links auf diesen Seiten nicht mehr — und verliert damit Crawl-Pfade zu deinen Produkten. Die Kombination aus Canonical auf die saubere Kategorie plus noindex auf der Filterseite ist in der Praxis die robusteste Lösung.
Pagination: rel=prev/next ist Geschichte
Viele Shop-Betreiber setzen noch auf rel="prev" und rel="next" bei paginierten Kategorieseiten. Das hat Google seit 2019 offiziell für irrelevant erklärt — es wird schlicht ignoriert. Trotzdem taucht es in vielen Shopware-Themes und SEO-Plugins noch auf, als ob es etwas bewirken würde.
Was stattdessen hilft, ist eine saubere Architektur. Die erste Seite einer Kategorie bekommt den Canonical auf sich selbst, ohne Seitenparameter. Paginierte Folgeseiten bekommen idealerweise ein noindex, damit Google nicht zehn fast identische Kategorieseiten indexiert, die sich nur in den gezeigten Produkten unterscheiden. Und wenn du es richtig machen willst, lädst du auf der ersten Seite mehr Produkte — 48 statt 24 zum Beispiel — damit die meisten Kategorien gar keine zweite Seite brauchen. Weniger Seiten, weniger Probleme.
hreflang für mehrsprachige Shops
Wenn dein Shopware-Shop mehrere Sprachen bedient, kommt noch eine weitere Ebene dazu. Ohne korrekte hreflang-Tags weiß Google nicht, welche Sprachversion für welchen Markt gedacht ist. Im schlimmsten Fall konkurrieren deine deutsche und deine englische Produktseite gegeneinander um dieselben Rankings. Shopware setzt hreflang-Tags, aber nur wenn die Sales-Channel-Konfiguration sauber ist und die Domains korrekt zugeordnet sind. Ich habe Shops gesehen, bei denen der hreflang auf die falsche Domain zeigte, weil jemand nach einem Domain-Umzug die Sales-Channel-Einstellungen nicht aktualisiert hat. Das prüfst du genauso wie den Canonical — per curl und grep.
curl -s https://shop.de/produkt-name/ | grep -i hreflang
Da sollte für jede Sprachversion ein Link-Tag stehen, und jede URL sollte erreichbar sein und auf die richtige Sprachversion zeigen. Wenn nicht, hast du ein Problem, das sich in der Search Console als „hreflang-Fehler“ niederschlägt und deine internationalen Rankings ruiniert.
Das eigentliche Problem ist die Haltung
All diese Probleme haben eine gemeinsame Ursache, und die ist nicht technisch. Sie liegt in der Annahme, dass ein Shopsystem wie Shopware SEO „einfach mitbringt“. Tut es nicht. Shopware bringt die Grundstruktur mit — saubere URLs, eine Sitemap, grundlegende Meta-Tags. Aber alles darüber hinaus, die Canonical-Strategie, die Crawl-Steuerung, die Behandlung von Filtern und Varianten, das musst du selbst bauen. Entweder über Theme-Overrides, über Plugins oder über manuelle Konfiguration.
Ich sage das nicht, um Shopware schlecht zu machen. Ich entwickle seit Jahren Plugins dafür, und ich mag das System. Aber ich sehe bei fast jedem Projekt dieselben SEO-Probleme, und sie fallen erst auf, wenn die Sichtbarkeit ausbleibt oder ein Audit die tausenden unnötigen URLs im Index aufdeckt. Der beste Zeitpunkt, sich darum zu kümmern, ist direkt nach der Shop-Einrichtung. Der zweitbeste ist jetzt.
Die gezeigten Code-Beispiele dienen zur Veranschaulichung. Nutzung auf eigene Verantwortung. Mehr dazu