Skip to main content
Der Abschnitt checkout umfasst alles, was den Bestellprozess in der Storefront steuert: von der einfachen Gast- oder Schnellbestellung über eigene Eingabefelder bis zur Rundung von Zwischensummen. Er ermöglicht zudem eine schnelle Artikelerfassung per Artikelnummer, prüft bei Bedarf Warenkorbinhalte gegen Regeln (z. B. Pflichtzubehör), verwaltet Versandarten inklusive Preislogik und bindet Paketverfolgung an.

checkout* - Grundstruktur

Nachfolgend der Grundaufbau des Knotens checkout

Parameterübersicht

checkout.checkout - Bestellablauf

Dieser Abschnitt bündelt die zentralen Einstellungen des Bestellprozesses. Er richtet sich an Shop-Betreiber, die den Ablauf kaufmännisch festlegen, und an Frontend-Entwickler, die das Ergebnis im Template ausgeben. Vorausgesetzt wird, dass Sie mit dem grundsätzlichen Bestellablauf vertraut sind. Festgelegt wird hier, wie der Bestellprozess abläuft, welche Zusatzfelder erscheinen und wie Versand- und Zahlungsarten vorausgewählt werden. Ebenfalls hier angesiedelt sind die Regeln für Gutschein-Berechnungen, ein Mindermengenzuschlag, die Behandlung von Adressen aus dem PayPal Express Checkout und der Zeitpunkt, ab dem Feldfehler sichtbar werden. Nicht in diesem Abschnitt behandelt: Versandarten und deren Preislogik stehen unter checkout.shippingMethod, die Rundung von Gutscheinbeträgen unter checkout.voucher, die Fehlertexte zu wirkungslosen Gutscheinen unter checkout.voucherErrors, Zahlungsarten unter payment.payment. Die Einstellungen wirken an vier verschiedenen Stellen im Ablauf. Diese Einordnung hilft beim Finden des passenden Parameters:
  • Vor der Bestellung - Zugang und Vorauswahl: Wer darf bestellen (allowGuestAccounts, allowFastOrder), was ist vorausgewählt (defaults), welche Zusatzfelder erscheinen (freeFields).
  • Während der Bestellung - Berechnung: Rundung der Zwischensumme (subtotalRounding), Gutschein-Verrechnung (voucherAppliesPerItem, minOrderValueCalculation, minOrderValueIgnoreVoucherReduction, disableOrderOnIneffectiveVoucher) und der Mindermengenzuschlag (surcharge).
  • Während der Bestellung - Anzeige von Fehlern: fieldErrorVisibility.
  • Nach der Bestellung: welche Templates noch auf die Bestelldaten zugreifen dürfen (templatesAfterCheckout).
Nachfolgend eine Beispielkonfiguration für checkout.checkout:

Parameterübersicht

Ob eine Gastbestellung mit einer bereits registrierten E-Mail-Adresse erlaubt ist, wird nicht hier festgelegt, sondern in der Konfiguration der Aktion CheckoutSetGuestEmail unter restrictions.allowGuestOrderWithRegisteredEmail.
Prioritätslogik für defaults: Wenn mehrere Quellen (z.B. Benutzerauswahl oder Kundenpräferenzen) einen Wert für ein Feld in defaults liefern, gilt folgende Rangfolge der Priorisierung:
  1. Aktive Benutzerauswahl in der aktuellen Sitzung - wird niemals automatisch überschrieben.
  2. Gespeicherte Kundenpräferenzen eines eingeloggten Kunden (sofern unterstützt).
  3. Händler-Konfiguration - die hier definierten defaults-Werte.
  4. System-Fallback - z.B. automatische Auswahl bei nur einer verfügbaren Option oder erste gültige Option nach Sortierung (siehe autoSelectSingleOption).
Neuauswahl, wenn eine gewählte Art nachträglich ungültig wird:Die Prioritätslogik oben gilt für die Erstauswahl. Wird dagegen eine bereits getroffene, aber inzwischen ungültige Auswahl behandelt - etwa weil der Kunde das Lieferland wechselt und die gewählte Versandart dort nicht angeboten wird -, steuert prevSelectionInvalidAutoSelect, wie der Shop reagiert (siehe Tabelle oben). autoSelectSingleOption bleibt dabei in allen Modi als Rückfallebene aktiv.
Hinweis zum Rundungsverhalten bei positionsbasierter Gutschein-Berechnung:
Wenn „voucherAppliesPerItem” auf „true” gesetzt ist und ein prozentualer Gutschein mit einem konfigurierten Maximalbetrag verwendet wird, kann der gewährte Rabatt diesen Maximalbetrag um bis zu 0,01 € überschreiten. Grund dafür ist, dass der Rabatt pro Position einzeln gerundet wird und die Summe dieser Rundungen minimal vom erwarteten Gesamtbetrag abweichen kann.

