Basket Completion: Ein datengestützter Ansatz für smartere E-Commerce-Upsells

19 August 2026

17 minute read

Die meisten Upsell-Systeme starten mit einer einfachen Frage:

Welches Produkt sollen wir diesem Kunden empfehlen?

Es gibt oft eine bessere:

Welches Produkt fehlt in diesem Warenkorb?

Der Unterschied klingt klein, verändert aber, wie Empfehlungen funktionieren. Statt zu raten, was einem Shopper generell gefallen könnte, können wir aus historischen Bestellungen lernen, welche Produkte natürlicherweise zusammengehören.

Wenn Tausende Kund:innen, die A und B gekauft haben, auch C gekauft haben, ist jemand mit A und B im Warenkorb ein starker Kandidat für C. Das ist der Kern eines Basket-Completion-Modells: Empfehlungen, die auf echtem Kaufverhalten basieren - nicht auf manuellen Regeln, Produktähnlichkeit oder generischen Bestsellern.

Die Grundidee

Stell dir einen Shopify-Katalog mit drei Produkten vor: A, B und C. Historische Bestellungen zeigen, dass die Kombination A + B + C besonders oft vorkommt.

Allein das sagt: Die drei Produkte gehören zusammen. Nützlicher ist, wie wir diesen Warenkorb in unvollständige Körbe zerlegen:

Vorhandener WarenkorbFehlendes Produkt
A + BC
A + CB
B + CA

Jede Zeile stellt eine andere Frage: Von Kund:innen, die bereits diese Teilmenge hatten - wie oft haben sie auch den fehlenden Artikel gekauft? Die Richtung ist entscheidend: Wir speichern nicht „diese Produkte sind verwandt“, sondern Completion-Regeln.

1. Starte mit historischen Bestellungen

Behandle jede Bestellung als Menge von Produkten. Mengen kannst du anfangs meist ignorieren: zwei Einheiten A und eine Einheit B werden trotzdem zu {A, B}.

Beispiel-Historie:

BestellungProdukte
#1A
#2A, B
#3A, B, C
#4A, B, C
#5A, B, D
#6A, C
#7A, B, C
#8B, C
#9A, C, D
#10A, B, C

Das Signal, das zählt, ist Co-Occurrence: Welche Produkte tauchten im selben Warenkorb auf?

2. Zerlege Warenkörbe in kleinere Kombinationen

Eine Bestellung mit drei Produkten {A, B, C} ergibt die Zwei-Produkt-Teilmengen {A, B}, {A, C} und {B, C} - jeweils mit einem fehlenden Completion-Kandidaten.

Aus einem vollständigen Warenkorb speichern wir drei gerichtete Beziehungen:

  • Kund:innen mit A + B legen häufig C hinzu
  • Kund:innen mit A + C legen häufig B hinzu
  • Kund:innen mit B + C legen häufig A hinzu

3. Zähle, wie oft jeder Warenkorb vervollständigt wird

Über Hunderttausende Bestellungen hinweg könnten wir sehen:

Vorhandener WarenkorbZusätzliches ProduktBestellungen
A + BC4.000
A + BD1.200
A + BE300
A + CB4.000
A + CD500
B + CA4.000

Rohe Zählungen legen schon nahe, für A + B C zu empfehlen - aber Häufigkeit allein reicht nicht.

4. Berechne die Wahrscheinlichkeit für das fehlende Produkt

Angenommen, A + B + C kommt in 4.000 Bestellungen vor. Das klingt stark - bis wir erfahren, dass A + B in 1.000.000 Bestellungen vorkommt. Dann vervollständigt C nur 0,4% dieser Warenkörbe.

Was wir wirklich wollen, ist die bedingte Wahrscheinlichkeit (Confidence im Sinne von Assoziationsregeln):

P(CA,B)=Bestellungen mit A,B,CBestellungen mit A,BP(C \mid A,B) = \frac{\text{Bestellungen mit } A,B,C}{\text{Bestellungen mit } A,B}

Wenn 10.000 Bestellungen A + B enthalten und 4.000 davon A + B + C:

P(CA,B)=400010000=0.40=40%P(C \mid A,B) = \frac{4000}{10000} = 0.40 = 40\%

Auf Deutsch: 40% der historischen A-+-B-Warenkörbe enthielten auch C.

