Blog-Inhalte
July 28, 2026

Shopify Checkout: useBuyerJourneyIntercept ist deprecated – Leitfaden für den Wechsel zu Validation Functions

useBuyerJourneyIntercept wurde in Shopify am 2. Juli 2026 als deprecated markiert. Alles zur Migration auf Cart & Checkout Validation Functions, inklusive Codebeispielen und Erkenntnissen aus der Praxis.

Als Nodus Works entwickeln wir seit Jahren Checkout-Extensions und eine Methode, die dabei als Standard galt, ist seit dem 2. Juli 2026 offiziell Geschichte: Shopify hat useBuyerJourneyIntercept, eine der am häufigsten genutzten APIs für Checkout-UI-Extensions (sowie den zugrunde liegenden buyerJourney.intercept-Mechanismus), als deprecated eingestuft. Dies ist keine bloße API-Änderung; sie bedeutet, dass die Checkout-Validierung vom Browser auf die serverseitige Infrastruktur von Shopify verlagert wird. Für Händler in der Türkei ist dies besonders kritisch, da lokale Anforderungen wie die Zustimmung zu Fernabsatzverträgen, die Validierung von Steuernummern (TC-Identifikationsnummern) sowie die Auswahl von Provinzen und Bezirken fast immer über diese API implementiert wurden. Im Folgenden analysieren wir sowohl das Scheitern der alten Architektur als auch die notwendigen Schritte auf Code-Ebene, um die Migration in der Produktion reibungslos zu gestalten.

Was ist passiert?

Shopify hat useBuyerJourneyIntercept am 2. Juli 2026 als deprecated markiert; die empfohlene Lösung sind nun serverseitige Cart & Checkout Validation Functions. Während die Validierungslogik bei der alten Methode im Browser des Kunden ausgeführt wurde, läuft sie nun in der Shopify-eigenen Serverinfrastruktur auf Basis von WebAssembly.

Die alte Methode: Wie funktionierten Interceptor?

Das Prinzip der Interceptor war simpel: Die Extension griff ein, sobald der Kunde auf den „Bezahlen“-Button klickte, blockierte den Vorgang bei Nichterfüllung der Bedingungen und zeigte neben dem Feld eine Fehlermeldung an.

// Eski yaklaşım (artık deprecated)

useBuyerJourneyIntercept(({ canBlockProgress }) => {

  if (canBlockProgress && !isChecked) {

    return {

      behavior: "block",

      reason: "Sözleşme onaylanmalı",

      perform: (result) => {

        if (result.behavior === "block") {

          setError("Mesafeli Satış Sözleşmesi'ni onaylamalısınız.");

        }

      },

    };

  }

  return { behavior: "allow" };

});

Auf dem Papier ein elegantes Design. In der Praxis gibt es jedoch konkrete, strukturelle Gründe, warum Shopify diese API in den Ruhestand geschickt hat.

Warum wird sie entfernt? Strukturelle Probleme der Interceptor-Architektur

1. Interceptor funktionieren nicht nur beim „Bezahlen“-Button

Dies ist das am wenigsten bekannte und kritischste Detail: Interceptor können nicht nur bei Zahlungsversuchen ausgelöst werden, sondern bei jeder Interaktion im Checkout (Adressaktualisierung, Marketing-Checkboxen, Änderung der Versandart). Der Code, den Sie für die „letzte Prüfung vor der Zahlung“ hielten, wird also während der gesamten Checkout-Sitzung mehrfach und zu unvorhersehbaren Zeitpunkten ausgeführt. Wenn Sie innerhalb eines Interceptors Schreibvorgänge durchführen (applyMetafieldsChange, applyAttributeChange etc.), können diese mit den Aktionen von Shopify kollidieren, den Checkout-Prozess verlangsamen oder in Extremfällen sogar blockieren.

2. Die Client-Seite ist keine verlässliche Grenze

Ein Interceptor läuft im Browser. Wie alles, was im Browser läuft, kann er auf alten WebKit-Versionen Rendering-Probleme verursachen, sich in In-App-Browsern (Instagram, Facebook) anders verhalten oder durch einen JavaScript-Fehler lautlos deaktiviert werden. Wenn die Extension nicht geladen wird, findet auch keine Validierung statt; dies bemerkt man oft erst, wenn Bestellungen mit unvollständigen Daten eingehen.

3. Skalierbarkeit und Performance

Wenn jede Extension ihren eigenen Interceptor registriert, muss Shopify bei jeder Checkout-Interaktion alle nacheinander ausführen und die Ergebnisse zusammenführen. Je mehr Extensions vorhanden sind, desto länger wird diese Kette. Die Lösung von Shopify ist eindeutig: Regeln an einem zentralen Ort auf dem Server mittels WebAssembly innerhalb von Millisekunden ausführen.