Mindermengenzuschlag

Der Mindermengenzuschlag ist ein fester Betrag, der auf kleine Warenkörbe aufgeschlagen wird. Damit deckt der Shop die Bearbeitungs- und Versandkosten, die bei einer Kleinbestellung anteilig zu hoch ausfallen. Der Shop berechnet den Zuschlag bei jeder Warenkorb-Berechnung neu, in dieser Reihenfolge:
  1. Der Shop bildet die Summe der zuschlagspflichtigen Positionen. Gezählt wird die Positionssumme, also Preis mal Menge. Unterpositionen eines Sets zählen nicht mit, weil sie sonst doppelt in die Summe eingehen würden.
  2. Enthält der Warenkorb keine zuschlagspflichtige Position, fällt kein Zuschlag an.
  3. Übersteigt die Summe den Wert threshold, fällt kein Zuschlag an.
  4. Andernfalls wird cost als Zuschlag berechnet.
Der Vergleich in Schritt 3 ist ein „größer als”. Bei "threshold": 30 und einer Summe von genau 30,00 € fällt der Zuschlag also noch an, ab 30,01 € nicht mehr. Setzen Sie den Schwellenwert entsprechend auf den letzten Betrag, für den noch zugeschlagen werden soll. Standardmäßig ist jede Position zuschlagspflichtig. Ausnehmen können Sie einzelne Produkte über das Produktfeld, das unter content.usedFields.validForSurcharge hinterlegt ist: Liefert dieses Feld für eine Position false, zählt sie weder für die Prüfung mit, noch löst sie den Zuschlag aus. Das ist etwa für Gutscheinprodukte oder digitale Artikel sinnvoll, die keinen Bearbeitungsaufwand verursachen. Ein Beispiel: Ein Zuschlag von 1,99 € soll bis zu einem Warenwert von 30 € anfallen. Die Konfiguration in checkout.checkout lautet dann:
Ausgabe in der Kostenaufstellung des Templates. Der Zuschlag steht als berechneter Betrag in $wsCheckout.sum.surchargeCost; ist er 0, wird die Zeile nicht ausgegeben:
Erwartete Wirkung: Bei einem Warenkorb von 24,50 € erscheint die Zeile mit 1,99 €, und die Gesamtsumme steigt auf 26,49 €. Bei einem Warenkorb von 45,00 € entfällt die Zeile.

Wirkungslose Gutscheine blockieren

Ein Kunde kann einen Gutschein einlösen, der im aktuellen Warenkorb gar keinen Rabatt bewirkt. Bestellt er in diesem Zustand, entsteht eine Rückfrage oder Reklamation, weil der erwartete Rabatt fehlt. disableOrderOnIneffectiveVoucher verhindert das. Der Ablauf:
  1. Der Kunde löst einen Gutschein ein. Der Gutschein liegt in der Session.
  2. Bei jeder Berechnung prüft der Shop für jeden eingelösten Gutschein, ob er im aktuellen Warenkorb einen Rabatt größer 0 erzeugt.
  3. Als wirkungslos gilt ein Gutschein in zwei Fällen: Der Warenkorb erreicht den Mindestbestellwert nicht, oder der berechnete Rabatt ist 0, weil keine Position im Warenkorb für diesen Gutschein rabattfähig ist. Welcher der beiden Fälle vorliegt, ist im Template auswertbar. Die genauen Regeln stehen unter Wann welcher Fehler entsteht.
  4. Reine Versandkosten-Gutscheine ohne Prozent- und ohne Absolutwert sind davon ausgenommen. Sie wirken über die Versandkosten und blockieren die Bestellung nie.
  5. Ist disableOrderOnIneffectiveVoucher aktiv und mindestens ein Gutschein wirkungslos, meldet der Shop die Bestellung als gesperrt.
