Der Shopware 6 Kunden-Import ist eine der anspruchsvollsten Aufgaben beim Umzug von Shopware 5 zu Shopware 6. Wer seine bestehenden Kundendaten sauber migrieren möchte, steht vor zahlreichen Herausforderungen: Von der korrekten Zuordnung der Felder über das Mapping von UUIDs bis hin zur Anpassung von Passwort-Hashes und Länder-Codes. In diesem ausführlichen Tutorial zeigen wir dir Schritt für Schritt, wie du deine Kunden erfolgreich von Shopware 5 nach Shopware 6 importierst – inklusive aller Stolpersteine, Mappings und praktischer Lösungen für typische Fehler beim Shopware 6 Kunden-Import.
Vorbemerkung: Theoretisch können Kunden und Bestellungen über das Migrationsmodul importiert werden. In der Praxis packt einen aber manchmal das Verlangen lieber per CSV-Datei (nur) die Kunden zu importieren. Hat es dich auch gepackt? Dann viel Erfolg!
Übersicht: Shopware 6 Kunden-Import aus Shopware 5
- 1. CSV Export aus Shopware 5
- 2. Korrektes Öffnen in LibreOffice
- 3. Optionales Löschen von Marktplatz-Kunden
- 4. Standardprofil in Shopware 6 kopieren
- 5. Vorbereitende Arbeiten
- 6. Feld für Passwort-Mapping einbinden
- 7. billing_department mappen
- 8. Mapping Felder-Namen anpassen
- 9. Spalte billing_countryID & shipping_countryID austauschen
- 10. billing_stateID zuordnen
- 11. ustid mappen
- 12. shipping_department mappen
- 13. paymentID mappen
- 14. accountmode mappen und anpassen
- 15. Kundengruppen mappen
- 16. Sprache anlegen / mappen
- 17. subshopID mappen
- 18. account_type Werte in CSV-Datei ergänzen
- 19. id Spalte anlegen
- 20. Der Umgang mit first_name und last_name
- 21. Der Umgang mit billing_id & shipping_id
- 22. Was ist mit billing_title & shipping_title?
- 23. Passwörter nachträglich importieren (wenn CSV-Import fehlschlägt)
- Quellen und weiterführende Links
1. CSV Export aus Shopware 5
Der erste Schritt beim Shopware 6 Kunden-Import ist der saubere Export deiner Kundendaten aus Shopware 5. Ganz einfach: Wir exportieren alle Kunden per CSV-Datei und nutzen dabei das Profil customers_default. Am besten speicherst du die Datei in einem Ordner einmal so wie sie ist und lässt sie unberührt. Mach dir dann eine Kopie der unberührten Datei, um diese dann weiter zu bearbeiten.
Dieser Ansatz hat einen entscheidenden Vorteil: Falls beim Bearbeiten der CSV etwas schiefgeht, hast du immer noch das Original als Backup. Glaub mir, du wirst dankbar dafür sein, wenn du bei Schritt 15 merkst, dass du doch noch einmal von vorne anfangen musst.
Shopware 6 Kunden-Import – zurück zur Übersicht
2. Korrektes Öffnen in LibreOffice
Die richtige Öffnung der CSV-Datei ist entscheidend für einen erfolgreichen Shopware 6 Kunden-Import. Beim Öffnen in LibreOffice musst du folgende Einstellungen vornehmen:
- Semikolon als Trenner verwenden
- Anführungszeichen als Zeichentrenner nutzen
Diese Einstellungen sorgen dafür, dass die Daten korrekt in Spalten aufgeteilt werden und keine Formatierungsfehler entstehen. Excel kann hier manchmal Probleme machen, deshalb empfehlen wir LibreOffice für die Bearbeitung von CSV-Dateien beim Shopware 6 Kunden-Import.
Shopware 6 Kunden-Import – zurück zur Übersicht
3. Optionales Löschen von Marktplatz-Kunden
Es kann sein, dass du sehr viele Kunden im System hast, die über Marktplätze eingekauft haben. Diese könntest du eventuell noch in der CSV-Datei bereinigen, bevor du mit dem eigentlichen Shopware 6 Kunden-Import beginnst.
Marktplatz-Kunden haben oft unvollständige Daten oder Dummy-Adressen, die du für deinen neuen Shopware 6 Shop möglicherweise gar nicht benötigst. Eine Bereinigung an dieser Stelle spart dir später Zeit und Speicherplatz in deiner neuen Datenbank.
Shopware 6 Kunden-Import – zurück zur Übersicht
4. Standardprofil in Shopware 6 kopieren
Für einen strukturierten Shopware 6 Kunden-Import benötigst du zunächst ein passendes Import-Profil. Klicke im Bereich Einstellungen → Import/Export auf den Reiter Profile und dann beim Standardprofil Kunde auf Duplizieren.
Du kannst dein neues Profil zum Beispiel „Standardprofil Kunde – aus Shopware 5″ nennen. So hast du später eine klare Übersicht, welches Profil für welchen Zweck gedacht ist. Gerade wenn du mehrere Import-Vorgänge durchführst oder später noch Anpassungen vornehmen möchtest, zahlt sich diese Benennung aus.
Shopware 6 Kunden-Import – zurück zur Übersicht
5. Vorbereitende Arbeiten
Bevor du mit dem eigentlichen Shopware 6 Kunden-Import startest, musst du einige wichtige UUIDs notieren. Diese eindeutigen Identifikatoren sind in Shopware 6 essenziell für die korrekte Zuordnung von Daten.
5.1 UUIDs der Anreden notieren
Die Anreden benötigen folgende UUIDs in Shopware 6:
- Herr: 4d89ae789a2f4016a4e2c2eb68688408
- Frau: dcb2763c917a4fc3b65469da6d8ec1c7
- k.A.: e1d7a16295694be2a0bf8f08bcdce73e
5.2 Kundengruppen (anlegen und) UUIDs notieren
Die Standard-Kundengruppe hat folgende UUID:
- Standard: cfbd5018d38d41d8adca10d94fc8bdd6
5.3 Prüfen ob bcrypt verwendet wird
Das Feld encoder aus deiner SW5-CSV kannst du beim Shopware 6 Kunden-Import ignorieren, sofern du die Passwörter direkt als bcrypt-Hash ins Feld password importierst.
Nur wenn du andere (ältere) Algorithmen wie MD5 importieren möchtest, musst du den Wert aus encoder ins Feld legacyEncoder übernehmen und den Passwort-Hash ins Feld legacyPassword schreiben.
5.4 Wert in salutation prüfen
Prüfe, ob bei salutation in SW5 mr und ms als Wert verwendet wurden. Wenn nicht, sollten „Herr“ und „Frau“ entsprechend ersetzt werden, damit der Shopware 6 Kunden-Import die Anreden korrekt zuordnen kann.
Shopware 6 Kunden-Import – zurück zur Übersicht
6. Feld für Passwort-Mapping einbinden
Im Standard Import/Export-Profil ist das Passwort-Feld nicht inkludiert. Für unseren Shopware 6 Kunden-Import aus der SW5 CSV brauchen wir hierfür eine Zuordnung. Sind die Passwörter aus SW5 mit bcrypt verschlüsselt, kann das Feld direkt gemappt werden.
Du musst im Import-Profil ein neues Mapping für das Feld password anlegen und es dem entsprechenden Datenbankfeld zuordnen. So stellst du sicher, dass deine Kunden sich nach dem Import mit ihren gewohnten Passwörtern anmelden können.
Shopware 6 Kunden-Import – zurück zur Übersicht
7. billing_department mappen
Das Feld wird gemappt mit: defaultBillingAddress.department – da es im Standard nicht im Profil drin ist, muss ein neues Mapping hierfür beim Shopware 6 Kunden-Import angelegt werden.
Die Abteilungsangabe ist besonders für B2B-Shops relevant, wo Kunden oft verschiedene Abteilungen innerhalb eines Unternehmens repräsentieren.
Shopware 6 Kunden-Import – zurück zur Übersicht
8. Mapping Felder-Namen anpassen
Für einen erfolgreichen Shopware 6 Kunden-Import müssen die CSV-Spaltennamen angepasst werden. Folgende Umbennungen sind notwendig:
billing_country→billing_countryIDbilling_first_name→billing_firstnamebilling_last_name→billing_lastnamebilling_phone_number→phonecustomer_group→customergroupfirst_name→billing_firstnamelast_name→billing_lastnameguest→accountmodepayment_method→paymentIDshipping_first_name→shipping_firstnameshipping_last_name→shipping_lastnamesales_channel→subshopIDshipping_country→shipping_countryID
Diese Anpassungen sind essentiell, damit das Import-Profil die Felder korrekt zuordnen kann.
Shopware 6 Kunden-Import – zurück zur Übersicht
9. Spalte billing_countryID & shipping_countryID austauschen
Du ersetzt die numerische Länder-ID aus SW5 entweder durch den ISO-Code (z.B. DE) oder – besser noch – durch die UUID des Landes aus Shopware 6. So stellst du beim Shopware 6 Kunden-Import sicher, dass die Länderangaben korrekt zugeordnet werden.
Die UUIDs der Länder findest du in den Einstellungen unter Länder. Klicke auf das jeweilige Land und schaue in der URL nach der UUID. Für Deutschland (DE) kannst du auch direkt den ISO-Code verwenden, was die Arbeit erheblich vereinfacht.
Shopware 6 Kunden-Import – zurück zur Übersicht
10. billing_stateID zuordnen
Hier müssen wieder die UUIDs der Bundesländer aus der jeweiligen Shopware 6 Installation herausgefunden werden. Wer viele Länder und deren Bundesländer hat, macht beim Shopware 6 Kunden-Import am besten einen Export.
Wer weniger hat, kann auf das Bundesland klicken und die UUID in der Adresszeile des Browsers ablesen. Für österreichische oder schweizer Shops gilt dasselbe Prinzip – die UUIDs müssen für jede Installation individuell ermittelt werden.
Shopware 6 Kunden-Import – zurück zur Übersicht
11. ustid mappen
Hier benötigen wir ein neues Mapping für den Shopware 6 Kunden-Import. Der CSV-Name aus der SW5-Export-Datei ist ustid und der Datenbank-Eintrag auf der linken Seite dann vatIds.
Die Umsatzsteuer-Identifikationsnummer ist besonders für B2B-Kunden wichtig, da sie für innergemeinschaftliche Lieferungen benötigt wird.
Shopware 6 Kunden-Import – zurück zur Übersicht
12. shipping_department mappen
Das Feld wird mit dem Datenbank-Eintrag defaultShippingAddress.department gemappt. Um das Feld beim Shopware 6 Kunden-Import auswählen zu können, muss das Feld defaultShippingAddress vorher angeklickt werden.
Auch hier gilt: Die Abteilungsangabe ist vor allem für Geschäftskunden relevant, die möglicherweise unterschiedliche Liefer- und Rechnungsadressen mit verschiedenen Abteilungen haben.
Shopware 6 Kunden-Import – zurück zur Übersicht
13. paymentID mappen
Zunächst einmal nennen wir in der linken Spalte payment_method in paymentID um, so wie es in der SW5-CSV-Datei steht. Dann tauschen wir in der rechten Zeile defaultPaymentMethod.translations.DEFAULT.name aus, indem wir zuerst defaultPaymentMethod auswählen und anschließend defaultPaymentMethod.technicalName, weil die in der Datei besser zu erkennen sind.
Die Alternative wäre die UUID, die völlig nichtssagend und ewig lang ist. Für den Shopware 6 Kunden-Import sind folgende technische Namen relevant:
Standard-Zahlarten:
- PayPal (vorinstalliert): swag_paypal_paypal
- Lastschrift: payment_debitpayment
- Rechnung: payment_invoicepayment
- Vorkasse: payment_prepayment
Mollie Zahlarten:
- Bancontact: payment_MolliePaymentsApp_mollie_bancontact
- iDEAL: payment_MolliePaymentsApp_mollie_ideal
- Klarna: payment_MolliePaymentsApp_mollie_klarna
- Kreditkarte: payment_MolliePaymentsApp_mollie_creditcard
- Pay Later: payment_MolliePaymentsApp_mollie_klarnapaylater
- Pay now: payment_MolliePaymentsApp_mollie_klarnapaynow
- PayPal: payment_MolliePaymentsApp_mollie_paypal
- Ratenkauf: payment_MolliePaymentsApp_mollie_klarnasliceit
- SOFORT: payment_MolliePaymentsApp_mollie_sofort
Shopware 6 Kunden-Import – zurück zur Übersicht
14. accountmode mappen und anpassen
Das Feld accountmode aus Shopware 5 gibt an, ob ein Kundenkonto ein normales Konto oder ein Schnellbesteller-/Gastkonto ist. In Shopware 5 wurde damit unterschieden, ob ein Kunde sich registriert hat (accountmode = 0) oder als Gast bestellt hat (accountmode = 1).
In Shopware 6 gibt es dieses Feld in dieser Form nicht mehr. Stattdessen wird die Information, ob ein Kunde ein Gast ist, im Feld guest (true/false) gespeichert. Für den Shopware 6 Kunden-Import bedeutet das:
- Wenn
accountmode = 1in Shopware 5, dann setze den Wert in der CSV auftrue - Wenn
accountmode = 0, dann setze den Wert auffalse
Mappe dann dein Feld so: accountmode → guest
Das Feld accountmode selbst wird in Shopware 6 nicht mehr benötigt und kann nach dem Mapping ignoriert werden.
Shopware 6 Kunden-Import – zurück zur Übersicht
15. Kundengruppen mappen
Die Zuordnung von Kundengruppen ist ein wichtiger Schritt beim Shopware 6 Kunden-Import, besonders wenn du unterschiedliche Preisgruppen oder B2B-Strukturen abbilden möchtest.
15.1 (Optional) fehlende Kundengruppen anlegen
Lege zunächst alle Kundengruppen, die du in SW5 hattest, auch in SW6 an. Falls du nie irgendwelche zusätzlichen Kundengruppen angelegt hast, dann notiere dir nur die UUID der Standard-Kundengruppe aus SW6.
Rufe dafür die Kundengruppen in den Einstellungen auf, klicke auf die Gruppe und schaue oben am Ende der URL nach der UUID.
15.2 customer_group umbenennen
Passe den CSV-Namen so an, dass er identisch ist mit der Spalte aus der Shopware 5 Export-Datei. Da steht: customergroup
15.3 Ändere group.translations.DEFAULT.name
Klicke dafür zuerst auf group und dann group.id. So verwendest du für den Shopware 6 Kunden-Import die eindeutige UUID statt des Namens.
Shopware 6 Kunden-Import – zurück zur Übersicht
16. Sprache anlegen / mappen
Die korrekte Sprachzuordnung ist essentiell, damit Kunden nach dem Shopware 6 Kunden-Import E-Mails in der richtigen Sprache erhalten und der Shop korrekt angezeigt wird.
16.1 Sprachen anlegen
Falls du in SW5 mehr als eine Sprache hattest, legst du als erstes alle Sprachen an, die noch fehlen.
16.2 UUIDs der Sprachen notieren
Klicke auf die Sprache und schaue in die URL – die UUID steht wie immer ganz am Ende. Damit wir UUIDs importieren können, müssen wir das Mapping von language.local.code ändern in language.id
16.3 CSV-Datei bearbeiten
Die Werte in der CSV-Datei werden dann mit den UUIDs der jeweiligen Sprachen ersetzt. So stellst du beim Shopware 6 Kunden-Import sicher, dass jedem Kunden die richtige Sprache zugeordnet wird.
Shopware 6 Kunden-Import – zurück zur Übersicht
17. subshopID mappen
Das Feld subshopID aus Shopware 5 gibt an, zu welchem Subshop ein Kunde gehört. In Shopware 6 gibt es das Konzept der Subshops nicht mehr – stattdessen wird jeder Hauptshop und Subshop als eigener Verkaufskanal (Sales Channel) angelegt.
17.1 CSV-Mapping-Namen ändern
Das CSV-Mapping wird von sales_channel umbenannt in subshopID
17.2 ID statt Name bei Datenbank-Eintrag
Um eine eindeutige Zuordnung beim Shopware 6 Kunden-Import zu machen, tausche ich salesChannel.translations.DEFAULT.name aus gegen salesChannelId
17.3 subshopIDs austauschen gegen Sales Channel UUIDs
Sofern du nur einen Subshop in SW5 hast, hole dir die UUID für den Sales Channel und ersetze die 1 mit der UUID des Standard Storefront Sales Channels.
Hast du weitere Subshops in SW5, sind zusätzliche Sales Channels anzulegen, um die übrigen subshopID-Werte gegen Sales Channel UUIDs auszutauschen.
Damit hätten wir schon mal alle Felder aus SW5 gemappt. Jetzt muss noch geprüft werden, ob es noch Felder aus Shopware 6 gibt, denen noch keine Werte zugeordnet werden.
Shopware 6 Kunden-Import – zurück zur Übersicht
18. account_type Werte in CSV-Datei ergänzen
Um beim Shopware 6 Kunden-Import das Feld account_type sinnvoll zu befüllen, kannst du dich an bestimmten Kriterien orientieren, da es in Shopware 5 kein direktes Pendant gibt. In Shopware 6 unterscheidet das Feld account_type zwischen „private“ (Privatkunde) und „business“ (Geschäftskunde/B2B).
Standardmäßig behandelt Shopware 6 alle Kunden als Privatkunden, wenn das Feld leer bleibt.
So gehst du vor:
Du prüfst beim Datenexport oder bei der Aufbereitung deiner CSV, ob beim Kunden entweder ein Firmenname (z.B. das Feld company) oder eine Umsatzsteuer-ID (ustid/vatId) hinterlegt ist. Ist eines dieser Felder befüllt, kannst du davon ausgehen, dass es sich um einen Geschäftskunden handelt. In diesem Fall setzt du für diese Zeile in deiner Importdatei das Feld account_type auf „business“.
Ist beides leer, bleibt der Wert entweder leer oder du setzt ihn explizit auf „private“.
Beispiel für die Logik:
- Wenn
companyodervatIdbefüllt →account_type = "business" - Wenn beide leer →
account_type = "private"(oder leer lassen, Shopware 6 setzt dann automatisch „private“)
Du kannst das Feld account_type beim Shopware 6 Kunden-Import automatisch anhand der Felder company und/oder vatId setzen. So werden Privat- und Geschäftskunden korrekt unterschieden, ohne dass es dieses Feld in Shopware 5 gab.
Shopware 6 Kunden-Import – zurück zur Übersicht
19. id Spalte anlegen
Für den Shopware 6 Kunden-Import muss die Spalte id in deiner CSV-Datei vorhanden sein, da das Importprofil diese erwartet.
Wenn du neue Kunden anlegst, lässt du die Zellen in der Spalte id einfach leer. Shopware 6 generiert dann beim Import automatisch für jeden Kunden eine eindeutige UUID.
Nur wenn du bestehende Kunden aktualisieren möchtest, musst du in diesem Feld die jeweilige Shopware 6-UUID eintragen.
Die Spalte id muss nicht die erste Spalte in deiner CSV sein, sie muss lediglich in der Kopfzeile (also als Spaltenüberschrift in der ersten Zeile) vorhanden sein.
Zusammenfassung:
- Die Spalte
idmuss in der CSV enthalten sein - Beim Anlegen neuer Kunden bleibt sie leer – Shopware 6 vergibt die IDs selbst
- Die Reihenfolge der Spalten ist egal, solange die Überschriften stimmen
Shopware 6 Kunden-Import – zurück zur Übersicht
20. Der Umgang mit first_name und last_name
Du kannst das Feld billing_firstname aus Shopware 5 direkt auf das allgemeine Kundenfeld firstName in Shopware 6 mappen. Das ist sinnvoll beim Shopware 6 Kunden-Import, wenn du möchtest, dass der Vorname der Rechnungsadresse auch als Haupt-Vorname des Kunden in Shopware 6 verwendet wird.
Diese Methode ist besonders praktisch, weil Shopware 5 kein eigenes Kunden-Vorname-Feld kennt.
Und jetzt stell dir das Ganze noch einmal mit last_name vor.
Wie in Punkt 8 erwähnt sind bei den Zuweisungen die CSV-Namen so anzupassen:
first_name→billing_firstnamelast_name→billing_lastname
Shopware 6 Kunden-Import – zurück zur Übersicht
21. Der Umgang mit billing_id & shipping_id
Das Feld billing_id in Shopware 6 (bzw. in deiner Import-/Export-CSV) steht für die UUID der Standard-Rechnungsadresse eines Kunden. In Shopware 6 heißt das entsprechende Feld defaultBillingAddressId.
Was bedeutet das für deinen Shopware 6 Kunden-Import?
Beim Anlegen neuer Kunden: Füge eine zusätzliche Spalte mit billing_id ein und lass den Inhalt leer. Shopware 6 generiert beim Import automatisch eine neue UUID für die Rechnungsadresse und verknüpft sie mit dem Kunden.
Beim Aktualisieren bestehender Kunden: Muss das Feld billing_id mit der bestehenden UUID aus Shopware 6 befüllt sein, damit die Zuordnung zur richtigen Rechnungsadresse erhalten bleibt.
Selbiges gilt für shipping_id beim Shopware 6 Kunden-Import.
Shopware 6 Kunden-Import – zurück zur Übersicht
22. Was ist mit billing_title & shipping_title?
Du musst das Feld billing_title nicht zwingend in deine CSV aufnehmen, wenn es in deinen Shopware 5-Daten nicht existiert und du diese Information beim Shopware 6 Kunden-Import nicht importieren möchtest. In Shopware 6 ist das Feld optional und kein Pflichtfeld für den Kundenimport.
Was passiert, wenn das Feld fehlt?
Lässt du das Feld weg oder bleibt es leer, wird beim Shopware 6 Kunden-Import einfach kein Titel für die Rechnungsadresse hinterlegt. Shopware 6 akzeptiert den Import trotzdem, solange alle Pflichtfelder vorhanden und korrekt gemappt sind.
Wann solltest du das Feld ergänzen?
Nur wenn du Wert darauf legst, dass z.B. akademische Titel wie „Dr.“ oder „Prof.“ auch in der Rechnungsadresse gespeichert werden, solltest du das Feld in deiner CSV ergänzen und befüllen.
Du kannst das Feld auch ins Importprofil aufnehmen und einen Standardwert definieren, falls du möchtest, dass bei fehlenden Angaben ein bestimmter Titel gesetzt wird.
Zusammenfassung:
- Das Feld
billing_titleist optional - Wenn es in SW5 nicht vorhanden war und du keine Titel importieren willst, brauchst du es in deiner CSV nicht zu ergänzen
- Der Shopware 6 Kunden-Import funktioniert auch ohne dieses Feld problemlos
Shopware 6 Kunden-Import – zurück zur Übersicht
23. Passwörter nachträglich importieren (wenn CSV-Import fehlschlägt)
Ein häufiges Problem beim Shopware 6 Kunden-Import: Obwohl die Passwörter in der CSV-Datei enthalten sind und das Mapping korrekt eingerichtet wurde, werden die Passwörter beim Import nicht übernommen. Stattdessen bleiben die Passwort-Felder leer, und die Kunden können sich nicht einloggen.
23.1 Warum ignoriert Shopware 6 die Passwörter beim CSV-Import?
Shopware 6 blockiert aus Sicherheitsgründen den direkten Import von Passwörtern über das Standard-Import/Export-System. Dies verhindert:
- Versehentlichen Import von Klartext-Passwörtern
- Unbefugte Manipulation von Kundenkonten
- Sicherheitslücken durch unsachgemäße Passwort-Imports
Das offizielle SwagMigrationAssistant Plugin würde die Passwörter korrekt übertragen, aber wenn du den CSV-Weg gewählt hast, musst du die Passwörter nachträglich per SQL importieren.
23.2 Voraussetzungen für den nachträglichen Passwort-Import
Bevor du startest, stelle sicher, dass:
- Du ein vollständiges Datenbank-Backup hast
- Die Passwörter in deiner CSV als bcrypt-Hashes vorliegen (Format:
$2y$10$...) - Du Zugriff auf phpMyAdmin oder die MySQL-Konsole hast
- Die CSV-Datei die Spalten
emailundpasswordenthält
23.3 Schritt-für-Schritt Anleitung: Passwörter nachträglich importieren
Schritt 1: Bereinigte CSV-Datei erstellen
Erstelle eine neue CSV-Datei mit nur drei Spalten:
email– Die E-Mail-Adresse des Kundencustomernumber– Die Kundennummer (optional, aber empfohlen)password– Der bcrypt-Hash aus Shopware 5
Diese Datei sollte:
- Semikolon als Trennzeichen verwenden
- Anführungszeichen als Textbegrenzer haben
- Eine Header-Zeile mit den Spaltennamen enthalten
- Nur Zeilen mit gefüllten Passwort-Hashes beinhalten
Schritt 2: Temporäre Tabelle in der Datenbank erstellen
Öffne phpMyAdmin, wähle deine Shopware 6 Datenbank aus und führe folgenden SQL-Befehl aus:
CREATE TABLE temp_customer_passwords (
email VARCHAR(255) COLLATE utf8mb4_unicode_ci,
customernumber VARCHAR(255) COLLATE utf8mb4_unicode_ci,
password_hash VARCHAR(255) COLLATE utf8mb4_unicode_ci
);
Diese Tabelle dient als Zwischenspeicher für deine Passwort-Daten.
Schritt 3: CSV-Daten in die temporäre Tabelle importieren
- Klicke in phpMyAdmin auf die neu erstellte Tabelle
temp_customer_passwords - Wähle den Tab „Importieren“
- Lade deine bereinigte CSV-Datei hoch
- Stelle die Importoptionen ein:
- Format: CSV
- Spalten getrennt mit:
; - Spalten eingeschlossen von:
" - Erste Zeile enthält Spaltennamen: Ja
Hinweis: Falls die Datei zu groß ist (über 2 MB), kannst du sie per SSH auf den Server hochladen und per LOAD DATA LOCAL INFILE importieren.
Schritt 4: Duplikate bereinigen
Es kann vorkommen, dass dieselbe E-Mail-Adresse mehrfach in deiner CSV vorkommt (z.B. durch historische Duplikate aus Shopware 5). Um sicherzustellen, dass jede E-Mail nur einmal verarbeitet wird, erstelle eine bereinigte Tabelle:
-- Bereinigte Tabelle mit eindeutigen E-Mails erstellen
CREATE TABLE temp_customer_passwords_clean (
email VARCHAR(255) COLLATE utf8mb4_unicode_ci PRIMARY KEY,
customernumber VARCHAR(255) COLLATE utf8mb4_unicode_ci,
password_hash VARCHAR(255) COLLATE utf8mb4_unicode_ci
);
-- Nur einen Eintrag pro E-Mail übertragen
INSERT INTO temp_customer_passwords_clean (email, customernumber, password_hash)
SELECT email,
MIN(customernumber) as customernumber,
MIN(password_hash) as password_hash
FROM temp_customer_passwords
WHERE password_hash IS NOT NULL
AND password_hash != ''
AND password_hash LIKE '$2y$10$%'
GROUP BY email;
Schritt 5: Test mit einem einzelnen Kunden
Bevor du alle Kunden auf einmal updatest, teste den Prozess mit deinem eigenen Account:
-- Teste mit deiner eigenen E-Mail
UPDATE customer
SET `password` = (SELECT password_hash FROM temp_customer_passwords_clean WHERE email = 'deine@email.de'),
legacy_password = NULL,
legacy_encoder = NULL
WHERE email = 'deine@email.de';
Versuche dich jetzt im Frontend mit deinem alten Shopware 5 Passwort einzuloggen. Funktioniert der Login, kannst du mit dem nächsten Schritt fortfahren.
Schritt 6: Anzahl der betroffenen Kunden prüfen
Prüfe, wie viele Kunden aktualisiert werden würden:
SELECT COUNT(*) as anzahl_updates
FROM customer c
INNER JOIN temp_customer_passwords_clean tcp ON c.email = tcp.email
WHERE c.password IS NULL
AND c.legacy_password IS NULL
AND c.email NOT LIKE '%@marketplace.amazon.de'
AND c.email NOT LIKE '%metro%'
AND c.email NOT LIKE '%@kaufland-online.de'
AND c.created_at < '2025-11-23 03:00:00';
Wichtig: Passe das Datum in der letzten Zeile an deinen Migrationszeitpunkt an. Kunden, die nach diesem Zeitpunkt angelegt wurden, sind neue Registrierungen und sollen nicht überschrieben werden.
Die WHERE-Bedingungen stellen sicher, dass:
- Nur Kunden ohne existierendes Passwort aktualisiert werden
- Marketplace-Kunden (Amazon, Metro, Kaufland) ausgeschlossen werden
- Neue Registrierungen nach der Migration nicht überschrieben werden
Schritt 7: Massenupdate durchführen
Wenn die Testanzahl plausibel ist (sollte ungefähr der Anzahl importierter Kunden entsprechen), führe den finalen Update aus:
UPDATE customer c
INNER JOIN temp_customer_passwords_clean tcp ON c.email = tcp.email
SET c.`password` = tcp.password_hash,
c.legacy_password = NULL,
c.legacy_encoder = NULL
WHERE c.password IS NULL
AND c.legacy_password IS NULL
AND c.email NOT LIKE '%@marketplace.amazon.de'
AND c.email NOT LIKE '%metro%'
AND c.email NOT LIKE '%@kaufland-online.de'
AND c.created_at < '2025-11-23 03:00:00';
Hinweis: Dieser Befehl kann bei großen Datenmengen (100.000+ Kunden) einige Sekunden bis Minuten dauern. Schließe das phpMyAdmin-Fenster nicht, bis die Abfrage abgeschlossen ist.
Schritt 8: Erfolg überprüfen
Prüfe, wie viele Kunden jetzt ein Passwort haben:
-- Kunden mit Passwort
SELECT COUNT(*) as mit_passwort
FROM customer
WHERE password IS NOT NULL;
-- Kunden ohne Passwort
SELECT COUNT(*) as ohne_passwort
FROM customer
WHERE password IS NULL AND legacy_password IS NULL;
Schritt 9: Temporäre Tabellen aufräumen
Nach erfolgreichem Import kannst du die temporären Tabellen löschen:
DROP TABLE IF EXISTS temp_customer_passwords;
DROP TABLE IF EXISTS temp_customer_passwords_clean;
Falls du die CSV-Datei auf den Server hochgeladen hast, lösche sie auch:
rm /pfad/zur/passwords.csv
23.4 Häufige Probleme und Lösungen
Problem: „Unerlaubte Mischung von Sortierreihenfolgen“
Fehlermeldung: #1267 - Unerlaubte Mischung von Sortierreihenfolgen (utf8mb4_unicode_ci, IMPLICIT) und (utf8mb4_0900_ai_ci, IMPLICIT)
Lösung: Führe das ALTER TABLE aus Schritt 4 aus oder ergänze explizit COLLATE utf8mb4_unicode_ci beim Erstellen der temp-Tabelle.
Problem: „Unerkanntes Schlüsselwort bei SET password“
Lösung: password ist ein reserviertes MySQL-Wort. Verwende Backticks: `password` statt password.
Problem: Passwörter funktionieren nach Import nicht
Mögliche Ursachen:
- Die Hashes aus Shopware 5 sind nicht bcrypt-kompatibel
- Die Hashes wurden beim Export beschädigt
- Das falsche Feld wurde befüllt (z.B.
legacy_passwordstattpassword)
Lösung: Teste erst mit einem einzelnen Kunden (Schritt 5) und prüfe im Frontend, ob der Login funktioniert, bevor du alle Kunden updatest.
Problem: Zu viele Kunden würden aktualisiert
Ursache: Es gibt Duplikate in der customer-Tabelle oder in der CSV-Datei.
Lösung:
- Prüfe mit
SELECT email, COUNT(*) FROM customer GROUP BY email HAVING COUNT(*) > 1ob es Duplikate gibt - Bereinige die CSV mit der Deduplizierungs-Query aus Schritt 4
- Passe die Marketplace-Ausschlüsse an deine Shop-Struktur an
23.5 Alternative: Passwort-Reset für alle Kunden
Falls der nachträgliche Import zu komplex ist oder die Passwort-Hashes nicht kompatibel sind, kannst du auch einen Massen-Passwort-Reset durchführen:
-- Alle Passwörter auf NULL setzen
UPDATE customer
SET password = NULL,
legacy_password = NULL,
legacy_encoder = NULL
WHERE password IS NULL OR legacy_password IS NULL;
Anschließend schickst du eine E-Mail an alle Kunden mit der Bitte, ihr Passwort über die „Passwort vergessen“-Funktion neu zu setzen. Dies ist die sicherste Methode, erfordert aber aktive Mitarbeit der Kunden.
23.6 Wichtige Hinweise zur Passwort-Sicherheit
- Niemals Klartext-Passwörter in der Datenbank speichern oder importieren
- Teste immer zuerst mit einem einzelnen Kunden, bevor du Massen-Updates durchführst
- Erstelle ein Backup der
customer-Tabelle vor dem Passwort-Import - Lösche die CSV-Datei mit den Passwort-Hashes nach dem Import vom Server
- Dokumentiere den Prozess für dein Team, falls später Anpassungen nötig sind
Shopware 6 Kunden-Import – zurück zur Übersicht
Quellen und weiterführende Links
- Offizielle Shopware 6 Import/Export Dokumentation
- Shopware Community Forum
- Great2Gether Kontakt – Professionelle Hilfe bei der Migration
Bonus-Level:
Das geheime great2gether Import Template: customer_default_customer_from_sw5.csv (Klicken für Download)