Conditional probability for A + B

Of historical orders that contained A and B, how often did each candidate also appear?

5. Die Richtung ist extrem wichtig

Dieselben drei Produkte können sehr unterschiedliche Empfehlungsstärken erzeugen - je nachdem, was schon im Warenkorb liegt.

Bei 10.000 A-+-B-Bestellungen und 4.000 A-+-B-+-C-Bestellungen:

P(CA,B)=40%P(C \mid A,B) = 40\%

Aber wenn nur 5.000 Bestellungen A + C enthalten (und dieselben 4.000 A + B + C):

P(BA,C)=80%P(B \mid A,C) = 80\%

Also ist A + B → C mit 40% schwächer als A + C → B mit 80% - obwohl der Cluster {A, B, C} identisch ist. Das Modell muss Warenkorb-Completion-Beziehungen bewerten, keine ungerichteten Produktcluster.

6. Ein praktisches Shopify-Beispiel

Ein Supplement-Shop verkauft Proteinpulver, Creatin, Shaker, Proteinriegel und T-Shirts.

Unter 50.000 Proteinpulver-Bestellungen:

  • 30.000 hatten auch einen Shaker → 60%
  • 20.000 hatten auch Creatin → 40%
  • 5.000 hatten auch ein T-Shirt → 10%

Für einen Ein-Artikel-Warenkorb mit Proteinpulver gewinnt der Shaker.

Eine Ebene tiefer: 20.000 Bestellungen enthielten Proteinpulver + Creatin, und 18.000 davon auch einen Shaker:

P(ShakerProtein,Creatin)=90%P(\text{Shaker} \mid \text{Protein}, \text{Creatin}) = 90\%

Niemand hat konfiguriert: „Wenn jemand Pulver und Creatin kauft, zeig diesen Shaker.“ Die Beziehung wurde aus dem Verhalten entdeckt - nicht aus Bestsellers, Collection-Zugehörigkeit oder Produktähnlichkeit.

7. Warum das anders ist als Produktähnlichkeit

Ähnlichkeits-Engines empfehlen mehr vom Gleichen: nach Laufschuhen noch mehr Laufschuhe. Das hilft bei Discovery, kann bei Upsells aber Entscheidungsreibung erzeugen.

Basket Completion tendiert zu Komplementen:

  • Laufschuhe + Socken → Laufgürtel
  • Kamera + Objektiv → Speicherkarte
  • Protein + Creatin → Shaker
  • Kaffeemaschine → Bohnen
  • Grill + Fleisch → Sauce

Das System fragt: Was kaufen Kund:innen mit einem ähnlichen Warenkorb üblicherweise, das dieser Kunde noch nicht hat?

8. Nutze alle Bestellungen, nicht nur Drei-Produkt-Warenkörbe

Eine Bestellung mit vier Produkten {A, B, C, D} liefert viele Regeln auf einmal: Implikationen von Einzelartikeln, Paar-Completions und sogar A + B + C → D. Größere Warenkörbe solltest du nicht verwerfen - sie verdichten den Graph der Completion-Regeln.

9. Spezifischere Warenkörbe erzeugen meist bessere Empfehlungen

Für einen Warenkorb mit A + B könnten wir sehen:

  • A → C mit 25%
  • B → C mit 20%
  • A + B → C mit 65%

Zu wissen, dass A und B beide vorhanden sind, transportiert mehr Intent als jedes Produkt allein. In Production solltest du den spezifischsten Match mit genug Evidenz bevorzugen und dann zurückfallen:

  1. Exakter Warenkorb A + B + C → ?
  2. Paare A + B, A + C, B + C
  3. Einzelartikel A, B, C
  4. Metadaten / Merchant-Defaults / Bestsellers

Recommendation fallback hierarchy

Prefer exact basket matches, then broaden only when evidence is thin.

10. Das Problem kleiner Stichproben

A + B + C → D = 100% mit Support von 3 Bestellungen ist weniger vertrauenswürdig als A + B → E = 72% mit 15.000 Bestellungen.

Jede Regel braucht mindestens zwei Metriken:

Confidence - wie oft der Kandidat mit dem Warenkorb vorkommt:

Confidence=Bestellungen mit Warenkorb + KandidatBestellungen mit Warenkorb\text{Confidence} = \frac{\text{Bestellungen mit Warenkorb + Kandidat}}{\text{Bestellungen mit Warenkorb}}

Support - wie viele historische Bestellungen die Regel belegen.

Ein harter Mindest-Support kann winzige Stichproben komplett verwerfen. Das hilft, ist aber grob: Eine Regel mit 50 Beobachtungen wird genauso behandelt wie eine mit 50.000, sobald beide die Schwelle schaffen - und alles darunter verschwindet, selbst wenn es Richtung gibt.

11. Nutze Bayesian Smoothing statt roher Confidence

Das ist eines der wichtigsten statistischen Upgrades für eine Basket-Completion-Engine.

Stell dir zwei Kandidaten für denselben Warenkorb A + B vor:

RegelEvidenzRohe Confidence
A + B → C1 / 1100%
A + B → D8.000 / 10.00080%

Rohe Confidence wählt C. Offensichtlich ist D die vertrauenswürdigere Empfehlung.

Statt einen einzelnen Glückstreffer als Gewissheit zu behandeln, zieht Bayesian Smoothing dünne Schätzungen zu einem Prior, bis genug Evidenz vorliegt.

Mit einem Beta-Prior, parametrisiert durchα\alpha undβ\beta, lautet die geglättete Schätzung:

P^=Erfolge+αBeobachtungen+α+β\hat{P} = \frac{\text{Erfolge} + \alpha}{\text{Beobachtungen} + \alpha + \beta}

Hier sind Erfolge Bestellungen, die den Warenkorb und den Kandidaten enthalten; Beobachtungen sind alle Bestellungen mit dem Warenkorb.

Wähle einen Prior, der eine konservative Baseline widerspiegelt - zum Beispiel einen schwachen Prior nahe der shopweiten Kaufrate des Kandidaten, oder einen schwach informativen Prior wieα=2\alpha = 2,β=18\beta = 18 (Mittelwert10%10\,\%). Dann:

  • 1 / 1 wird von100%100\,\% auf etwas wie ⁣15%\sim\!15\,\% gezogen (oder was der Prior-Mittelwert impliziert)
  • 8.000 / 10.000 bleibt nah bei80%80\,\%

Der dünne Spike bricht zusammen; die gut belegte Regel bewegt sich kaum.

Raw confidence vs Bayesian-smoothed estimate

A single co-purchase looks perfect as raw confidence; smoothing pulls it toward the prior while well-supported rules barely move.

Diese Stabilität ist besonders wichtig für kleinere Shopify-Merchant:innen, neue Produkte und Long-Tail-SKUs - genau dort, wo rohe Confidence am übermütigsten ist. Du kannst weiterhin eine weiche Support-Untergrenze behalten, aber mit Smoothing bewertet das Ranking keinen einzelnen Zufallstreffer mehr als perfekten Score.

In der Ranking-Formel der nächsten Abschnitte solltest du geglättete Confidence der rohen vorziehen:

Score=P^×log(1+Support)×Lift\text{Score} = \hat{P} \times \log(1 + \text{Support}) \times \text{Lift}

12. Beliebte Produkte können das Ergebnis verzerren

Wenn 70% der A-+-B-Bestellungen C enthalten, wirkt das hervorragend - es sei denn, C kommt in 80% aller Shop-Bestellungen vor. Dann macht A + B C nicht wahrscheinlicher; C ist einfach populär.

Lift vergleicht die bedingte Wahrscheinlichkeit mit der Basisrate:

Lift(A,BC)=P(CA,B)P(C)\text{Lift}(A,B \rightarrow C) = \frac{P(C \mid A,B)}{P(C)}

WennP(CA,B)=40%P(C \mid A,B) = 40\,\% undP(C)=10%P(C) = 10\,\%, dann istLift=4\text{Lift} = 4: Käufer:innen von A + B kaufen C viermal so häufig wie der Durchschnitt.

WennP(CA,B)=70%P(C \mid A,B) = 70\,\% undP(C)=80%P(C) = 80\,\%, ist der Lift0,8750{,}875 - A + B macht C sogar weniger wahrscheinlich als normal. Ohne Lift degradiert die Engine still zu „immer den Bestseller empfehlen“.

13. Ranking der Kandidaten

