Shopware 5 Kunden per CSV Datei in Shopware 6 importieren

von | Nov. 2, 2025 | Alle, Shopware 6, Shopware Entwicklung | 0 Kommentare

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

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_countrybilling_countryID
  • billing_first_namebilling_firstname
  • billing_last_namebilling_lastname
  • billing_phone_numberphone
  • customer_groupcustomergroup
  • first_namebilling_firstname
  • last_namebilling_lastname
  • guestaccountmode
  • payment_methodpaymentID
  • shipping_first_nameshipping_firstname
  • shipping_last_nameshipping_lastname
  • sales_channelsubshopID
  • shipping_countryshipping_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 = 1 in Shopware 5, dann setze den Wert in der CSV auf true
  • Wenn accountmode = 0, dann setze den Wert auf false

Mappe dann dein Feld so: accountmodeguest

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 company oder vatId befü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 id muss 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_namebilling_firstname
  • last_namebilling_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_title ist 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 email und password enthä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 Kunden
  • customernumber – 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_password statt password)

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(*) > 1 ob 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

Bonus-Level:

Das geheime great2gether Import Template: customer_default_customer_from_sw5.csv (Klicken für Download)