Wichtiger Hinweis: Der gemeinsame Nenner dieser drei Probleme ist, dass die Interceptor-Architektur ein „lokaler/clientseitiger“ Ansatz ist. Der Wechsel zu Validation Functions bedeutet nicht nur, eine neue API zu erlernen, sondern Checkout-Validierung als eine „serverseitige Geschäftsregel“ neu zu denken.

Vergleich: useBuyerJourneyIntercept vs. Validation Functions

Der Unterschied zwischen den beiden Architekturen ist zu grundlegend, um ihn in einem Satz zusammenzufassen: Ausführungsort, Fehlerquellen und Implementierungsschritte ändern sich von Grund auf.

Vergleichskriterium useBuyerJourneyIntercept (Veraltet / Deprecated) Cart & Checkout Validation Function
Ausführungsort Läuft im Browser des Kunden (Client-seitig). Läuft auf dem Shopify-Server über WebAssembly (Wasm).
Auslösehäufigkeit Wird bei jeder Interaktion im Checkout (inklusive Adress-, Gutschein- oder Lieferänderungen) kontinuierlich ausgelöst. Wird ausschließlich beim Ziel cart.validations.generate.run über definierte Regeln ausgelöst.
Abhängigkeit von Browser-/JS-Fehlern Vorhanden; Wenn die Erweiterung nicht lädt oder ein JS-Fehler auftritt, schlägt die Validierung stillschweigend fehl. Nicht vorhanden; Läuft direkt auf dem Server und bleibt von clientseitigen Browserproblemen unbeeinflusst.
Fehleranzeigeort Wird direkt neben dem entsprechenden Eingabefeld in Echtzeit angezeigt. Wird bei Fehlern mit Ziel $.cart als Banner auf Seitenebene angezeigt.
Bereitstellung & Aktivierung Wird mit der Installation der Erweiterung automatisch aktiviert. Erfordert nach dem Deployment eine manuelle Aktivierung über das Admin-Panel (Einstellungen → Checkout → Checkout-Regeln).
Testbarkeit Erfordert End-to-End (E2E) Browser-Tests. Ermöglicht Fixture-basierte Unit-Tests mit shopify-function-test-helpers.

Die neue Methode: Was sind Cart & Checkout Validation Functions?

Validation Functions sind kleine, reine Funktionen, die innerhalb der Shopify Functions-Infrastruktur laufen. Sie empfangen den Warenkorbstatus als Eingabe und geben eine Fehlerliste zurück. Im Browser des Kunden wird keine einzige Zeile Code ausgeführt; ist eine Regel verletzt, stoppt Shopify die Zahlung serverseitig. Das Ziel ist cart.validations.generate.run.

// shopify.extension.toml

[[extensions]]

name = "t:name"

handle = "checkout-validation"

type = "function"

  [[extensions.targeting]]

  target = "cart.validations.generate.run"

  input_query = "src/cart_validations_generate_run.graphql"
Fonksiyonun kendisi de bir o kadar sadedir:
export function cartValidationsGenerateRun(input) {

  const errors = [];

  if (input.buyerJourney?.step !== "CHECKOUT_COMPLETION") {

    return { operations: [] };

  }

  const onay = input.cart.sozlesme?.value;

  if (onay !== "1") {

    errors.push({

      message: "Devam edebilmek için sözleşmeleri onaylamanız gerekmektedir.",

      target: "$.cart",

    });

  }

  return { operations: [{ validationAdd: { errors } }] };

}

Wie gelangen Formulardaten aus der UI zum Server?

Die entscheidende Frage ist: Die Validation Function hat keinen Zugriff auf den Browser, sie sieht nur den Warenkorb selbst. Das bewährte Muster für die Produktion lautet: Die UI-Extension schreibt den Validierungsstatus als Attribut in den Warenkorb; die Function liest dieses Attribut aus.

// UI extension tarafı: durum değiştikçe attribute güncelle

const lastValidation = useRef("");

useEffect(() => {

  const status = isChecked

    ? "1"

    : "Mesafeli Satış Sözleşmesi'ni onaylamalısınız.";

  if (lastValidation.current === status) return;

  lastValidation.current = status;

  applyAttributeChange({

    key: "_sozlesme_onay_ok",

    value: status,

    type: "updateAttribute",

  });

}, [isChecked, applyAttributeChange]);
Function tarafında ise input query ile yalnızca ihtiyacınız olan attribute'ları çekersiniz:
query CartValidationsGenerateRunInput {

  cart {

    sozlesme: attribute(key: "_sozlesme_onay_ok") {

      value

    }

  }

  buyerJourney {

    step

  }

}