Für den Warenkorb A + B könnten wir haben:

KandidatConfidenceSupportLift
C62%8.4003,2
D74%1801,8
E38%12.0004,1

Keine einzelne Spalte gewinnt immer. Ein praktischer Score nutzt geglättete Confidence und dämpft schwachen Support:

Score=P^×log(1+Support)×Lift\text{Score} = \hat{P} \times \log(1 + \text{Support}) \times \text{Lift}

Die Formel kannst du später gegen Live-Upsell-Conversion tunen. Die Frage verschiebt sich von „Was kam am häufigsten vor?“ zu „Was hat die stärkste und zuverlässigste Beziehung zu diesem Warenkorb?“

Ranking candidates for basket A + B

Confidence alone is not enough - support and lift change which candidate should win.

14. Precompute den teuren Teil

Kombinationen über die gesamte Bestellhistorie zu minen ist teuer. Diese Arbeit kann offline nach Zeitplan laufen. Speichere Ergebnisse als Lookup-Zeilen:

WarenkorbKandidatConfidenceSupportLift
AC25%12.0001,4
A + BC62%4.2003,2
A + CB74%3.9004,1

Zur Cart- oder Post-Purchase-Zeit ist der Runtime-Pfad ein keyed Lookup für die aktuelle Warenkorb-Menge, danach Ranking und Filter - schnell genug für Storefront-UX.

15. Business-Regeln bleiben wichtig

Wahrscheinlichkeit sollte nicht ungeprüft ausgeliefert werden. Vor der Anzeige filtere Kandidaten:

  • Schon im Warenkorb?
  • Auf Lager / Variante verfügbar?
  • Markt- und Channel-fähig?
  • Merchant-Exclusions?
  • Kompatibel mit Abo / Selling Plan?
  • Preisband akzeptabel?
  • Veröffentlicht und kaufbar?

Halte zwei Schichten klar getrennt:

  • Empfehlungs-Schicht - statistisch beste Completion
  • Commerce-Schicht - was tatsächlich angeboten werden darf

16. Cold Start und dünne Daten

Große Shops haben vielleicht Millionen Bestellungen; kleine Shops oder neue SKUs fast keine. Nutze die Fallback-Hierarchie aus Abschnitt 9, damit Verhaltensdaten gewinnen, wenn sie existieren - ohne leere Zustände, wenn sie fehlen.

17. Das Modell kann sich kontinuierlich verbessern

Eine erste Version braucht kein ML - nur Bestellungen, Kombinationen, Zähler, Confidence (idealerweise Bayesian-geglättet), Support, Lift und Ranking. Sobald live:

  • Impressions, Klicks, Accept-Rate
  • Conversion und inkrementeller Umsatz
  • inkrementelle Bruttomarge
  • durchschnittlicher Upsell-Wert

Historische Co-Purchases sagen: Kund:innen haben C oft mit A + B gekauft. Live-Daten sagen: Kund:innen haben C akzeptiert, als es angeboten wurde. Das zweite Signal ist das, worauf du langfristig optimieren solltest.

18. Optimiere Expected Value, nicht nur Wahrscheinlichkeit

Das wahrscheinlichste Add-on ist nicht immer das beste Angebot.

Angenommen für A + B:

  • C konvertiert mit 25% und €3 inkrementeller Marge → Expected €0,75
  • D konvertiert mit 15% und €15 inkrementeller Marge → Expected €2,25
ExpectedValue=P(KaufWarenkorb,Empfehlung)×InkrementellerWert\text{ExpectedValue} = P(\text{Kauf} \mid \text{Warenkorb}, \text{Empfehlung}) \times \text{InkrementellerWert}

D gewinnt bei Expected Margin trotz niedrigerer Conversion.

Expected incremental margin

A lower conversion rate can still win if the incremental margin is high enough.

Eine reife Engine entwickelt sich von „wahrscheinlichste Completion“ zu „höchster erwarteter inkrementeller Wert für diesen Warenkorb (und irgendwann diesen Kunden)“.

Von Basket Completion zur intelligenten Upsell-Engine

