Notfall: Der Shop steht oder der Checkout bricht ab
Ein Fehler 500 (HTTP 500, „Internal Server Error“) im Checkout eines Shopware-6-Shops hat fast immer eine von drei Ursachen: Cache, Indexierung oder ein Plugin. Die Reihenfolge zur Selbsthilfe: 1. Logdateien unter var/log/ lesen. 2. bin/console cache:clear, cache:clear:http und cache:warmup. 3. bin/console dal:refresh:index, wenn neue Produkte nicht erscheinen. 4. bin/console plugin:deactivate, danach erneut cache:clear. Meldungen wie „Unable to generate a URL for the named route“ deuten auf Cache oder Routing. Ein Fehler aus dem Suchindex, also aus Elasticsearch beziehungsweise OpenSearch, beim Aufruf einer Kategorie deutet auf den Index, dann hilft bin/console es:index. „Class not found“ oder eine weiße Seite deuten auf ein Plugin. Wer das durchhat und weiter im Dunkeln steht, braucht jemanden mit Shell-Zugang.
Eine Support-Hotline für technische Störungen gibt es beim Hersteller nicht. Die Telefonnummer auf shopware.com führt zu Vertrieb und allgemeinen Anfragen; technischer Support setzt einen kostenpflichtigen Plan voraus und läuft über account.shopware.com, Betreiber der Community Edition werden ausdrücklich ans Community-Forum verwiesen. Wer also sucht, wo er eine Störung melden kann, sucht etwas, das beim Hersteller in dieser Form nicht existiert. Bei uns geht jemand ans Telefon, Mo–Fr 9:00–16:00 Uhr. Reaktionszeiten in Stunden sagen wir nicht pauschal zu. Sie stehen in einer SLA oder sie stehen nirgends. Außerhalb von Mo–Fr 9:00–16:00 Uhr geht hier niemand ans Telefon. Wer Samstagabend jemanden braucht, braucht Rufbereitschaft. Die gibt es nur mit SLA, und sie kostet auch in den Monaten, in denen nichts passiert.
Im Störungsfall arbeitet Sharpness rückwärts vom letzten funktionierenden Zustand: Was wurde zuletzt deployed, welches Plugin wurde installiert, welcher Composer-Stand liegt vor. Reproduziert wird auf einem Staging-System, nicht im Live-Shop. Erst wenn die Ursache benannt ist, wird gefixt. Ein Rollback ist eine Entscheidung, keine Panikreaktion. Wer Updates ausschließlich über die grafische Oberfläche fährt und kein Staging hat, hat auch keinen Rückweg. Diese Lücke schließen wir zuerst, weil sie den nächsten Notfall billiger macht als den aktuellen.
Shopware 5 auf 6: Neuaufbau mit Datenübernahme
Eine Migration von Shopware 5 auf Shopware 6 ist kein Update, sondern ein Neuaufbau mit Datenübernahme. Der Shopware-Migrations-Assistent ist im Shopware-Store kostenlos und derzeit kompatibel mit 6.6.0.0 bis 6.7.13.0; im Quellshop wird zusätzlich das Migrations-Connector-Plugin installiert. Übernommen werden unter anderem Produkte, Varianten, Hersteller, Kategorien, Kunden, Bestellungen samt Bestelldokumenten, Medien, Versandarten, Cross-Selling, Custom Fields, SEO-URLs und Produktbewertungen. Vor dem Start läuft ein Datencheck, der Mappings verlangt. Gemeint sind Zuordnungen für alles, was sich nicht automatisch auflösen lässt.
Der Shopware-Migrations-Assistent migriert ausschließlich Daten. Er migriert nicht Ihr Aussehen, nicht Ihre Funktionen und nicht Ihre Schnittstellen. Theme und Erweiterungen werden neu gebaut, ERP-, PIM- und CRM-Anbindungen neu angebunden. Genau hier entstehen die Kosten, mit denen Betreiber regelmäßig überrascht werden, nicht beim Datentransfer. Eine Falle obendrauf: Die beim ersten Lauf angelegten Verkaufskanäle sollten Sie stehen lassen. Hängen Kunden daran, verweigert die Datenbank das Löschen ohnehin mit einer Foreign-Key-Verletzung; wer den Kanal auf Umwegen entfernt, riskiert unvollständige Folgeläufe. Prüfen Sie nach jedem Lauf die Zahl der übernommenen Kunden und Bestellungen gegen den Altshop. Es fehlen einfach Kunden und Bestellungen.
Über Erfolg oder Misserfolg einer Migration entscheiden am Ende die Weiterleitungen. Die SEO-URLs aus Shopware 5 lassen sich mitnehmen, aber die URL-Struktur von Shopware 6 ist eine andere; ohne vollständige Redirect-Liste verlieren Sie am Umschalttag gewachsene Rankings, und zwar dauerhaft. Wir erzeugen die Liste aus dem Altbestand, nicht aus Vermutungen, und prüfen sie vor dem Cutover. Wer dafür gerade keine Zeit hat, kauft sich mit safefive-Patches für Shopware 5 Luft. Das ist eine Verlängerung, keine Lösung. Platz 1 garantiert dabei niemand, wir auch nicht.
Schnittstellen: Admin API, Store API, Sync API
Shopware 6 hat zwei APIs und einen Sonderweg für Massendaten, der regelmäßig für eine dritte gehalten wird. Die Admin API ist die administrative Schnittstelle: Authentifizierung über OAuth 2.0 im Client-Credentials-Flow, die Integration wird unter Einstellungen → System → Integrationen angelegt, Access Key ID entspricht der client_id, Secret Access Key dem client_secret. Der Token kommt per POST auf /api/oauth/token, gilt standardmäßig 600 Sekunden und wandert danach als Bearer-Header mit; läuft er ab, wird ein neuer angefordert. Die Store API ist die kundenseitige Schnittstelle für Produktsuche, Warenkorb und Checkout. Sie authentifiziert über den Header sw-access-key des Verkaufskanals, nicht über OAuth.
Für Massendaten gibt es die Sync API: kein eigener Zugang, sondern ein Endpunkt der Admin API unter /api/_action/sync, mit demselben Token. Sie kennt nur zwei Operationen, upsert und delete, unterscheidet also nicht zwischen Anlegen und Ändern. Entscheidend für die Laufzeit ist der Header indexing-behavior: ohne ihn wird sofort im Request indexiert, mit use-queue-indexing übernimmt die Message Queue, mit disable-indexing entfällt sie ganz. Wer einen Vollimport ohne diesen Header fährt, wartet um Größenordnungen länger. Für den B2B-Einkauf kommen OCI- und cXML-Punch-out-Kataloge dazu. Das ist weder ein Core-Feature noch ein Modul der B2B Components, sondern kommt über eine Drittanbieter-Erweiterung oder als eigene Entwicklung auf Basis der Store API. Der Einkäufer startet im Beschaffungssystem, füllt den Warenkorb im Shop und gibt ihn dorthin zurück.
Die schwierigen Fragen einer ERP-Anbindung sind nicht technischer, sondern betrieblicher Natur: Wer besitzt welches Feld — Preis, Bestand, Beschreibung? Was passiert, wenn der Import mitten im Lauf abbricht? Darf derselbe Datensatz zweimal geschrieben werden, ohne Schaden anzurichten? Und wer liest das Fehlerprotokoll? Statische Staffel- und Kundengruppenpreise beherrscht Shopware 6 über den Rule Builder. Für kundenindividuelle Preise aus dem ERP gibt es zwei Wege: die Customer-Specific-Pricing-API der Shopware-Commercial-Erweiterung und, in den B2B Components, das Modul Individual Pricing. Wer das umgeht und jeden Kunden zur eigenen Kundengruppe macht, treibt die Tabelle product_price ins Absurde. Die Zeilenzahl wächst dann mit jedem Kunden mal jedem Artikel — und die Suche über diese Tabelle wird zum Flaschenhals im Checkout.
Performance: erst die Ursache, dann Redis
Ein langsamer Shopware-Shop hat meist eine Ursachenkette, keinen einzelnen Schuldigen, und sie lässt sich in fester Reihenfolge abarbeiten. Zuerst: Läuft die Instanz noch im Development-Modus? Dann schreibt Shopware bei jedem Request Debug-Logs und kompiliert Templates neu. Allein die Umstellung auf den Production-Modus bringt in der Regel den größten Einzelsprung; wie groß, sagen wir erst nach der Messung. Zweitens: Ist der HTTP-Cache über SHOPWARE_HTTP_CACHE_ENABLED=1 überhaupt aktiv? Drittens: Wie viele Plugins hängen im Request-Pfad, und was machen sie dort? Erst danach lohnt das Gespräch über Infrastruktur.
Valkey, Redis und OpenSearch reparieren keine schlechte Abfrage. Ein Suchindex beschleunigt sie nicht, er verschiebt sie nur, und ein stiller Fallback auf die MySQL-Suche kaschiert das Problem, bis der Katalog wächst. Setzen Sie SHOPWARE_ES_THROW_EXCEPTION=1, damit dieser Fallback sichtbar wird. Auf Datenbankseite gehören zwei Werte dazu: group_concat_max_len ab 320000 und ein sql_mode ohne ONLY_FULL_GROUP_BY. Auf PHP-Seite sind es vier: opcache.validate_timestamps=0, opcache.interned_strings_buffer=20, zend.assertions=-1 und realpath_cache_ttl=3600. Das sind Betriebsparameter, keine Geheimtipps. Sie fehlen trotzdem erstaunlich oft.
Der in der Shopware-Dokumentation empfohlene Betriebsstack lässt sich Zeile für Zeile gegen Ihr Hosting halten: PHP 8.4 empfohlen, mindestens 8.2, memory_limit ab 512M; MariaDB 11.4 oder MySQL 8.4; Node.js 24 mit npm 10 für den Administration-Build; Valkey 8.0 oder alternativ Redis 7+; OpenSearch 2.17.1; Caddy als empfohlener Webserver, Nginx und Apache werden ebenfalls unterstützt. Wer darunter liegt, hat kein Performance-Problem, sondern ein Hosting-Problem. Wir betreiben Shopware-Instanzen auf eigenen Servern in Deutschland, auf Proxmox-PVE-Clustern, mit PHP 8.4, Valkey und OpenSearch.
Fremde Shops übernehmen: erst prüfen, dann zusagen
Sharpness übernimmt bestehende Shopware-Shops, aber nicht blind. Am Anfang steht eine Bestandsaufnahme: Shopware-Version und Patch-Stand, Composer- und Plugin-Liste mit Herkunft, Umfang des eigenen Codes, Zustand des Hostings, vorhandene Deployment-Wege, Backups und ihre Wiederherstellbarkeit. Daraus wird ein Befundbericht mit Risikoliste und Aufwandsschätzung, ein abgegrenztes Erstprodukt, kein Vertriebsgespräch. Erst danach sagen wir zu, was wir übernehmen können. Eine Zusage vor dem Blick in den Code wäre geraten, und Raten ist bei fremdem Code keine Methode.
Für die Übernahme brauchen wir Zugänge, und die Liste ist immer dieselbe: Hosting beziehungsweise Server, Datenbank, Git-Repository, Shopware-Account, API-Schlüssel und Integrationen, dazu die Konfiguration von Redis oder Valkey und einem etwaigen Varnish. Ihr Hosting müssen Sie dafür nicht wechseln. Wir arbeiten auf dem Bestand; ein Umzug auf unsere Server ist eine eigene Entscheidung mit eigenem Angebot. Fehlt Dokumentation, ist das kein Ausschlusskriterium. Undokumentierter Code ist der Normalfall, nicht die Ausnahme. Das eigentliche Risiko beim Agenturwechsel ist selten der Wechsel selbst, sondern der unbekannte Zustand des Altsystems. Wie lange ein Wechsel dauert, entscheidet genau dieser Zustand: Bei vollständigen Zugängen und vorhandenem Git-Repository liegen wir erfahrungsgemäß im Bereich weniger Wochen. Die belastbare Zahl steht im Befundbericht, nicht davor.
Nach dem Befundbericht gibt es zwei Wege der Zusammenarbeit mit Sharpness. Entweder Sie beauftragen einzelne Arbeiten — ein Fehlerbild, ein Update, eine Schnittstelle — und wir rechnen nach Aufwand ab. Oder wir vereinbaren einen Wartungsvertrag mit einer SLA, in der Reaktionszeiten, Erreichbarkeit und Leistungsumfang schriftlich stehen. Der Unterschied zum Support des Herstellers: Shopware unterstützt sein eigenes Produkt, nicht Ihre Drittanbieter-Plugins und nicht Ihren individuellen Code. Genau dort sitzen die Fehler, die uns am häufigsten erreichen. Wer fremden Code nicht kennt, kann ihn nicht supporten. Deshalb übernehmen wir keinen Support ohne vorherigen Befund. Unter der Marke Sharpness entwickeln wir seit 1999 in Oldenburg, Vertragspartnerin ist die Sharpness Solutions GmbH.