Dieses Muster hat einen eleganten Nebeneffekt: Wenn der Attributwert nicht "1" ist, dient der enthaltene Text direkt als Fehlermeldung für den Kunden. Sie verwalten die Fehlermeldungen zentral in der UI-Extension; die Function fungiert lediglich als Übermittler.

Fünf kritische Lektionen aus der Produktionsumgebung

Als jemand, der diese Umstellung bereits in Shops mit echtem Traffic durchgeführt hat, teilen wir hier fünf Punkte, die in der Dokumentation oft nicht ausreichend betont werden.

1. Validieren Sie ausschließlich im Schritt CHECKOUT_COMPLETION

Wenn Sie die Function auch im Schritt CHECKOUT_INTERACTION ausführen, erscheinen rote Fehlerbanner am oberen Bildschirmrand, sobald der Kunde die Seite öffnet, noch bevor er ein Feld berührt hat. Das ist eine Katastrophe für die Conversion-Rate; die oben genannte Schritt-Prüfung ist kein bloßes Extra, sondern eine Notwendigkeit.

2. Debounce für Attribut-Schreibvorgänge und Vermeidung von Redundanz

Der Aufruf von applyAttributeChange bei jedem Tastendruck ist der sicherste Weg, um an das Limit von Shopify für Änderungen zu stoßen. Sobald das Limit überschritten ist, werden weitere Schreibvorgänge stillschweigend verworfen; Bestellungen kommen dann mit unvollständigen Daten an. Ein Debounce von 300-500 ms sowie eine Prüfung auf "identische Werte nicht erneut schreiben" sind zwingend erforderlich.

useEffect(() => {

  const timer = setTimeout(() => {

    if (lastWritten.current === status) return;

    lastWritten.current = status;

    applyAttributeChange({ key, value: status, type: "updateAttribute" });

  }, 400);

  return () => clearTimeout(timer);

}, [status]);

3. Regel überspringen, wenn kein Attribut vorhanden ist (Fail-Open)

Ihre Function sollte die Regel überspringen, wenn das Attribut noch nicht geschrieben wurde. Andernfalls kann in einer Shop-Konfiguration, in der die entsprechende Extension nicht zum Checkout hinzugefügt wurde, niemand bezahlen. Die Function sollte so konzipiert sein, dass sie für sich allein genommen nichts blockieren kann.

4. Ein Deployment reicht nicht aus: Sie müssen es im Admin-Bereich aktivieren

Dies ist der am häufigsten übersehene Schritt: Nach einem shopify app deploy wird die Function nicht automatisch aktiv. Der Shop-Administrator muss die Regel unter Einstellungen → Zahlungen → Checkout-Regeln hinzufügen und aktivieren. Alle Tests, die ohne diesen Schritt durchgeführt werden, vermitteln fälschlicherweise den Eindruck, dass "alles funktioniert". Für Shops, die regelmäßig prüfen möchten, ob der Aktivierungsschritt nach dem Deployment vergessen wurde, bietet unser technischer Shopify-Support- und Wartungsservice eine regelmäßige Überprüfung solcher Checkout-Regeln an.

5. Fehlerdarstellung ändert sich: Gestalten Sie das Kundenerlebnis entsprechend

Interceptor konnten Fehler direkt neben dem entsprechenden Feld anzeigen. Bei der serverseitigen Validierung erscheinen Fehler, die auf $.cart abzielen, als Banner auf Seitenebene. Die beste Kombination ist es, Formatfehler (z. B. eine ID-Nummer mit weniger als 11 Stellen) weiterhin clientseitig direkt am Feld anzuzeigen, während die Prüfung auf "Pflichtfeld leer" dem Server überlassen wird.

Zu vermeidendes Risiko: Achten Sie darauf, nicht vorschnell "Umstellung abgeschlossen" zu melden, ohne sicherzustellen, dass eine bereitgestellte Validation Function auch im Admin-Panel aktiviert wurde. Dies ist ein wiederkehrendes Muster, das auch bei Shopify Inbox oder vollseitigen UI-Extensions auftritt: Deployment und Aktivierung sind immer zwei getrennte Schritte.