Der Ansatz kann fast naiv starten:

  1. Historische Shopify-Bestellungen in Warenkörbe verwandeln
  2. Warenkörbe in Kombinationen zerlegen
  3. Completions fehlender Produkte zählen
  4. Confidence mit Bayesian Smoothing berechnen, plus Support und Lift
  5. Kandidaten ranken und Commerce-Filter anwenden
  6. Precomputete Lookups zur Cart- / Post-Purchase-Zeit ausliefern
  7. Den Loop mit Live-Accept- und Margen-Daten schließen

Ein live Warenkorb {A, B} wird zur Query:

{A,B}?\{A,B\} \rightarrow ?

und der historische Graph kann C antworten, weil Tausende früherer Kund:innen gezeigt haben:

Wenn du A und B kaufst, fehlt dir wahrscheinlich C.

Das ist eine andere Philosophie als klassische „empfohlene Produkte“. Statt zu raten, was einem Shopper gefallen könnte, lernt das System wie echte Kund:innen ihre Warenkörbe vervollständigen - und die Bestellhistorie selbst wird zur Recommendation Engine.

Wie das von Shopifys nativen Empfehlungen abweicht

Es gibt Überschneidungen mit dem, was Shopify bereits anbietet. Ein architektonischer Unterschied sticht trotzdem heraus.

Was Shopify macht

Shopify sagt, dass automatisch generierte Related-Product-Empfehlungen nutzen können:

  • Kaufhistorie - Produkte, die historisch zusammen gekauft wurden
  • ähnliche Produktbeschreibungen
  • verwandte Collections als Fallback

Shopifys öffentliche API ist grundsätzlich produktzentriert. Du fragst Empfehlungen für eine bestimmte productId oder einen productHandle ab, und Shopify gibt bis zu 10 Empfehlungen zurück.

Konzeptionell:

Die aktuelle Shopify-Entwicklerdokumentation sagt: Related-Empfehlungen werden automatisch generiert, während Complementary-Empfehlungen manuell über Search & Discovery konfiguriert werden müssen.

Shopify nutzt also durchaus Co-Purchase-Informationen. Die dokumentierte Storefront-Recommendation-Schnittstelle ist aber keine allgemeine Basket-Completion-API.

Der Warenkorb ist der Input, nicht ein einzelnes Produkt

Dieses Modell startet mit dem gesamten aktuellen Warenkorb.

Das ist ein anderes Problem als:

Betrachte diese historischen Daten:

  • A → C = 20%
  • B → C = 18%
  • A + B → C = 82%

A oder B einzeln zu betrachten, legt die wichtige Beziehung nicht offen. Die Kombination tut es.

Das System erfasst die InteraktionP(CA,B)P(C \mid A,B) statt nurP(CA)P(C \mid A) oderP(CB)P(C \mid B). Dieser Unterschied ist für Upsells extrem wertvoll.

Ein konkretes Beispiel

Stell dir einen Supplement-Shop vor. Ein Kunde hat Whey-Protein + Creatin.

Shopifys produktbezogenes System könnte effektiv Beziehungen wie diese haben:

Das ist nützlich. Basket Completion fragt etwas Spezifischeres:

Historische Daten könnten zeigen: Whey + Creatin → Shaker mit Confidence 78%, Support 12.430 und Lift 3,7.

Die Empfehlung ist dann nicht mehr nur „Leute, die Whey kaufen, kaufen auch Shaker.“ Sie lautet: Kund:innen, die genau diese Kombination kaufen, kaufen einen Shaker 3,7× häufiger als der Durchschnitt. Das ist ein stärkeres Warenkorb-Signal.

Wo die Architektur weitergehen kann

Die in diesem Artikel beschriebene volle Architektur geht deutlich über das hinaus, was Shopify öffentlich dokumentiert:

FähigkeitShopify nativBasket-Completion-Engine
Purchase-History-SignalJaJa
ProduktähnlichkeitJaKann ergänzt werden
Collection-BeziehungenJaKann ergänzt werden
Einzelprodukt-EmpfehlungenJaJa
Multi-Produkt-Warenkorb-MatchingNicht öffentlich als Recommendation-API-Modell dokumentiertJa
A + B → C-RegelnNicht exponiert / dokumentiertJa
ConfidenceNicht exponiertJa
SupportNicht exponiertJa
LiftNicht exponiertJa
Bayesian SmoothingNicht exponiertKann ergänzt werden
Time DecayNicht exponiertKann ergänzt werden
Promotion CorrectionNicht exponiertKann ergänzt werden
Margen-OptimierungNicht exponiertKann ergänzt werden
Upsell-Conversion-LernenNicht als Ranking-Steuerung exponiertKann ergänzt werden
Exploration / BanditsNicht exponiertKann ergänzt werden
KundenhistorieIn dieser API nicht exponiertKann ergänzt werden