Im Template lesen Sie den Zustand über das Flag $wsCheckout.isOrderBlockedByIneffectiveVoucher und deaktivieren den Bestellbutton. Über die Liste $wsCheckout.ineffectiveVoucherErrors nennen Sie dem Kunden zusätzlich den Grund und den betroffenen Gutschein:
Erwartete Wirkung: Nach dem Einlösen eines Gutscheins mit 50 € Mindestbestellwert in einen Warenkorb über 20 € wird der Bestellbutton deaktiviert, und der Hinweis nennt den Gutschein samt Grund. Nach dem Auffüllen des Warenkorbs über 50 € ist der Button wieder aktiv, und die Liste ist leer. Die ausgegebenen Texte pflegen Sie nicht hier, sondern im Konfigurationsknoten checkout.voucherErrors. Den Aufbau der einzelnen Fehlerobjekte finden Sie in der Modul-Referenz unter $wsCheckout.ineffectiveVoucherErrors. Setzen Sie den Parameter nur dann auf false, wenn Kunden in Ihrem Shop bewusst Gutscheine im Warenkorb liegen lassen dürfen, ohne dass diese wirken.

Adressen aus dem PayPal Express Checkout

Startet ein Kunde den PayPal Express Checkout aus dem Warenkorb, liefert PayPal die dort hinterlegte Adresse zurück. Diese Adresse erfüllt die Prüfregeln Ihres Shops nicht immer - etwa weil PayPal keine Hausnummer getrennt übergibt. expressCheckoutSkipsAddressValidation legt fest, wie der Shop damit umgeht. true (Default): Der Shop prüft die Adresse nicht und übernimmt sie nicht als Rechnungs- oder Lieferadresse der Bestellung. Sie bleibt in der Session und steht in den Bestelldaten unter paypalCheckout.rawAddress. Drittsysteme können sie dort auslesen und bei Bedarf selbst weiterverarbeiten. Der Default true hält damit die Adressdaten des Shops frei von ungeprüften Fremddaten - die Lieferadresse im Shop bleibt sauber. false: Die Adresse wird direkt von PayPal als normale Adresse übernommen. Dann muss sie auch die Prüfregeln des Shops erfüllen. Da sie ungeprüft aus dem PayPal-Konto stammt, kann es passieren, dass sie diesen Regeln nicht entspricht. In diesem Fall muss der Kunde die Adresse vor dem Bestellabschluss bearbeiten - der Express Checkout verliert damit seinen Vorteil, ohne zusätzlichen Eingabeschritt abschließbar zu sein. Unabhängig von dieser Einstellung werden die Adressdaten dem Kunden angezeigt, soweit PayPal sie liefert. Übergibt PayPal beispielsweise keine Straße, wird auch keine Straße angezeigt. Ausschnitt aus den Bestelldaten bei aktivem Parameter:
Bei aktivem Parameter enthalten die regulären Adressfelder der Bestellung keine Adresse aus dem Express Checkout. Es kann also eine Bestellung ohne reguläre Adressdaten entstehen. Ob eine solche Bestellung weiterverarbeitet werden kann, hängt vom angebundenen Connector ab. Prüfen Sie das, bevor Sie den Express Checkout produktiv nehmen.
true ist der Standardweg für den PayPal Express Checkout: Der Shop prüft die Adresse nicht und übernimmt sie nicht. Deaktivieren Sie den Parameter nur nach Prüfung, denn Auswirkungen auf den Express Checkout selbst sind nicht auszuschließen. Die Anforderungen von PayPal an diesen Ablauf bildet diese Dokumentation nicht ab - klären Sie sie bei Bedarf direkt mit PayPal.

Templates nach dem Bestellabschluss

Nach dem Bestellabschluss gilt die Session als beendet. Die Bestelldaten stehen dann nur noch den Templates zur Verfügung, die zur Bestellbestätigung zählen. Ruft der Kunde ein anderes Template auf, erhält er eine neue Session. In dieser neuen Session sind die Bestelldaten nicht mehr erreichbar. Das ist beabsichtigt: Eine abgeschlossene Bestell-Session soll nicht länger als nötig weiterleben. Die Zielseite nach dem Checkout ist automatisch enthalten. Jedes weitere Template, das Bestelldaten braucht, müssen Sie in templatesAfterCheckout eintragen - typischerweise eine PDF-Bestellbestätigung:
Erwartete Wirkung: Ohne diesen Eintrag ist die PDF-Bestellbestätigung leer, weil $wsCheckout.orderId und die übrigen Bestelldaten in der neuen Session fehlen. Mit dem Eintrag werden Bestellnummer, Positionen und Summen ausgegeben. Fehlende Bestelldaten auf einer Folgeseite nach dem Checkout sind deshalb fast immer ein fehlender Eintrag in dieser Liste.

