Shopware-6-Bestellungen fair auf mehrere Lieferanten verteilen

Wenn zwei Lieferanten in Ihrem Shopware-6-Shop dasselbe Produkt zum selben Preis führen, wer bekommt die Bestellung?

Bei den meisten Teams lautet die Antwort: derselbe Lieferant, jedes Mal. Es ist der Default. Es ist einfach. Es ist auch unfair, und es macht Ihr Fulfillment leise 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, geschrieben für Betreiber, die einen Shopware-6-Shop im Dropshipping oder in der Fertigung führen.

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-Routing.

Der Standard-Bestellworkflow geht von einem einzigen Fulfillment-Pfad aus. Wenn 3 Lieferanten alle das bestellte Produkt 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.

Sie verlieren den Überblick über die anderen Lieferanten. Ihre Bestandsdaten veralten. Ihre Zuverlässigkeit bleibt unbekannt, bis Sie sie wirklich brauchen.

Der Favorit wird überlastet. Lieferzeiten ziehen sich. Defekte schleichen sich ein. Genau das, was ihn zum Default-Lieferanten gemacht hat, beginnt zu rutschen.

Sie haben 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.

Rotation verhindert alle drei, indem sie jedem aktiven Lieferanten einen fairen, vorhersehbaren Anteil an der Arbeit gibt und Ihre Präferenzen trotzdem respektiert.

Was Rotation tatsächlich macht

Jeder Lieferant hat ein Bestellkontingent, 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 eine neue Bestellung hereinkommt, 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 greift, und wann sie aussetzt

Rotation tut nur dann etwas Sinnvolles, wenn es eine klare Wahl zwischen gleich fähigen Lieferanten gibt. Wenn ein Kunde 4 verschiedene Produkte 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 das 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 Katalog hauptsächlich Einzelpositionen-Bestellungen umfasst (ein Produkt pro Warenkorb), feuert die Rotation bei fast jeder Bestellung. Wenn Ihr Katalog stark gebündelt ist oder Kunden 5+ Produkte gleichzeitig kaufen, greift Rotation seltener. Das ist der Preis dafür, eine saubere Antwort dort zu geben, wo sie sauber ist.

Wie man den nächsten Lieferanten auswählt

Angenommen, 3 Lieferanten können die Bestellung erfüllen, alle unter ihrem Kontingent. Wie entscheiden Sie?

Sortieren Sie nach 4 Feldern, in dieser Reihenfolge:

  1. Priorität (absteigend). Ops kann einen Lieferanten im Admin höher anpinnen. Nützlich für neue Partnerschaften, Exklusivverträge oder saisonale Pushes.
  2. Kontingent (absteigend). Grösseres Kontingent heisst mehr Kapazität. Grössere Kapazität geht zuerst.
  3. 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.
  4. 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 funktioniert, ist, dass diese 4 Felder die Hebel abdecken, die Ops wirklich zieht. Ein Hersteller hält seine Hauptfabrik nahe Vollauslastung, während eine Backup-Fabrik hochgefahren wird. Ein Dropshipper testet einen neuen Grosshändler mit einem kleinen Anteil, während der bewährte Lieferant das Volumen trägt. Gleiche Sortierung, andere Zahlen.

Das System hat kein Machine Learning, keine Forecasts, keine gleitenden Durchschnitte. Operatoren vertrauen dem, was sie vorhersehen können, und eine Sortierung über 4 Felder ist vorhersehbar.

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 3 Edge Cases, die Rotation in der Praxis kaputt machen

Die meisten Rotationssysteme funktionieren beim Pick-Schritt selbst. Sie scheitern an dem langweiligen Drumherum. Wer diese drei Ecken falsch macht, bekommt ein Plugin, das sich verflucht anfühlt.

Doppelklicks und doppelte Sends

Operatoren klicken zweimal auf “Senden”. Netzwerke ruckeln. Die Shopware Message Queue wiederholt 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 einem Datenbank-Lock während des Picks, damit zwei Bestellungen, die in derselben Millisekunde landen, nicht denselben Slot greifen können. Shopwares Datenschicht gibt Ihnen das nicht geschenkt. Sie müssen es schreiben.

Wenn jeder Lieferant sein Kontingent erreicht

