Wenn zwei Lieferanten in Ihrem Shopware 6 Shop dasselbe Produkt zum selben Preis führen, wer bekommt die Bestellung?
Bei den meisten Teams mit Shopware 6 lautet die Antwort: derselbe Lieferant, jedes Mal. Der Default. Das ist einfach. Es ist auch unfair, und es macht den ganzen Fulfillment-Betrieb fragil. Wenn dieser Default-Lieferant in einen Lagerengpass läuft oder beim Versand zurückfällt, merken Sie es spät, weil jede Bestellung in Shopware weiterhin durch ihn fliesst.
Lieferantenrotation löst genau das. Ich habe dieses System als individuelles Shopware 6 Plugin für einen Shop gebaut, der Bestellungen auf mehrere Grosshändler und Vertragsfertiger verteilen musste. Die Logik ist klein, sobald man den Engineering-Jargon weglässt. Hier kommt die operatorfreundliche Version. Wenn Sie einen Shopware 6 Shop betreiben, eine Fertigung leiten oder Bestellungen über überlappende Lieferanten koordinieren, ist das, was Sie wirklich wissen müssen.
Warum Shopware 6 das nicht von Haus aus löst
Shopware 6 ist hervorragend bei der Bestellung selbst: Warenkorb, Checkout, Zahlung, Positionsmathematik. Was es nicht mitbringt, ist Multi-Lieferanten-Order-Routing.
Der Standard-Bestellworkflow geht von einem einzigen Fulfillment-Pfad aus. Wenn Sie ein Produkt verkaufen, das 3 Lieferanten alle führen, hat Shopware 6 keine Meinung dazu, wer die Bestellung bekommt. Die meisten Teams überdecken das, indem sie einen Default-Lieferanten in ihrem Fulfillment-Plugin hart codieren. Innerhalb weniger Wochen hat dieser Lieferant 90 % des Volumens.
Drei Dinge gehen ab da schief.
Erstens verlieren Sie den Überblick über die anderen beiden Lieferanten. Ihre Bestandsdaten veralten. Ihre Zuverlässigkeit bleibt unbekannt, bis Sie sie wirklich brauchen.
Zweitens wird der Favorit überlastet. Lieferzeiten ziehen sich. Defekte schleichen sich ein. Genau das, was ihn zum Default-Lieferanten gemacht hat, beginnt zu rutschen.
Drittens haben Sie keinen Plan B. An dem Tag, an dem Ihr Default-Lieferant wegen eines verlängerten Wochenendes oder einer Zollverzögerung ausfällt, schichten Sie hektisch auf Lieferanten um, die Sie monatelang nicht genutzt haben.
Shopware 6 Lieferantenrotation verhindert das. Nicht, indem sie Ihre Präferenz entfernt, sondern indem sie jedem aktiven Lieferanten einen fairen, vorhersehbaren Anteil an der Arbeit gibt.
Was Shopware 6 Lieferantenrotation tatsächlich macht
Jeder Lieferant hat ein order_quota, eine Zahl, die Ihr Ops-Team im Shopware Admin setzt. Denken Sie daran als: wie viele Bestellungen sollte dieser Lieferant pro Zyklus bekommen. Ein Zyklus ist das Zeitfenster, das für Ihren Shop sinnvoll ist: ein Tag, eine Woche, ein Sprint, eine Kampagne.
Wenn in Shopware 6 eine neue Bestellung platziert wird, schaut das Plugin auf jeden Lieferanten, der die ganze Bestellung erfüllen kann. Es sortiert sie, wählt denjenigen, der am weitesten von seinem Kontingent entfernt ist, und schreibt die Zuweisung über ein Custom Field zurück auf die Bestellung.
Sobald jeder Lieferant in der Rotation sein Kontingent erreicht hat, setzt sich der Zähler zurück und der Zyklus beginnt erneut.
Das ist die ganze Idee. Die interessante Arbeit passiert an den Rändern.
Wann Rotation in Shopware 6 funktioniert und wann nicht
Rotation tut nur dann etwas Sinnvolles, wenn es eine klare Wahl zwischen gleich fähigen Lieferanten gibt. Wenn ein Kunde 4 verschiedene Produkte in Shopware 6 bestellt und kein einzelner Lieferant alle 4 in der richtigen Menge führt, kann Rotation nicht helfen. Die Bestellung geht in den Multi-Lieferanten-Fulfillment-Pfad: jeder Lieferant bekommt seinen Anteil, und der Rotationszähler bewegt sich nicht.
Das ist der häufigste Grund, warum Rotation aussieht, als würde sie nicht funktionieren. Gemischte Bestellungen umgehen sie komplett. Sie können Ihr Shopware 6 Plugin aktiviert haben, Kontingente gesetzt, Lieferanten bereit, und trotzdem sehen, dass ein Lieferant die ganze Arbeit macht, weil die Bestellform der Rotation nie eine Öffnung gibt.
Die Regel ist strikt. Ein einzelner Lieferant muss jede Position in voller Menge führen, damit die Rotation greift. Sonst fällt die Bestellung in die Multi-Lieferanten-Logik, die Sie ohnehin brauchen.
Wenn Ihr Shopware 6 Katalog hauptsächlich Einzelpositionen-Bestellungen umfasst (ein T-Shirt, eine Handyhülle, ein Produkt), wird die Rotation bei fast jeder Bestellung feuern. Wenn Ihr Katalog stark gebündelt ist oder Kunden 5+ Produkte gleichzeitig kaufen, greift Rotation seltener. Das ist kein Bug. Das ist der Preis dafür, eine saubere Antwort dort zu geben, wo sie wirklich sauber ist.
Wie man den nächsten Lieferanten in Shopware 6 auswählt, ohne es zu kompliziert zu machen
Angenommen, 3 Lieferanten können die Bestellung erfüllen, alle unter ihrem Kontingent. Wie entscheiden Sie?
Sortieren Sie nach 4 Feldern, in dieser Reihenfolge:
- Priorität (absteigend). Ops kann einen Lieferanten im Shopware Admin höher anpinnen. Nützlich für neue Partnerschaften, Exklusivverträge oder saisonale Pushs.
- Kontingent (absteigend). Grösseres Kontingent heisst mehr Kapazität. Grössere Kapazität geht zuerst.
- Aktueller Zähler (absteigend). Der Lieferant am nächsten an seinem Kontingent geht zuerst, damit Kapazität in Reihenfolge gefüllt wird, statt dünn auf alle verteilt.
- Lieferanten-ID (aufsteigend). Ein Tiebreaker, damit dieselbe Situation immer dieselbe Wahl trifft.
Wer am Ende dieser Sortierung oben steht, bekommt die Bestellung.
Der Grund, warum das für Hersteller und Dropshipper auf Shopware 6 funktioniert, ist, dass diese vier Felder die Hebel abdecken, die Ops wirklich braucht. Ein Hersteller will seine Hauptfabrik nahe Vollauslastung halten, während eine Backup-Fabrik hochgefahren wird. Ein Dropshipper will einen neuen Grosshändler mit einem kleinen Anteil testen, während der bewährte Lieferant das Volumen trägt. Gleiche Sortierung, andere Zahlen.
Achten Sie darauf, was nicht in der Liste steht. Kein Machine-Learning-Modell. Keine Forecasts. Keine gleitenden Durchschnitte. Die einfachste Version, die Priorität und Kapazität respektiert, gewinnt, weil sie die ist, deren Verhalten Operatoren vorhersagen können.
Wer meinen Ansatz zur Shopware 6 Plugin-Entwicklung gelesen hat, erkennt das Muster. Decoration vor Vererbung, Message Queue für alles, was länger als ein Request-Zyklus dauert, Admin-Konfiguration vor hartcodierten Werten.
Die Edge Cases, die Shopware 6 Rotation in der Praxis kaputt machen
Die meisten Rotationssysteme scheitern nicht am Pick-Schritt. Sie scheitern an dem langweiligen Drumherum. Shopware 6 hat seine eigene Version jedes dieser Fälle, und wer sie falsch macht, hat ein Plugin, das sich verflucht anfühlt.
Doppelklicks und doppelte Bestellplatzierungen
Operatoren klicken zweimal auf “Senden”. Netzwerke ruckeln. Form-Submits werden wiederholt. Die Shopware 6 Message Queue retried bei Fehlern. Nichts davon darf doppelt rotieren und zwei Bestellungen an einen Lieferanten feuern, der nur eine verdient hat.
Die Lösung ist, den Pick-Schritt idempotent zu machen. Wenn das Order-Placement-Event feuert, prüft das Plugin, ob die Bestellung bereits einen zugewiesenen Lieferanten in ihrem Custom Field hat. Wenn ja, gibt es den gespeicherten Lieferanten zurück und überspringt das Inkrement. Der Zähler bewegt sich einmal pro Bestellung, Punkt.
Sperren Sie die Lieferanten-Zeile mit FOR UPDATE während des Picks, damit zwei Bestellungen, die in derselben Millisekunde landen, nicht denselben Slot greifen können. Der Shopware 6 DAL gibt Ihnen das nicht geschenkt. Sie müssen es schreiben.
Wenn jeder Lieferant sein Kontingent erreicht
Was passiert, wenn alle in Frage kommenden Lieferanten gleichzeitig ihr Kontingent erreichen? Wenn das Plugin einfach stoppt, hängt die Bestellung und der Kunde wartet.
Das richtige Verhalten ist, den Pool für einen Reset zu markieren und die Bestellung trotzdem dem obersten Lieferanten zuzuweisen. Der eigentliche Reset auf Null passiert erst bei der Dispatch-Bestätigung, nicht wenn ein Operator eine Bestellung nur ansieht. Dieses Detail ist wichtig. Es verhindert, dass sich der Zyklus jedes Mal heimlich zurücksetzt, wenn jemand das Formular zur Ansicht öffnet.
Manuelle Overrides im Shopware Admin
Manchmal muss Ops einen bestimmten Lieferanten ausserhalb der Rotation wählen. Vielleicht hat ein Kunde nach einer bestimmten Fabrik gefragt, vielleicht macht ein Lieferant einen Qualitätstest, vielleicht schuldet ein Account Manager einem anderen Lieferanten einen Gefallen.
Ein Override sollte den Zähler dieses Lieferanten erhöhen (damit er nicht direkt danach auch noch eine automatische Bestellung bekommt), aber keinen frischen Zyklus auslösen. Overrides sind nicht Teil des regulären Rhythmus. Sie wie einen zu behandeln, korrumpiert die Mathematik.
Diese drei Ecken sind, wo sich Shopware 6 Rotation entweder solide oder verflucht anfühlt. Wenn Ihr individuelles Plugin sie richtig macht, läuft Rotation einfach. Wenn nicht, verbringen Sie Dienstagnachmittage damit, herauszufinden, warum ein Lieferant 7 Bestellungen für einen einzigen Kunden-Tippfehler bekommen hat.
Shopware 6 Lieferantenrotation für Hersteller und Dropshipper
Gleiches Shopware Plugin, andere Form.
Dropshipper mit Shopware 6 haben typischerweise Lieferanten, die sich auf Hunderten von SKUs überschneiden. Der Gewinn ist Zuverlässigkeit und Lieferantengesundheit. Indem Sie Bestellungen auf Lieferanten verteilen, halten Sie alle warm, Ihre Backups bleiben getestet, und kein einzelner Lieferant wird zum Flaschenhals am Freitagnachmittag. Kontingente sollten der tatsächlichen Fulfillment-Geschwindigkeit und dem Qualitätsscore entsprechen, nicht dem Listenpreis.
Hersteller fahren Shopware 6 Rotation typischerweise über Fabriken, Produktionslinien oder Vertragspartner. Der Gewinn ist Kapazitätsglättung und Produktionsplanung. Kontingente spiegeln den realen Durchsatz pro Schicht. Priorität deckt “diese Fabrik ist Backup, nicht Primary” ab. Gemischte Bestellungen sind selten relevant, weil Fertigungsbestellungen meist SKU-spezifisch sind, sodass Rotation bei fast allem greift.
Das Mental Model ist in beiden Fällen dasselbe. Sie haben mehrere Lieferanten in Shopware 6, die denselben Job machen können. Sie wollen faire, vorhersehbare Verteilung, die Kapazität respektiert. Sie wollen einen Knopf (Priorität, Kontingent) pro Hebel, den Sie tatsächlich ziehen, und nichts Zusätzliches im Admin.
Wenn Ihr Geschäft irgendwo dazwischen liegt, etwa eine Eigenmarke mit 2 Herstellern und 3 Fulfillment-Partnern, deckt das Plugin das auch ab. Ein “Lieferant” in Shopware 6 ist einfach derjenige, an den Sie die Bestellung schicken. Die Rotation kümmert sich nicht um den Titel auf seiner Rechnung.
So liefern Sie ein Shopware 6 Lieferantenrotations-Plugin, ohne sich in eine Ecke zu malen
Wenn Sie ein individuelles Shopware 6 Plugin dafür scopen, sind die strukturellen Entscheidungen wichtiger als die Rotationsmathematik.
Ein paar Regeln, die ich bei jedem Bau befolge:
- Dekorieren, nicht überschreiben. Der Order-Placement-Service in Shopware 6 sollte dekoriert, nicht ersetzt werden. Overrides brechen bei jedem Minor-Update. Decoration überlebt. Die gleiche Regel gilt für die Admin-Komponenten, in denen Sie Kontingente und Priorität freigeben.
- Schwere Arbeit in die Message Queue. Wenn Ihr Rotations-Plugin externe API-Calls macht (Lager-Stock-Checks, ERP-Sync, Lieferantenportal-Posts), blockieren Sie die Order-Placement nicht damit. Nutzen Sie die Shopware Message Queue. Das gleiche Muster habe ich in meinem Plugin-Entwicklungsansatz beschrieben.
- Routing-Entscheidungen auf der Bestellung speichern. Nutzen Sie ein Custom Field auf der Order Entity, keine separate Tabelle, die beim Lesen gejoint wird. Das macht die Zuweisung idempotent, im Admin abfragbar und für Ops sichtbar, ohne dass Sie einen eigenen Screen bauen müssen.
- Migrationen für alles. Jede Schemaänderung kommt mit einer Shopware 6 Migration. Der Tag, an dem Ihr Plugin eine neue Lieferantenkapazitäts-Spalte braucht, ist der Tag, an dem Sie merken, ob Ihre
update()-Methode wirklich funktioniert. - Konfigurierbare Kontingente im Admin. Operatoren sollten Kontingent und Priorität über das Lieferanten-Admin-Modul setzen, nicht über einen
services.xml-Wert. Wenn Ops einen Entwickler braucht, um eine Zahl zu ändern, zahlen Sie das in jedem Zyklus.
Ich habe diese Art Plugin gebaut, neben den Mustern aus meiner Zero-Touch Order Processing Case Study und während eines Pharma-Inventur-Sync, bei dem Lieferantenzuverlässigkeit der ganze Sinn des Projekts war.
Warum ein kleines Shopware 6 System ein cleveres schlägt
Die Versuchung ist immer, mehr hinzuzufügen. Kostenbasiertes Routing. Geografisches Routing. SLA-basiertes Routing. Lieferanten-Health-Forecasts. All das hat irgendwann seinen Platz.
Aber der Kern, der das alles nützlich macht, ist faire Verteilung mit vorhersehbarem Verhalten. Wenn die einfache Shopware 6 Rotation nicht funktioniert, ist alles Clevere obendrauf nur mehr Angriffsfläche für Bugs.
Kontingent plus Priorität gibt Ops alles, was sie an Tag eins brauchen. Grössere Lieferanten tragen mehr. Angepinnte Lieferanten tragen zuerst. Override, wenn nötig. Reset, wenn der Zyklus endet. Die Fairnessmathematik ist Sortierung auf 3 Feldern. Das ist das ganze Regelwerk.
Wenn Sie irgendwann doch reichhaltigeres Routing brauchen, lässt es sich sauber andocken. Die Naht ist im dekorierten Service schon da.
Häufig gestellte Fragen
Was ist Lieferantenrotation in Shopware 6? Ein individuelles Plugin-Pattern, das eingehende Bestellungen auf zwei oder mehr Lieferanten verteilt, die dasselbe Produkt liefern können. Jeder Lieferant bekommt ein Kontingent im Admin, und jede neue Bestellung geht an denjenigen, der am weitesten von seinem entfernt ist. Sobald alle ihr Ziel erreichen, setzt sich der Zyklus zurück.
Hat Shopware 6 ein eingebautes Multi-Lieferanten-Fulfillment? Nein. Der Standard-Bestellworkflow in Shopware 6 geht von einem einzigen Fulfillment-Pfad aus. Multi-Lieferanten-Routing erfordert ein individuelles Plugin, das in den Order-Placement-Flow eingreift.
Wann greift Shopware 6 Rotation? Nur wenn ein Lieferant die gesamte Bestellung in der richtigen Menge erfüllen kann. Gemischte Bestellungen umgehen Rotation und nutzen einen Multi-Lieferanten-Fulfillment-Pfad.
Wie wähle ich den nächsten Lieferanten? Sortieren nach Priorität, dann Kontingent, dann aktuellem Zähler, dann Lieferanten-ID als Tiebreaker. Wer oben steht, bekommt die Bestellung.
Wie vermeide ich doppelte Sends? Pick-Schritt idempotent machen. Custom Field auf der Bestellung prüfen, bevor rotiert wird. Der Zähler darf sich pro Bestellung nur einmal bewegen, egal wie viele Retries feuern.
Funktioniert das für Hersteller und Dropshipper? Beides. Das Shopware 6 Plugin ist identisch. Es ändert sich nur die Bedeutung von “Lieferant”: Fabrik, 3PL, Grosshändler oder Marktplatz-Partner.
Womit Sie diese Woche anfangen
Wenn Sie einen Shopware 6 Shop betreiben und vermuten, dass ein Lieferant zu viel trägt, machen Sie das, bevor Sie Code schreiben.
Nehmen Sie Ihre Top 3 SKUs nach Volumen. Listen Sie jeden Lieferanten auf, der jede einzelne erfüllen kann, mit realistischer Kapazität. Wenn nur ein Lieferant über alle 3 hinweg auftaucht, haben Sie noch kein Rotationsproblem. Sie haben ein Sourcing-Problem.
Wenn 2 oder mehr Lieferanten auftauchen, schreiben Sie auf, was Sie heute als Kontingent und Priorität setzen würden. Prüfen Sie dann, ob Ihr aktuelles Shopware 6 Setup diese Zahlen wirklich durchsetzen kann. Wenn nicht, ist das die Lücke, die zuerst gestopft werden sollte, bevor Sie tiefer in Routing-Logik gehen.
Wenn Sie ein zweites Paar Augen darauf brauchen, wie man Lieferantenrotation in Ihren Shopware 6 Stack einbaut, melden Sie sich. Ich habe dieses Plugin-Pattern in individuellen Shopware 6 Builds, B2B-Plattformen und Dropshipping-Operationen umgesetzt. Der harte Teil ist selten der Code. Es ist sicherzustellen, dass die Regeln zu der Art passen, wie Ihre Operatoren wirklich arbeiten.