Fehleranzeige im Checkout

Nicht jeder Fehler soll dem Kunden sofort gezeigt werden. Ein leeres Pflichtfeld rot zu markieren, bevor der Kunde es überhaupt erreicht hat, wirkt wie ein Fehler des Kunden. Eine falsch formatierte Postleitzahl dagegen sollte er sofort korrigieren können. fieldErrorVisibility trennt diese Fälle nach Fehlerart.
Nach dem Klick auf „Kaufen” werden standardmäßig alle Fehler angezeigt, unabhängig von dieser Einstellung.Im Checkout gibt es grundsätzlich zwei Arten von Fehlern:
  • Fehler, die das System selbst erkennt (z.B. „Pflichtfeld leer”, „ungültige PLZ”):
    Diese werden über $wsCheckout.problems.* bereitgestellt und lassen sich vollständig über die show*BeforeSubmit-Parameter steuern.
  • Fehler, die der Server zurückmeldet (z.B. nach dem Klick auf „Kaufen”):
    Hier greifen die Einstellungen der show*BeforeSubmit-Parameter nur teilweise. Bei Kundendaten und Draft-Adressen steht $wsCheckout.problems.* nicht zur Verfügung, deshalb werden die Serverfehler dort stattdessen über die show*BeforeSubmit-Parameter gefiltert. In allen anderen Bereichen des Checkouts (z.B. bei der Zahlungsart) werden Serverfehler immer sofort angezeigt, unabhängig von der Konfiguration.

checkout.voucher - Einstellungen für Gutscheine

In diesem Abschnitt werden die Einstellungen für die Verwendung von Gutscheinen im Bestellprozess gebündelt. Hier wird unter anderem festgelegt, wie viele Gutscheine ein Kunde gleichzeitig einlösen kann und wie Rabattbeträge bei prozentualen Gutscheinen rechnerisch gerundet werden. Nachfolgend eine Beispielkonfiguration für checkout.voucher:

Parameterübersicht

checkout.voucherErrors - Fehlertexte zu wirkungslosen Gutscheinen

Ein eingelöster Gutschein kann im aktuellen Warenkorb wirkungslos sein. Damit der Kunde nicht nur einen allgemeinen Hinweis liest, sondern den konkreten Grund erfährt, pflegen Sie in diesem Knoten je Fehlerfall einen eigenen Text. Der Shop übersetzt den passenden Text und stellt ihn im Template über $wsCheckout.ineffectiveVoucherErrors bereit. Der Knoten enthält ausschließlich Texte. Ob eine Bestellung mit einem wirkungslosen Gutschein tatsächlich blockiert wird, steuert disableOrderOnIneffectiveVoucher unter Wirkungslose Gutscheine blockieren. Nachfolgend eine Beispielkonfiguration für checkout.voucherErrors:

Parameterübersicht

Wann welcher Fehler entsteht

Der Shop ermittelt die Fehler bei jeder Berechnung neu, einmal pro eingelöstem Gutschein. Welcher der beiden Codes gesetzt wird, entscheidet sich in dieser Reihenfolge:
  1. Mindestbestellwert des einzelnen Gutscheins. Liegt der Mindestbestellwert eines Gutscheins über dem Prüfwert des Warenkorbs, entsteht minOrderValueNotReached für genau diesen Gutschein. Als Prüfwert gilt der Warenwert. Steht minOrderValueIgnoreVoucherReduction auf false, wird der Warenwert vorher um die bereits angerechneten Gutscheinwerte reduziert.
  2. Rabattwirkung im Warenkorb. Erreicht der Warenkorb den Mindestbestellwert und bleibt der berechnete Rabatt trotzdem 0, entsteht noValidProducts für diesen Gutschein.
  3. Summe der Mindestbestellwerte. Steht minOrderValueCalculation auf sum und erreichen alle Gutscheine ihren jeweils eigenen Mindestbestellwert, muss der Warenkorb zusätzlich die Summe aller Mindestbestellwerte erreichen. Wird sie nicht erreicht, entsteht minOrderValueNotReached genau einmal. Dieser Fehler lässt sich keinem einzelnen Gutschein zuordnen und enthält deshalb keine Gutschein-ID.
Reine Versandkosten-Gutscheine ohne Prozent- und ohne Absolutwert erzeugen keinen dieser Fehler.
Weil der Fehler aus Schritt 3 ohne Gutschein-ID kommt, prüfen Sie im Template immer erst, ob details.voucherId gesetzt ist, bevor Sie die ID ausgeben. Ein vollständiges Beispiel dazu finden Sie unter Praxisbeispiele - Gutscheine.