Was passiert, wenn alle infrage 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

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, und der Zyklus läuft weiter. Einen Override wie einen frischen Zyklus zu behandeln, korrumpiert die Mathematik.

Hersteller und Dropshipper

Gleiches Plugin, andere Form.

Dropshipper haben typischerweise Lieferanten, die sich auf Hunderten von SKUs überschneiden. Der Gewinn ist Zuverlässigkeit und Lieferantengesundheit. Indem Sie Bestellungen 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 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. Mehrere Lieferanten können denselben Job machen. Sie wollen faire, vorhersehbare Verteilung, die Kapazität respektiert. 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” ist einfach derjenige, an den Sie die Bestellung schicken. Die Rotation kümmert sich nicht um den Titel auf seiner Rechnung.

Ein Rotations-Plugin liefern, ohne sich in eine Ecke zu malen

Wenn Sie ein individuelles Plugin dafür scopen, sind die strukturellen Entscheidungen wichtiger als die Rotationsmathematik.

Ein paar Regeln, die ich bei jedem Bau befolge.

  1. Dekorieren, nicht überschreiben. Der Order-Placement-Service sollte dekoriert werden. Overrides brechen bei jedem Minor-Update. Decoration überlebt. Dieselbe Regel gilt für die Admin-Komponenten, in denen Sie Kontingente und Priorität freigeben.
  2. Schwere Arbeit in die Message Queue. Wenn Ihr Plugin externe API-Calls macht (Lager-Stock-Checks, ERP-Sync, Lieferantenportal-Posts), blockieren Sie das Order-Placement nicht damit. Nutzen Sie die Message Queue.
  3. Routing-Entscheidungen auf der Bestellung speichern. Nutzen Sie ein Custom Field auf der Order Entity. Die Zuweisung wird damit idempotent, im Admin abfragbar und für Ops sichtbar, ohne dass Sie einen eigenen Screen bauen müssen.
  4. Migrationen für alles. Jede Schemaänderung kommt mit einer Shopware-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.
  5. Konfigurierbare Kontingente im Admin. Operatoren setzen Kontingent und Priorität über das Lieferanten-Admin-Modul, nicht in einer Konfigurationsdatei. 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 einfaches 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.

Der Kern, der das alles nützlich macht, ist faire Verteilung mit vorhersehbarem Verhalten. Wenn die einfache 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.

Womit Sie diese Woche anfangen

Wenn Sie vermuten, dass ein Lieferant in Ihrem Shopware-6-Shop 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, kann Rotation nicht helfen. Die erste Lücke, die geschlossen werden muss, ist Sourcing weiterer Lieferanten, dann zwischen ihnen rotieren.

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 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 selbst. Die Arbeit, die länger dauert, ist sicherzustellen, dass die Regeln zu der Art passen, wie Ihre Operatoren wirklich arbeiten.

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 geht von einem einzigen Fulfillment-Pfad aus. Multi-Lieferanten-Routing erfordert ein individuelles Plugin, das in den Order-Placement-Flow eingreift.

Wann greift Rotation? Nur wenn ein Lieferant die gesamte Bestellung in der richtigen Menge erfüllen kann. Gemischte Bestellungen umgehen Rotation und nutzen einen Multi-Lieferanten-Pfad. Das ist der häufigste Grund, warum Rotation aussieht, als würde sie nicht funktionieren.

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. Sperren Sie das Lesen mit einem Datenbank-Lock, damit gleichzeitige Bestellungen nicht denselben Slot greifen.

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 Plugin ist identisch. Es ändert sich nur die Bedeutung von “Lieferant”: Fabrik, 3PL, Grosshändler oder Marktplatz-Partner. Rotation, Kontingente, Prioritäten und Reset-Regeln bleiben gleich.

Artikel teilen

Fanden Sie das hilfreich? Teilen Sie es mit Ihrem Netzwerk

Huzaifa Mustafa

Huzaifa Mustafa

Shopware 6 zertifizierter Entwickler mit 164+ individuellen Plugins und 96+ Kunden in der DACH-Region. Ich schreibe über Shopware-Architektur, E-Commerce-Performance und Erfahrungen aus realen Projekten.

Brauchen Sie Hilfe mit Shopware?

Lassen Sie uns besprechen, wie ich bei Ihrem E-Commerce-Projekt helfen kann.