Was ist das PIM?#
Das PIM ist ein vollwertiges Product Information Management direkt im Shopware-Admin. Statt Pflege in Drittsystemen, ETL-Pipelines oder Excel-Exporten erweitert das Plugin Shopware um das, was im Standard fehlt: massenhafte Bearbeitung, Variantengenerierung mit Mustern, sprachsensible CSV-Workflows und ein durchgehendes Snapshot-System.
Module im Überblick
Katalog-Gesundheit
Vollständigkeits-Score, fehlende Bilder/Preise/SEO, Top-Kategorien — alles auf einem Blick.
Produktübersicht
Stammartikel und Varianten in einer Tabelle, inline aufklappbar, mit 25+ Filter-Kriterien und Presets.
Mehrfachbearbeitung
22 Felder plus Cross-Selling-Gruppen gleichzeitig ändern — mit Snapshot, Vorschau und Ein-Klick-Revert.
Variantengenerator
Chip-basierte Optionsauswahl, Pattern-Variablen, Hauptvarianten-Vorauswahl, Live-Vorschau, sicheres Löschen.
Import & Export
Batch-POST-API, alle Sprachen in einer Datei, JSON-Merge für Custom Fields, Snapshot.
Translations
Spaltenansicht aller Sprachen, Custom Fields pro Sprache, Vollständigkeits-Dashboard.
Text & Übersetzung
Optional: ChatGPT für Beschreibungen, DeepL für Massen-Übersetzungen über alle Shop-Sprachen.
Produkt-Preview
Inaktive Artikel temporär aktivieren — automatische Rücksetzung nach 15/30/60/120 Sekunden.
Workflow & Sicherheit
Vollständige Historie mit User/Zeit/Diff, Approval-Workflow, Edit-Lock mit Heartbeat, feingranulare Permissions.
Systemvoraussetzungen
- Shopware
- 6.5, 6.6 oder 6.7 — eine Plugin-Version pro Major-Release
- PHP
- 8.2 oder höher (8.3 empfohlen)
- Datenbank
- MySQL 8.0 oder MariaDB 10.11+
- Admin-Stack
- Vue 3 (ab Shopware 6.6) bzw. Vue 2 (Shopware 6.5)
- Hosting
- On-premise — keine externen API-Aufrufe, keine Cloud-Abhängigkeiten
Installation#
Es gibt drei Wege, das PIM zu installieren — je nachdem, ob du das Plugin aus dem Shopware Store, als ZIP oder per Composer beziehst.
Weg 1 — Shopware Store
- Im Shopware-Admin Erweiterungen → Store öffnen und nach „PIM für Shopware“ suchen.
- Plugin kaufen und herunterladen.
- Unter Erweiterungen → Meine Erweiterungen auf Installieren und anschließend Aktivieren klicken.
- Cache löschen (passiert in der Regel automatisch).
Weg 2 — ZIP-Upload
- Die Datei
StawPim-vX_Y_Z.zipherunterladen. - Im Admin unter Erweiterungen → Meine Erweiterungen auf Erweiterung hochladen klicken.
- Installieren und aktivieren wie unter Weg 1.
Weg 3 — Composer / CLI
# Plugin entpacken nach custom/plugins/StawPim
$ cd /var/www/shop
$ bin/console plugin:refresh
$ bin/console plugin:install --activate StawPim
$ bin/console cache:clear
Nach der Installation
Im Admin erscheinen unter Kataloge drei neue Menüpunkte: PIM-Dashboard, PIM (Produktliste) und PIM-Konfigurationsmatrix. Innerhalb des PIM-Moduls erreichst du außerdem Import & Export, das Audit-Log und die Translation-Übersicht. Beim ersten Aufruf der Konfigurationsmatrix wird automatisch die Feldmatrix mit allen Standard- und Custom-Fields aufgebaut.
Für die optionalen Module: OpenAI-API-Key (für KI-Textgenerierung) und DeepL-API-Key (für Übersetzungen) in der Konfigurationsmatrix unter KI & Übersetzung hinterlegen. Beide Module sind ohne Keys einfach inaktiv.
Erste Schritte#
Der schnellste Weg, das PIM kennenzulernen: drei typische Workflows nacheinander durchspielen.
Dashboard überfliegen
Kataloge → PIM-Dashboard öffnen. Hier siehst du auf einen Blick, wo dein Katalog Lücken hat — fehlende Bilder, leere Beschreibungen, unvollständige Translations. Ein Klick auf eine Kachel öffnet das Listing mit dem passenden Filter.
Konfigmatrix prüfen
PIM → Konfiguration öffnen. Pro Feld kannst du festlegen, ob es im Listing, im Detail, im Bulk-Editor und im CSV-Export erscheint. Defaults passen für die meisten Shops — Custom Fields werden automatisch ergänzt.
Erste Bulk-Operation
PIM → Produkte, einen Filter setzen (z.B. „Hersteller = X“), im Header Alle auswählen, dann Mehrfachbearbeitung. Ein Feld ändern (Lieferzeit oder Steuer), Vorschau prüfen, übernehmen. Vor dem Apply wird automatisch ein Snapshot angelegt.
Snapshot prüfen und ggf. zurückrollen
PIM → Audit-Log. Die Bulk-Operation steht oben mit Zeitstempel, User und Diff. Daneben ein Wiederherstellen-Button — ein Klick, und der Vorher-Zustand ist wiederhergestellt.
CSV-Export & Re-Import
PIM → Import & Export → Export, Spalten wählen, Sprachen wählen,
herunterladen. Datei in Excel/Numbers bearbeiten, dann Import
hochladen. Match per productNumber, Translations werden separat
gemerged.
PIM-Dashboard#
Das Dashboard zeigt die Katalog-Gesundheit auf einen Blick: Wo fehlen Bilder, Preise oder Übersetzungen? Welche Produkte sind unvollständig? Erreichbar über Kataloge → PIM-Dashboard.
Vollständigkeits-Score
Pro Produkt wird ein Score in Prozent berechnet, basierend auf der Befüllung der in der Konfigmatrix als relevant markierten Felder. Was als relevant gilt, ist pro Shop einstellbar — z.B. Name, Beschreibung, mind. ein Bild, Meta-Title.
Health-Kacheln
Die Übersichtsseite zeigt aggregierte Kennzahlen:
- Produkte ohne Cover-Bild — mit Direkt-Link auf die Filter-Auswahl
- Produkte ohne Preis — Stammartikel und Varianten getrennt
- Produkte ohne Beschreibung — pro Sprache
- Produkte ohne Meta-Title / Meta-Description
- Produkte mit Bestand < Schwellenwert (Schwellenwert konfigurierbar)
- Inaktive Produkte mit Lagerbestand — möglicherweise vergessen
- Top-Kategorien nach Produktzahl mit Vollständigkeit
Übersetzungs-Vollständigkeit
Pro Shopsprache erscheint ein Balken mit der Vollständigkeit aller Translation-Felder. Klick auf den Balken filtert das Listing auf die unvollständigen Produkte dieser Sprache.
Produktlisting#
Das Listing ist der zentrale Einstiegspunkt. Es zeigt Stammartikel und Varianten in einer einzigen Tabelle und ist die Quelle aller Bulk-Operationen.
Anzeigeformat
Oberhalb und unterhalb der Tabelle steht die Aggregatzeile im Format:
Produkte: 153 (Varianten: 543)
Die Zahl in Klammern bezieht sich auf die aktuell gefilterte Menge — wer einen Variantenfilter setzt, sieht hier sofort, wie viele Varianten matchen.
Inline-Aufklappen
Jeder Stammartikel mit Varianten zeigt einen kleinen Badge mit der Variantenzahl. Ein Klick darauf klappt die Varianten direkt in der Tabelle aus — ohne Modal, ohne Seitenwechsel. Varianten werden lazy geladen, erst beim Aufklappen.
Filter
Über 25 spezialisierte Filter-Kriterien stehen zur Verfügung — von Standard-Operatoren bis zu fachspezifischen Filtern wie Sichtbarkeit-Level, SEO-Meta-Status, Gewichts-/Maß-Bereiche und Datums-Ranges. Beliebig viele Bedingungen können mit UND / ODER verknüpft werden. Die Suche kennt automatisch Variantenfelder — eine Bedingung auf einem Variantenattribut trifft auch den Stammartikel, wenn mindestens eine Variante matcht.
| Operator | Wirkung | Beispiel |
|---|---|---|
| Enthält | Substring-Match (case-insensitive) | name enthält "Schuh" |
| Enthält nicht | Negiertes Substring-Match (auch mit Eltern-Produkten) | name enthält nicht "Test" |
| Gleich | Exakter Wert-Vergleich | active = true |
| Ungleich | Negation | tax_rate ≠ 19 |
| Beginnt mit | Prefix-Match | productNumber beginnt mit "SW-" |
| Endet mit | Suffix-Match | name endet mit "(Demo)" |
| Größer / Kleiner | Numerische Vergleiche | stock > 0 |
| Ist leer / nicht leer | NULL-/Empty-Check | description ist leer |
| Sichtbarkeit-Level | Filter über Visibility-Level je Channel | visibility = Direktlink (10) |
| SEO-Meta-Status | Vollständigkeit der SEO-Felder | SEO unvollständig |
| Gewichts-/Maß-Bereich | Min/Max für Gewicht, L/B/H | weight 0.5–2.0 kg |
| Datums-Range | ab/bis verfügbar, Anlagedatum, letzte Änderung | createdAt 01.04. – heute |
| Property-Kombination | Mehrere Properties kombiniert | Farbe=rot UND Größe=M |
| Bild-Status | Mit/ohne Bilder, mit/ohne Cover | kein Cover gesetzt |
Filter-Presets
Ein häufig genutztes Filter-Set einmal speichern, dann mit einem Klick wiederherstellen. Presets werden pro User abgelegt — jeder Pfleger hat seine eigene Sammlung. Aktive Filter-Chips bleiben oberhalb der Tabelle sichtbar; ein Klick auf das × entfernt eine einzelne Bedingung.
Pagination & Performance
- Zeilenanzahl wählbar: 10, 25, 50, 100, 200, 500
- Pagination oben und unten verfügbar
- Schnell-zurück-nach-oben-Button rechts unten
- Spaltenkonfiguration und Page-Size werden pro User persistiert
color = "rot", werden auch Stammartikel angezeigt, deren rote Variante
existiert — die Variantenzahl in der Aggregatzeile zeigt dann nur die matchenden
Children.
Mehrfachbearbeitung#
Die Bulk-Edit-Operation ist das Herzstück des PIM. Sie verändert beliebig viele Produkte in einem Schritt, legt vorher einen Snapshot an und zeigt vor dem Apply eine vollständige Vorschau.
Ablauf einer Bulk-Operation
- Im Listing filtern und/oder Zeilen manuell selektieren.
- Button Mehrfachbearbeitung klicken.
- Im Modal die zu ändernden Felder aktivieren und Werte eingeben.
- Scope wählen: Aus Auswahl oder Aus Filter-Preset; mit/ohne Varianten.
- Vorschau prüfen — Live-Counter „X Produkte betroffen“ und neue Werte pro Feld.
- Übernehmen — Snapshot wird angelegt, Änderung wird ausgeführt, Audit-Log-Eintrag entsteht.
Die 22 Bulk-Felder
| Kategorie | Felder | Snapshot |
|---|---|---|
| Stammdaten | Name, Beschreibung, Meta-Title, Meta-Description, Keywords | ja |
| Status & Stamm | Aktiv-Status, Hersteller, Steuersatz, Lieferzeit | ja |
| Preis | Preis (brutto/netto), Listenpreis | ja |
| Preis · Varianten | Staffelpreise auf Varianten übertragen | nein |
| Identifier | EAN, Hersteller-Nummer, Verpackungseinheit | ja |
| Logistik | Maße (Länge, Breite, Höhe), Gewicht | ja |
| Bestand | Bestand, verfügbarer Bestand, ab/bis verfügbar | ja |
| Struktur | Kategorien, Hauptkategorie pro Verkaufskanal | ja |
| Klassifizierung | Tags, Eigenschaften (Properties) | ja |
| Sichtbarkeit | Verkaufskanal-Sichtbarkeit | ja |
| Cross-Selling | Cross-Selling-Gruppen zuweisen (Produktstream oder Produktliste) · seit v1.0.3 | ja |
| Cross-Sell · Varianten | Cross-Selling auf Varianten übertragen | nein |
| Varianten-Vorauswahl | Hauptvariante auto-setzen (erste / niedrigste Nummer), Hauptartikel optional verbergen · seit v1.0.3 | ja |
| SEO | SEO-URL (generiert) | nein |
| Custom Fields | Beliebige Zusatzfelder, auch pro Sprache | ja |
Snapshot-System
Vor jeder Bulk-Operation auf snapshot-fähigen Feldern wird der Vorher-Zustand der betroffenen Produkte erfasst und in der DB abgelegt. Im Audit-Log erscheint der Eintrag mit:
- User, Datum, Anzahl betroffener Produkte
- Liste der geänderten Felder
- Diff vorher/nachher pro Produkt (auch für Translations pro Sprache)
- Button Wiederherstellen direkt in der Zeile
/api/search/product statt einzelner
GET-Calls). Bulk-Operationen auf tausenden Produkten sind dadurch deutlich
schneller als zuvor.
Auf Filter beschränken
Ein häufiges Szenario: Du filterst im Listing nach einem Variantenfeld (z.B. „nur rote Schuhe“) und willst alle gefundenen Varianten ändern — aber nicht den Stammartikel, dessen andere Varianten den Filter nicht treffen.
Genau dafür gibt es im Bulk-Modal den Toggle „Auf Filter beschränken“. Aktiviert, folgt die Bulk-Aktion exakt dem aktiven Filter — der Parent bleibt unangetastet, nur die filter-treffenden Children werden geändert.
Scope-Optionen
- Aus Auswahl
- Nur die im Listing manuell selektierten Zeilen.
- Aus Preset
- Alle Produkte, die dem aktuellen Filter entsprechen — auch über mehrere Seiten hinweg.
- Mit/ohne Varianten
- Auf Stammartikel beschränken, oder Varianten mit einbeziehen.
- Nur Varianten
- Stammartikel ignorieren, nur Children verändern (sinnvoll bei Filter-Beschränkung).
Variantengenerator#
Der Variantengenerator erzeugt vollständige Variantenstrukturen — von der Eigenschaftenauswahl über Artikelnummer- und Namens-Patterns bis zur Bestätigung via Vorschau. Funktioniert pro Produkt oder als Mehrfachoperation.
Workflow
Eigenschaften wählen
Im linken Panel des VarGen-Modals erscheinen alle vorhandenen Property-Gruppen. Mit Suche filterbar.
Optionen anklicken
Rechts erscheinen die Optionen der gewählten Gruppe als Chips. Mehrfachauswahl, „Alle“-Button pro Gruppe. Click-Reihenfolge bestimmt die Reihenfolge im generierten Variantennamen.
Pattern definieren
Pattern für Artikelnummer und Variantenname mit Variablen wie {number}, {option1}, {counter}. Defaults kommen aus der Konfigmatrix, sind aber pro Operation überschreibbar.
Vorschau prüfen
Live-Vorschau der ersten 8 Kombinationen plus Anzahl total. Erst dann Generieren klicken.
Variablen für Patterns
Siehe Abschnitt 13 — Variablen-Referenz für die vollständige Liste mit Beispielen.
Per Produkt vs. Mehrfachoperation
Die Variantenmatrix funktioniert auf zwei Ebenen:
- Pro Produkt: Im Produkt-Detail-Modal kann ein einzelner Stammartikel sein eigenes Pattern, eigene Optionen und ein Override gegenüber der Konfigmatrix haben. Existierende Configurator-Settings werden respektiert, die Variantenposition wird automatisch fortgeführt.
- Bulk: Im Listing mehrere Stammartikel auswählen, Varianten generieren klicken. Dasselbe Pattern wird auf alle gewählten Parents angewendet.
Sicheres Löschen
Varianten lassen sich aus dem Generator-Modal heraus auch wieder entfernen — mit zwei Modi:
- Modus „Sicher“
- Löscht nur Varianten ohne Bestellungen. Aktive Variants bleiben erhalten.
- Modus „Alle“
- Löscht die gesamte Variantenstruktur, inklusive solcher mit Order-History. Vor Apply wird die Anzahl explizit in einem Bestätigungsdialog gezeigt.
Hauptvarianten-Vorauswahl seit v1.0.3
Nach dem Generieren steht die Frage, welche Variante als Hauptvariante fungieren soll — also die Variante, die als Default ausgewählt ist, wenn ein Kunde auf das Produkt klickt. StawPim wählt diese automatisch nach einer konfigurierbaren Strategie:
- Erste Variante
- Die in Generierungsreihenfolge zuerst erzeugte Variante wird Hauptvariante.
- Niedrigste Artikelnummer
- Sortierung nach
productNumber, die kleinste wird Hauptvariante. Sinnvoll für deterministische Auswahl unabhängig von Erzeugungsreihenfolge. - Hauptartikel verbergen
- Optional: Der Parent wird im Listing und in Suchergebnissen versteckt — Kunden sehen nur die Variante.
Globale Defaults dafür stehen in der Konfigmatrix unter Varianten; pro Operation überschreibbar.
Import & Export#
CSV, TSV oder XML — alles drei werden unterstützt. Sie sind der Standardweg, um große Datenmengen außerhalb des Admin zu bearbeiten: in Excel, Numbers, OpenOffice oder einem Texteditor. Das PIM verwendet eine einheitliche Spaltenkonvention, die alle Sprachen in einer Datei abdeckt.
Export
Im Import-/Export-Modul: gewünschte Felder, Sprachen, Verkaufskanäle und Dateiformat (CSV, TSV, XML) wählen — die Auswahl wird pro Shop gespeichert und beim nächsten Export vorgeschlagen.
POST /api/search/product-Abfrage mit inline
Associations (media, properties, tags, categories, mainCategories, crossSellings,
children) statt tausenden sequenzieller GET-Calls. Auch große Exporte mit
10.000+ Produkten dauern nur noch Sekunden.
Was exportiert werden kann
- Alle Standard-Produktfelder
- Übersetzungen pro Sprache (auch je Verkaufskanal)
- Custom Fields, auch pro Sprache (seit v1.0.3 mit Tree-Resolution für Hauptkategorie-Namen)
- Variantenfelder — Parent-Daten und Variant-Daten in einer Datei
- Eigenschaften (Properties), Tags, Kategorien
Spaltenkonvention
Die Spalten folgen einem einfachen Schema mit doppeltem Unterstrich als Trenner. Siehe auch Abschnitt 14 — CSV-Spalten-Referenz.
# Standard-Feld (sprachneutral)
productNumber, active, stock
# Translation eines Standard-Felds
trans_name__de_DE
trans_name__en_GB
trans_description__de_DE
# Custom Field (sprachneutral)
cf_meinFeld
# Custom Field pro Sprache
cf_meinFeld__de_DE
cf_meinFeld__en_GB
Import
Beim Import läuft alles über die Shopware-Sync-API in Batches — auch 10.000 Produkte sind in wenigen Minuten durch. Drei Dateiformate werden akzeptiert:
- CSV
- Komma- oder Semikolon-getrennt, UTF-8 (mit oder ohne BOM). Standardweg für Excel.
- TSV
- Tab-getrennt — geeignet für Daten mit Kommas in Feldwerten.
- XML
- Strukturiertes Format, ideal für Lieferanten-Feeds.
Der Workflow ist für alle drei Formate identisch:
- Pre-Fetch: Bestehende Werte aller betroffenen Produkte werden gelesen.
- Snapshot: Vorher-Zustand wird abgelegt — auch Translation-Werte.
- Match: Produkte werden per
productNumberidentifiziert. - Anlage oder Update: Existiert ein Match, wird geupdatet; sonst wird das Produkt neu angelegt.
- Translation-Phase: Sprachspalten werden separat verarbeitet, Custom-Field-JSON wird gemerged, nicht überschrieben.
- Audit-Log: Eintrag mit Diff entsteht, Revert-fähig.
Datentyp-Erkennung
Das PIM erkennt Datentypen locale-bewusst — deutsche Zahlen mit Komma genauso wie
angloamerikanische mit Punkt, ISO-Daten genauso wie dd.mm.yyyy.
| Typ | Akzeptiert | Beispiele |
|---|---|---|
| Boolean | 1/0, ja/nein, true/false, aktiv/inaktiv | true · ja · 1 |
| Number | Komma- oder Punkt-Dezimal | 19,99 · 19.99 |
| Date | ISO 8601 + deutsche Notation | 2026-05-11 · 11.05.2026 |
| Array | Pipe-getrennte Werte (Multi-Select-CFs) | rot|blau|grün |
| String | Beliebige Zeichen, UTF-8 | Sneaker Pro |
Mehrsprachigkeit#
Statt im Shopware-Header zwischen Sprachen zu wechseln und jedes Mal neu zu laden, zeigt das PIM alle Übersetzungen pro Produkt parallel — in einer Spaltenansicht.
Translation-Tab
Im Produkt-Detail erscheint ein eigener Translations-Tab. Pro Sprache eine Spalte; pro Feld eine Zeile. Name, Beschreibung, Meta-Title, Meta-Description und Keywords sind parallel editierbar — auch lange Texte mit dem Rich-Text-Editor.
Custom Fields pro Sprache
Klassisches Shopware speichert Custom Fields im sprachneutralen customFields-JSON
der Product-Entity. Für mehrsprachige Inhalte ist das zu wenig. Das PIM erweitert das:
- Custom Fields können als translatable markiert werden.
- Werte werden dann in der jeweiligen Product-Translation gespeichert.
- CSV-Spalten folgen dem Schema
cf_<name>__<lang>. - Im Translations-Tab erscheinen sie automatisch in der Spaltenansicht.
Translation-Dashboard
Welche Produkte sind in welcher Sprache komplett? Das Dashboard zeigt:
- Abdeckung pro Sprache in Prozent
- Abdeckung pro Verkaufskanal (Sprachen je Channel werden respektiert)
- Direkt-Links zu unvollständigen Produkten
- Pflichtfelder pro Sprache (in Konfig einstellbar)
Verkaufskanal-Awareness
Nicht jeder Verkaufskanal hat alle Sprachen — der deutsche B2B-Channel braucht vielleicht nur DE, der internationale Storefront DE + EN + FR. Das PIM kennt diese Zuordnung und zeigt im Detail-Tab nur die für den jeweiligen Kontext relevanten Sprachen an. Im Dashboard wird Vollständigkeit pro Channel separat aggregiert.
KI & DeepL-Integration#
Optionale Module — Text-Generierung mit ChatGPT und Massen-Übersetzung mit DeepL. Beide funktionieren komplett separat von den Kernfunktionen; das PIM läuft auch ohne sie. Wer sie nutzen möchte, hinterlegt einen API-Key in der Konfigmatrix.
ChatGPT-Textgenerierung
Im Produkt-Detail erscheinen bei aktivem OpenAI-Key kleine KI-Buttons neben den Textfeldern. Verfügbare Aktionen:
- Beschreibung generieren — aus Produktname, Kategorie, Properties
- Meta-Title vorschlagen — SEO-optimiert, Längenlimit
- Meta-Description vorschlagen — Call-to-Action am Ende
- Keywords extrahieren — aus Name und Beschreibung
- Text umschreiben — Tonalität ändern (formell/casual/SEO-fokussiert)
- Text kürzen / verlängern — auf gewünschte Länge bringen
Generierungs-Prompts sind in der Konfiguration als Templates hinterlegt und überschreibbar. Pro Sprache eigene Prompt-Defaults möglich.
DeepL-Übersetzung
Im Translation-Tab erscheint pro Sprachspalte ein Übersetzen-Button. Klick übersetzt die aktuelle Zeile (oder alle Felder) von der Default-Sprache in die Zielsprache.
Massen-Übersetzung
Im Translation-Dashboard: Sprache und Felder wählen, „Alle fehlenden mit DeepL befüllen“ klicken. Das PIM iteriert über alle unvollständigen Produkte und befüllt sie batch-weise. Fortschritts-Anzeige, Abbruch möglich, Snapshot wird vorher angelegt — Rückrollen via Audit-Log.
Glossare
DeepL-Glossare werden unterstützt. Begriffe wie Markennamen, Produktbezeichnungen oder Fachterminologie können pro Sprachpaar als Glossar hinterlegt werden — DeepL übersetzt sie dann konsistent.
Permissions
Für KI und DeepL gibt es separate Permissions (pim.ai_use,
pim.deepl_use, pim.deepl_bulk) — sodass z.B. Texter
KI nutzen, aber nur ein Administrator Massen-DeepL anstoßen darf.
Medien, Preise & weitere Felder#
Das PIM deckt den kompletten Produktlebenszyklus ab. Hier die wichtigsten Module außerhalb von Bulk/CSV.
Medien
- Drag & Drop-Upload direkt aus dem Produkt-Detail.
- Alternative: Auswahl aus der Shopware-Media-Bibliothek.
- Coverbild-Definition per Klick auf das Stern-Symbol.
- Galerie-Reihenfolge per Drag & Drop — atomare Batch-Speicherung mit Fehleranzeige (seit v1.0.4).
- Alt-Texte pro Bild und Sprache.
Preise
- Beliebig viele Preisstaffeln pro Produkt.
- Brutto/Netto-Eingabe je Steuersatz mit Live-Berechnung.
- Listenpreis (UVP) zur Anzeige als „Statt-Preis“ im Shop.
- Optional: Bulk-Übertragung der Staffelpreise auf alle Varianten (nicht-revertierbar).
Properties
- Property-Zuweisung pro Produkt — oder im Bulk für viele auf einmal.
- Suche, Gruppierung, Mehrfachselektion.
- Erstellen und Editieren von Property-Gruppen direkt im PIM — inkl. Farb-Swatches, Bildern, Übersetzungen.
- Auch im Translations-Tab pro Sprache pflegbar (Property-Übersetzungen).
Cross-Selling
- Mehrere Cross-Selling-Streams pro Produkt.
- Manuelle Produktliste oder dynamische Produktgruppe (Stream).
- Produkt-Suche mit Drag & Drop-Sortierung.
- Bulk-Zuweisung über Mehrfachbearbeitung (seit v1.0.3).
- Optional Übertragung auf Varianten (nicht-revertierbar).
productVersionId
repariert. Cross-Selling-Gruppen, die in alten Shopware-Versionen ohne diese ID
angelegt wurden und im Storefront unsichtbar waren, erscheinen nach erneutem
Speichern im Shop.
Kategorien
- Standard-Kategorienzuweisung wie im Shopware-Admin.
- Hauptkategorie pro Verkaufskanal — für korrekte Breadcrumbs und SEO.
- Anzeige als Kategoriename (auch bei 500+ Kategorien performant).
- Im Bulk änderbar.
SEO
- Meta-Title, Meta-Description, Keywords pro Sprache.
- Im Bulk-Modus änderbar.
- SEO-URL wird von Shopware generiert (nicht im Snapshot).
Workflow, Audit, Lock & Berechtigungen#
Wenn mehrere Personen Produkte pflegen, ist Nachvollziehbarkeit alles. Das PIM protokolliert jede schreibende Operation, kann auf einen Vorher-Zustand zurückrollen und verhindert über einen Edit-Lock paralleles Überschreiben.
Audit-Log
Jeder Eintrag enthält:
- Zeitstempel
- Wann die Operation lief (auf Sekundengenau)
- User
- Welcher Admin-User die Aktion ausgelöst hat
- Operation
- Bulk-Edit, CSV-Import, Variantengenerierung, manuelle Einzeländerung, KI-Generierung, DeepL-Übersetzung
- Scope
- Anzahl betroffener Produkte + Liste der productNumbers
- Diff
- Vorher/Nachher pro Feld, auch für Translations pro Sprache
- Snapshot-Status
- Ob ein Revert möglich ist (ja/nein)
Die Aufbewahrungsfrist für Audit-Einträge ist in der Konfigmatrix einstellbar (Standard: 90 Tage). Ein scheduled task räumt ältere Einträge automatisch auf, inklusive der zugehörigen Snapshots.
Ein-Klick-Revert
Aus dem Audit-Log direkt zurückrollen — der komplette Produktzustand vor der Operation wird wiederhergestellt. Translations werden mit zurückgesetzt. Der Revert selbst erzeugt einen neuen Audit-Log-Eintrag, sodass die Historie lückenlos bleibt.
Edit-Lock mit Heartbeat
Wenn zwei Pfleger gleichzeitig dasselbe Produkt öffnen, würde ohne Schutz der letzte Speichern-Vorgang gewinnen und Änderungen des anderen Users überschreiben. Der Edit-Lock verhindert das:
- Beim Öffnen eines Produkt-Details wird ein Lock mit User-ID und Timestamp gesetzt.
- Ein Heartbeat erneuert den Lock alle 30 Sekunden, solange das Tab offen ist.
- Ein anderer User, der dasselbe Produkt öffnet, sieht einen Hinweis: „Wird bearbeitet von {Name} seit {Zeit}“ und kann nur lesend zugreifen.
- Bleibt der Heartbeat 2 Minuten aus (Tab geschlossen, Browser-Crash), wird der Lock automatisch freigegeben.
- Admins mit
pim.lock_break-Permission können einen Lock manuell brechen.
Produkt-Vorschau (inaktive Artikel)
Inaktive Produkte sind im Storefront unsichtbar — was die Vorschau im Browser zur Qual macht. Mit dem Preview-Modul kann ein inaktiver Artikel temporär aktiviert werden, ohne dass er regulär verkaufsbereit ist:
- Im Produkt-Detail Button Vorschau anzeigen mit konfigurierbarer Dauer (15s / 30s / 60s / 120s).
- Aktivierung mit temporärer Sichtbarkeit „Nur per Direktlink“ (Level 10) — nicht in Listings, nicht in Suche.
- Direkt-URL wird in einem neuen Tab geöffnet.
- Nach Ablauf wird die Sichtbarkeit automatisch entfernt und das Produkt wieder deaktiviert.
- Auch bei Navigation oder Tab-Schließung wird sauber aufgeräumt.
Approval-Workflow
Optionales Feature: Produkte können nach Anlage oder Import auf pending
gesetzt werden und müssen vor der Aktivierung im Shop von einem Benutzer mit
Approval-Recht freigegeben werden. Sinnvoll bei:
- Mehrstufigen Pflegeprozessen (Texter → Lektor → Freigabe)
- Bulk-Imports von Lieferanten-CSVs
- Externen Pflegern mit eingeschränkten Rechten
Permissions
Das Berechtigungssystem ist feingranular und lehnt sich an die Shopware-ACL an. Jede Bulk-Aktion, jeder Modus von CSV, jedes Löschen ist als eigene Permission freischaltbar:
| Permission | Wirkung |
|---|---|
pim.read | Listing und Detail anschauen |
pim.write | Einzelne Felder ändern |
pim.bulk_edit | Mehrfachbearbeitung ausführen |
pim.csv_export | CSV/TSV/XML exportieren |
pim.csv_import | CSV/TSV/XML importieren |
pim.variants | Varianten generieren/löschen |
pim.delete | Produkte löschen |
pim.duplicate | Produkte duplizieren (inkl. Varianten, Bilder) |
pim.snapshot_revert | Snapshot wiederherstellen |
pim.approval | Produkte freigeben |
pim.preview | Inaktive Artikel temporär aktivieren |
pim.ai_use | KI-Textgenerierung pro Feld nutzen |
pim.deepl_use | Einzel-DeepL-Übersetzung pro Produkt |
pim.deepl_bulk | Massen-DeepL über das Dashboard |
pim.lock_break | Edit-Lock anderer User brechen |
pim.config | Konfigmatrix bearbeiten |
pim.admin | Superadmin — alle Gates umgehen |
Konfiguration#
Die zentrale Konfigmatrix steuert, welche Felder sichtbar sind, welche Patterns als Default gelten und wie sich das Listing verhält. Erreichbar über PIM → Konfiguration.
Feldmatrix
Pro Feld vier Toggles:
| Toggle | Wirkung |
|---|---|
| Listing | Feld erscheint als Spalte im Listing (per-User ein-/ausblendbar) |
| Detail | Feld ist im Produkt-Detail editierbar |
| Bulk | Feld ist im Mehrfachbearbeiten-Modal verfügbar |
| CSV | Feld ist im CSV-Export auswählbar |
Custom Fields werden automatisch erkannt und in die Matrix aufgenommen, sobald sie in Shopware angelegt sind. Bei Bedarf Custom Fields neu scannen klicken.
Variantenmuster
Pro Shop kannst du Default-Patterns für Artikelnummer und Variantennamen hinterlegen. Diese gelten in allen Variantenoperationen — pro Produkt überschreibbar.
# Default-Pattern für Artikelnummern
{number}-{option1}-{option2}
# Default-Pattern für Variantenname
{parentName} · {option1} {option2}
Konfig-Suche (Strg+K)
Die Konfiguration kann groß werden — gerade bei vielen Custom Fields. Mit Strg+K (oder ⌘+K auf Mac) öffnet sich eine Schnellsuche:
- Sucht über alle Tabs der Konfigseite
- Match-Counter pro Tab
- Auto-Scroll zum ersten Treffer
- Mit ↑/↓ zwischen Treffern navigieren
- Enter zum Übernehmen, Esc zum Abbrechen
Pro-User-Persistenz
Folgende Einstellungen werden pro Admin-User gespeichert, nicht global:
- Spaltenkonfiguration im Listing (welche Spalten sichtbar, in welcher Reihenfolge)
- Page-Size
- Filter-Presets
- Sortierung
Jeder Pfleger hat damit seine eigene Sicht — ohne sich gegenseitig die Einstellungen zu überschreiben.
Tastatur-Shortcuts#
| Shortcut | Kontext | Aktion |
|---|---|---|
| Strg+K / ⌘+K | Konfiguration | Konfig-Suche öffnen |
| ↑ / ↓ | Konfig-Suche | Zwischen Treffern navigieren |
| Enter | Konfig-Suche, Filter-Modal | Übernehmen / Anwenden |
| Esc | Alle Modals | Abbrechen / Schließen |
| Strg+A | Listing | Alle Zeilen auf aktueller Seite auswählen |
| Strg+Shift+A | Listing | Alle Treffer (über alle Seiten) auswählen |
| Strg+S | Detail / Bulk-Modal | Speichern (überschreibt Browser-Default) |
| Strg+F | Listing | Filter-Panel öffnen |
| F2 | Listing-Zelle | Inline-Edit starten (sofern Feld editable) |
Variablen für Patterns#
Patterns für Artikelnummer und Variantenname akzeptieren Variablen in geschweiften Klammern. Sie werden zum Zeitpunkt der Generierung deterministisch ersetzt.
| Variable | Wert | Beispiel |
|---|---|---|
{number} |
productNumber des Stammartikels | SW-1001 |
{parentName} |
Name des Stammartikels | Sneaker Pro |
{option1} … {optionN} |
Wert der jeweiligen Option (in Klick-Reihenfolge) | rot, M |
{group1} … {groupN} |
Name der Property-Gruppe | Farbe, Größe |
{counter} |
Laufende Nummer ab 1, je Generation | 1, 2, … |
{counter:3} |
Counter mit Zero-Padding (Länge in Doppelpunkt) | 001, 002, … |
{date} |
Tagesdatum (ISO) | 2026-05-11 |
{ean} |
EAN des Stammartikels (sofern gesetzt) | 4006381333931 |
{manufacturer} |
Hersteller-Name | Adidas |
Beispiele
Klassische Variantennummer mit Optionen
# Pattern
{number}-{option1}-{option2}
# Ergebnis (Farbe=rot, Größe=M)
SW-1001-rot-M
Sortierbare Variantennummer mit Counter
# Pattern
{number}-V{counter:3}
# Ergebnis (3 Varianten)
SW-1001-V001
SW-1001-V002
SW-1001-V003
Lesbarer Variantenname
# Pattern
{parentName} ({group1}: {option1}, {group2}: {option2})
# Ergebnis
Sneaker Pro (Farbe: rot, Größe: M)
{option1} verweist immer
auf die erste gewählte Eigenschaft — also die, die du im VarGen-Modal
zuerst angeklickt hast. Wenn du Größe zuerst klickst und dann
Farbe, ist {option1} die Größe. Per Drag & Drop in
der Optionsliste umsortierbar.
CSV-Spalten-Referenz#
Die folgenden Spaltennamen werden vom Import erkannt. Beim Export werden sie nach derselben Konvention erzeugt.
Stammdaten (sprachneutral)
| Spalte | Typ | Hinweis |
|---|---|---|
productNumber | String | Match-Key, eindeutig |
active | Boolean | Im Shop sichtbar |
parentNumber | String | productNumber des Parents (für Varianten-Import) |
manufacturerNumber | String | Hersteller-Artikelnummer |
ean | String | EAN/GTIN |
manufacturer | String | Herstellername (gemappt per Name) |
taxRate | Number | z.B. 19 oder 7 |
stock | Number | Lagerbestand |
availableStock | Number | Verfügbarer Bestand (read-only beim Import) |
price_gross | Number | Brutto-Preis |
price_net | Number | Netto-Preis |
listPrice_gross | Number | Listenpreis brutto |
weight | Number | in kg |
length / width / height | Number | in mm |
availableFrom | Date | ISO oder dd.mm.yyyy |
availableUntil | Date | ISO oder dd.mm.yyyy |
categories | Array | Pipe-getrennte Kategorienamen |
tags | Array | Pipe-getrennt |
properties | Array | Format Gruppe:Wert|Gruppe:Wert |
visibility | Array | Verkaufskanal-Namen, pipe-getrennt |
Translations
Spalten beginnen mit trans_ und enden mit __<lang>.
| Spalte | Sprache | Mappt auf |
|---|---|---|
trans_name__de_DE | Deutsch | product.translation.name |
trans_name__en_GB | Englisch (UK) | product.translation.name |
trans_description__de_DE | Deutsch | product.translation.description |
trans_metaTitle__<lang> | — | SEO Meta-Title |
trans_metaDescription__<lang> | — | SEO Meta-Description |
trans_keywords__<lang> | — | SEO Keywords |
trans_packUnit__<lang> | — | Verpackungseinheit |
Custom Fields
Spalten beginnen mit cf_.
| Spalte | Wirkung |
|---|---|
cf_myField | Sprachneutrales Custom Field (im customFields-JSON) |
cf_myField__de_DE | Translatable Custom Field, deutsche Version |
cf_myField__en_GB | Translatable Custom Field, englische Version |
de_DE, en_GB, fr_FR, nl_NL.
Bindestriche und Lowercase werden nicht akzeptiert.
Changelog#
Die wichtigsten Änderungen seit dem ersten Store-Release.
- Bilder · Drag & Drop: Sortieren funktioniert wieder zuverlässig — auch mit Option „Cover zuerst“
- Bilder · Cover-Lock: Coverbild ist gegen versehentliches Verschieben gesperrt
- Bilder · atomare Speicherung: Batch-Save statt sequenzielle PATCH-Calls, mit Fehler-Notification bei Speicher-Problemen
- Cross-Selling · Auto-Reparatur: Bestehende Gruppen werden mit korrekter
productVersionIdrepariert — bisher unsichtbare Gruppen erscheinen im Storefront
- Mehrfachbearbeitung: Cross-Selling-Gruppen massenweise zuweisen (Produktstream oder Produktliste)
- Mehrfachbearbeitung: Varianten-Vorauswahl nach Generierung — Hauptvariante automatisch setzen, Hauptartikel optional verbergen
- Konfigmatrix: Globale Defaults für Varianten-Vorauswahl (Strategie: erste Variante oder niedrigste Artikelnummer)
- Cross-Selling:
productVersionIdwird korrekt gesetzt — Gruppen sind jetzt im Storefront sichtbar - CSV-Import/Export: Komplett überarbeitet — Batch-POST-API statt sequenzielle Aufrufe, dramatisch schneller
- CSV-Export: Custom Fields pro Sprache (
cf_<name>__<langCode>), Hauptkategorie-Namen mit Tree-Auflösung - Filter: notContains funktioniert mit Eltern-Produkten, AND-Combiner splittet Positive/Negative korrekt
- Snapshots: Erstellung gebatched (50er-Chunks via
POST /api/search/product) - UI: Varianten-Generator-Modal mit Chip-Layout und Höhenbegrenzung
- UI: Listing-Pagination mit getrennten Bereich-/Total-Anzeigen
- Code-Bereinigung: 73 % weniger Noise-Kommentare, -54 KB im Bundle
- Erstveröffentlichung im Shopware Community Store
- Kompatibel mit Shopware 6.5, 6.6, 6.7
- Vollständige Pflegeplattform: Listing, Mehrfachbearbeitung, Varianten, CSV-Import/Export, Translations, Audit-Log, Konfigmatrix
- Optionale KI- und DeepL-Integration
- Über 2.690 Übersetzungs-Strings DE/EN
FAQ & Troubleshooting#
Mein CSV-Import lädt nicht — was tun?
- Kodierung prüfen: Das PIM erwartet UTF-8 (mit oder ohne BOM).
- Trennzeichen prüfen: Semikolon (
;) oder Komma (,) — wird automatisch erkannt, aber muss konsistent sein. - Pflichtfeld
productNumbermuss vorhanden sein. - PHP-Memory-Limit auf min. 512 MB setzen für Imports > 5.000 Zeilen.
- PHP-Execution-Time auf 300+ Sekunden setzen oder Cronjob nutzen.
Die Snapshot-Wiederherstellung wirft einen Fehler
Möglicher Grund: Das Produkt wurde zwischen dem ursprünglichen Snapshot und dem Revert manuell gelöscht oder verändert. Das PIM zeigt im Detail-Dialog des Audit-Logs an, welche Zeilen nicht zurückgerollt werden konnten, und führt den Rest dennoch aus.
Custom Fields tauchen nicht in der Konfigmatrix auf
In der Konfigseite auf Custom Fields neu scannen klicken. Wenn das nicht hilft: Shopware-Cache löschen und Seite neu laden.
Wie kann ich Translations für einen ganz neuen Custom Field nachträglich aktivieren?
- Custom Field in Shopware bearbeiten und translatable aktivieren.
- In der PIM-Konfig Custom Fields neu scannen.
- Bestehende Werte werden als Default-Sprache (Shop-Default) übernommen — andere Sprachen müssen befüllt werden.
Bulk-Edit dauert sehr lange
Bei mehreren tausend Produkten: kein Problem grundsätzlich, aber abhängig vom Server. Empfehlungen:
- Auf produktivem Server: keine Bulk-Operationen während Stoßzeiten.
- PHP-OPcache aktivieren.
- MySQL
innodb_buffer_pool_size> 1 GB. - Wenn möglich: SSD-Storage.
Kann ich das PIM parallel zu anderen PIM-Plugins betreiben?
Technisch ja — das PIM patcht keine Core-Files und schreibt nur in seine eigenen Tabellen sowie die Standard-Shopware-Produkttabellen. Konflikte kann es geben, wenn ein anderes Plugin dieselbe Field-Definition überschreibt. Bei Bedarf Support kontaktieren.
Wie häufig erscheinen Updates?
Patch-Releases (1.0.x) alle 2–4 Wochen, Minor-Releases (1.x.0) bei größeren Features. Major-Releases sind an Shopware-Versionen gekoppelt — eine Plugin-Version pro Shopware-Major.
Architektur#
Für Entwickler und technisch interessierte Admins — ein kurzer Blick unter die Haube.
Plugin-Struktur
StawPim/
├── composer.json
├── src/
│ ├── StawPim.php # Plugin-Bootstrap, install/activate/update Hooks
│ ├── Controller/ # Admin-API-Routes (/api/_action/staw-pim/...)
│ ├── Service/
│ │ ├── BulkEditService.php
│ │ ├── SnapshotService.php
│ │ ├── CsvImportService.php
│ │ ├── CsvExportService.php
│ │ ├── VariantGenerator.php
│ │ ├── TranslationService.php
│ │ └── AuditLogService.php
│ ├── Migration/ # DB-Migrationen
│ └── Resources/
│ ├── app/administration/ # Vue 3 Admin-Components
│ ├── config/services.xml
│ ├── snippet/de-DE.json
│ └── snippet/en-GB.json
└── tests/ # PHPUnit + Vitest
Datenbanktabellen
- staw_pim_snapshot
- Vorher-Zustände aller revertierbaren Operationen (JSON-Spalte mit Produkt-Daten)
- staw_pim_audit
- Audit-Log-Einträge mit User, Timestamp, Operation, Diff (FK auf snapshot)
- staw_pim_preset
- Filter-Presets pro User
- staw_pim_config
- Feldmatrix-Konfiguration und Default-Patterns pro Shop
- staw_pim_user_settings
- Spaltenkonfiguration, Page-Size und User-Präferenzen pro Admin-User
Admin-API-Endpoints
Alle Endpoints sind unter /api/_action/staw-pim/* erreichbar und benötigen ein gültiges OAuth-Token (wie alle Shopware-Admin-APIs).
| Endpoint | Methode | Wirkung |
|---|---|---|
/products/list | POST | Erweiterte Listenabfrage mit Variantenfilter |
/bulk-edit | POST | Bulk-Operation ausführen, Snapshot anlegen |
/snapshot/revert/{id} | POST | Snapshot wiederherstellen |
/csv/export | POST | CSV mit aktuellen Filter-Kriterien generieren |
/csv/import | POST | Hochgeladene CSV verarbeiten (Batch-Sync) |
/variants/generate | POST | Varianten anhand Pattern + Optionen erzeugen |
/variants/delete | POST | Varianten löschen (Modus „Sicher“/„Alle“) |
/audit/list | GET | Paginierte Audit-Log-Einträge |
/config/scan-cf | POST | Custom Fields neu scannen |
Frontend-Stack
- Vue 3 mit Composition API (für Shopware 6.6+)
- Components nach Shopware-Komponenten-Konvention (
sw-*) - Eigene Components mit Prefix
staw-pim-* - Vite-Build für Production (
.vite/manifest.json) - Snippet-System für i18n — keine hartkodierten Strings
Sauberer Code
- DI-Container-Services, keine globalen Statics
- DAL-konformer Datenzugriff (keine direkten SQL-Queries in Business-Logik)
- Keine Patches an Core-Files
- Symfony Messenger für Async-Tasks (große CSV-Imports)
- PHPUnit-Tests für alle Services, Vitest für Vue-Components