checkout.directOrder - Onlinebestellschein

Ermöglicht eine schnelle Erfassung von Artikeln per Artikelnummer - beispielsweise für große oder wiederkehrende Bestellungen. Festgelegt wird, welche Spalten pro Zeile sichtbar sind (z.B. Artikelnummer, Menge). Auf Wunsch merkt sich das System die zuletzt verwendete Zeilenanzahl über saveCountInSession. Nachfolgend eine Beispielkonfiguration für checkout.directOrder:

Parameterübersicht

checkout.productDependency - Produktabhängigkeiten

Dieser Abschnitt legt fest, wann bestimmte Schritte oder Optionen im Checkout erlaubt sind. Er prüft dazu die Inhalte des Warenkorbs - etwa Eigenschaften wie Größe, Farbe oder ob ein Zusatzfeld ausgefüllt ist - und kann bei Nichterfüllung einen Hinweis anzeigen oder die Aktion sperren. Typische Einsatzfälle sind beispielsweise Pflichtzubehör oder das Verhindern verbotener Kombinationen im Checkout. Nachfolgend eine Beispielkonfiguration für checkout.productDependency:

Auswertungslogik

Die Regelgruppen und Bedingungen werden nach einem festen Schema ausgewertet:
  • dependencyGroups sind ODER-verknüpft: Es genügt, wenn eine der Gruppen vollständig erfüllt ist.
  • dependencies innerhalb einer Gruppe sind UND-verknüpft: Innerhalb einer Gruppe müssen alle Bedingungen erfüllt sein.
  • Ob eine einzelne Bedingung als erfüllt gilt, steuert zusätzlich basketBehavior: Bei matchOnce muss mindestens eine Warenkorb-Position die Bedingung erfüllen, bei matchAll alle Positionen, bei denen das geprüfte Feld einen Wert liefert.
Im Beispiel oben gilt die Abhängigkeit also als erfüllt, wenn entweder die erste Gruppe zutrifft (eine Position mit der Farbe camel und eine Position mit leerem Freifeld engraving im Warenkorb) oder die zweite Gruppe (eine Position mit Größe S, M oder L).

Parameterübersicht

Prüfarten (type)

checkout.shippingMethod - Versandarten

Definiert verfügbare Versandarten und deren Verhalten im Checkout. Neben Aktivierung, Name und Bestellhinweisen lassen sich Preisstaffeln nach Gewicht (weightCost) und nach Warenkorb-Zwischensumme (basicCost) konfigurieren. Über Validierungen (validations) können Bedingungen wie zulässige Länder, nur physische Produkte oder weitere Regeln hinterlegt werden. Ergänzend sind Beschreibung, Bild/Icon und externer Link (z. B. Carrier-Info) möglich. Über das Feld group lässt sich eine Versandart zudem einer Versandarten-Gruppe zuordnen. So entstehen klar benannte, regelkonforme Versandoptionen mit transparenter Preislogik und optionalen Einschränkungen. Nachfolgend eine Beispielkonfiguration für checkout.shippingMethod:

Parameterübersicht

checkout.shippingMethodGroup - Versandarten-Gruppen

Definiert Gruppen, zu denen Versandarten zusammengefasst werden können (z. B. nach Anbieter oder Lieferart). Eine Versandart wird über ihr Feld group einer Gruppe zugeordnet. Je Gruppe lassen sich Name, Beschreibung, Bild und ein Link hinterlegen - etwa, um im Frontend mehrere Versandarten gebündelt und einheitlich darzustellen. Nachfolgend eine Beispielkonfiguration für checkout.shippingMethodGroup:

Parameterübersicht

Im Template werden die Gruppen über $wsConfig.shippingMethodGroups gelesen. Die einer Versandart zugewiesene Gruppe steht dort im Feld group der Versandart.

checkout.shipTrack - Paketverfolgung

Konfiguriert die Anbindung an Versanddienstleister zur Sendungsverfolgung. Hinterlegt werden Provider-Kennung und Zugangsdaten (API-User/Token) sowie ein Sprachcode für Provider-Antworten und Labeling. Auf Basis dieser Daten lassen sich Tracking-Links und Statusinformationen im Checkout bzw. im Kundenkonto bereitstellen und automatisiert in Benachrichtigungen verwenden. Nachfolgend eine Beispielkonfiguration für checkout.shipTrack:

Parameterübersicht