Checkliste für die Umstellung

  • Erfassen Sie alle bestehenden Verwendungen von useBuyerJourneyIntercept sowie die block_progress-Berechtigungen in den toml-Dateien.
  • Für jede Regel: Welche Daten werden benötigt und wie werden diese als Attribut im Warenkorb dargestellt?
  • Schreiben Sie eine einzige Funktion für cart.validations.generate.run und bündeln Sie alle Regeln an einem zentralen Ort.
  • Fügen Sie Fixture-basierte Tests hinzu (das Paket shopify-function-test-helpers von Shopify ist genau dafür gedacht): Szenarien für gültige Warenkörbe, fehlende Daten und das Überspringen von Warenkorb-Phasen.
  • Führen Sie das Deployment durch, aktivieren Sie die Regel im Admin-Bereich und testen Sie den gesamten Prozess auf echten Geräten.
  • Löschen Sie den Interceptor-Code erst danach.

Welche länderspezifischen Regeln für die Türkei werden in welches Attribut verschoben?

Drei gängige Regeln, die in türkischen Shops bisher per Interceptor umgesetzt wurden, können in separate Attribute unterteilt und in einer einzigen Funktion zusammengefasst werden.

Alte Interceptor-Regel Neuer Warenkorb-Attributschlüssel (Cart Attribute Key) Validierungsschritt
Zustimmung zum Fernabsatzvertrag _sozlesme_onay_ok Prüft in der Phase CHECKOUT_COMPLETION auf den Wert "1".
Identifikations-/Steuernummer-Überprüfung _kimlik_no_gecerli Formatprüfung erfolgt clientseitig, Pflichtfeldprüfung serverseitig.
Erforderliche Auswahl von Bundesland/Bezirk _teslimat_bolge_secili Gibt einen Fehler auf Seitenebene mit Ziel $.cart zurück, wenn das Feld leer ist.

Häufig gestellte Fragen

Wann wurde useBuyerJourneyIntercept als deprecated markiert?

Am 2. Juli 2026. Die empfohlene Lösung sind serverseitige Cart & Checkout Validation Functions.

Was ist der Hauptunterschied zwischen einer Validation Function und einem Interceptor?

Der Interceptor läuft im Browser des Kunden und ist anfällig für browserseitige Einschränkungen (veraltetes WebKit, In-App-Browser, JS-Fehler). Die Validation Function läuft auf den Servern von Shopify; Regelverstöße werden serverseitig blockiert, ohne dass clientseitiger Code ausgeführt werden muss.

Wie greift die Validation Function auf Formulardaten aus der UI-Extension zu?

Nicht direkt. Die UI-Extension schreibt den Status als Attribut in den Warenkorb; die Validation Function liest dieses Attribut über die Input-Query aus.

Wird die Funktion nach dem Deployment automatisch aktiviert?

Nein. Deployment und Aktivierung sind zwei separate Schritte; der Shop-Administrator muss die Regel über Einstellungen → Checkout → Checkout-Regeln manuell hinzufügen und aktivieren.

Warum ist diese Änderung für Shops in der Türkei besonders wichtig?

Lokale Anforderungen wie die Bestätigung von Fernabsatzverträgen, die Validierung von TC-Identitäts-/Steuernummern sowie die Auswahl von Provinz und Bezirk wurden häufig über useBuyerJourneyIntercept umgesetzt. Wenn diese Regeln nicht auf Validation Functions umgestellt werden, könnten diese Prüfungen nach der Deprecation nicht mehr funktionieren.

Wann sollte ich den Interceptor-Code löschen?

Erst nachdem die Validation Function deployed, im Admin-Bereich aktiviert und auf echten Geräten vollständig getestet wurde. Wenn Sie diese Reihenfolge nicht einhalten, kann es während der Umstellung zu einer Lücke kommen, in der die Validierung gar nicht funktioniert.

Fazit

Die Ablösung von useBuyerJourneyIntercept mag auf den ersten Blick wie eine lästige Pflicht erscheinen, doch das Ergebnis einer korrekt durchgeführten Migration ist eindeutig besser: Die Validierung ist nun unabhängig von Gerät, Browser oder den Eigenheiten von In-App-Browsern; die Regeln sind zentralisiert, testbar und können clientseitig nicht manipuliert werden. Bei einem kritischen Prozess wie dem Checkout, bei dem Geld den Besitzer wechselt, ist die Rückkehr zum Prinzip „Geschäftslogik gehört auf den Server“ im Grunde die Tilgung längst überfälliger technischer Schulden. Der Juli 2026 ist da; falls Ihre Interceptor noch in der Produktion laufen, ist jetzt der richtige Zeitpunkt, diese Migration in Ihre Sprint-Planung aufzunehmen.

Um Ihre Checkout-Validierungsregeln auf Validation Functions umzustellen oder Ihre bestehenden Extensions auf diesen Wechsel vorzubereiten, können Sie sich bezüglich unserer Shopify-Integrationslösungen mit unserem Team in Verbindung setzen.