Sei vorsichtig mit der Behauptung, Shopify würde intern keine dieser Techniken nutzen. Shopify veröffentlicht die internen Details seines Recommendation-Algorithmus nicht - das können wir also nicht wissen.

Die belastbare Aussage ist: Shopify exponiert und dokumentiert dieses Niveau von warenkorb-bewusstem Ranking und Optimierung öffentlich nicht.

Die größte Chance ist nicht, Shopify bei Empfehlungen zu schlagen

Shopifys natives System ist primär auf Product Discovery ausgelegt. Die Related-Product-Dokumentation beschreibt das Ziel als: Produkte empfehlen, die dem Produkt ähneln, mit dem die Kund:innen gerade interagieren.

Basket Completion hat ein engeres Ziel: inkrementellen Wert aus einer Upsell-Gelegenheit maximieren.

Dir muss nicht unbedingt interessieren, ob C das „relevanteste“ Produkt ist. Dich interessiert, ob das Zeigen von C dazu führt, dass mehr ausgegeben wird als ohne die Empfehlung.

Irgendwann kann das System so scoren:

Score(C)=P(C akzeptiertWarenkorb,Kunde,Kontext)×Marge(C)\text{Score}(C) = P(C \text{ akzeptiert} \mid \text{Warenkorb}, \text{Kunde}, \text{Kontext}) \times \text{Marge}(C)

Dann betrachte einen Warenkorb Protein €35 + Creatin €25 = €60:

KandidatAcceptanceMargeExpected Margin
Shaker €1024%€6€1,44
Proteinriegel €335%€1€0,35
Pre-Workout €3011%€18€1,98
BCAA €208%€12€0,96

Der Shaker hat die stärkste Warenkorb-Beziehung. Der Proteinriegel hat die höchste Conversion-Wahrscheinlichkeit. Pre-Workout erzeugt die höchste erwartete inkrementelle Marge - und könnte deshalb die optimale Empfehlung sein.

Das ist kein Standard-„People also bought“ mehr. Es ist eine Optimierungs-Engine.

Ein weiterer Vorteil: Du siehst den tatsächlichen Warenkorb

Das ist besonders relevant für ein Upsell-Produkt. Shopifys dokumentierte Recommendation-Query nimmt ein Produkt als Input.

Die Engine kann Kunde, gesamten Warenkorb, Bestellhistorie, Warenkorbwert, aktuelle Produkte, Preise, Bestand, frühere Käufe, Upsell-Impression-Historie und Upsell-Conversion-Historie nehmen - und beantworten: Was soll ich diesem konkreten Kunden genau jetzt zeigen?

StattRecommendation(Product)\text{Recommendation}(\text{Product}) ist das ZielRecommendation(Customer,Basket,Context)\text{Recommendation}(\text{Customer}, \text{Basket}, \text{Context}):

argmaxxE[IncrementalMarginCustomer,Basket,Context,Show(x)]\operatorname*{argmax}_{x} \mathbb{E}[\text{IncrementalMargin} \mid \text{Customer}, \text{Basket}, \text{Context}, \text{Show}(x)]

Das ist deutlich ambitionierter.

Wie du die Idee positionierst

Pitch es nicht als „wir haben einen besseren Recommendation-Algorithmus als Shopify.“ Das ist schwer zu belegen, weil Shopify intern nicht alles offenlegt.

Ein besserer Frame: Shopify empfiehlt Produkte. Wir optimieren den nächsten Kauf.

Oder technisch: Klassische Empfehlungen fragen, welche Produkte verwandt sind. Eine Basket-Completion-Engine fragt, welches Produkt in diesem konkreten Warenkorb fehlt - und irgendwann, welche Empfehlung den höchsten erwarteten inkrementellen Wert erzeugt.

Dieser Unterschied ist sowohl belastbar als auch, für ein Upsell-Produkt, deutlich interessanter.

Artikel teilen