Wer seinen Checkout früher mit checkout.liquid individualisiert hat, musste in den letzten
Jahren umdenken: Shopify hat den Checkout auf ein komplett neues, API-basiertes Modell umgestellt. Was
das für bestehende Shops bedeutet – und was mit Shopify Functions inzwischen an individueller Logik
möglich ist.
Warum Shopify den Checkout umgebaut hat
Der alte, Liquid-basierte Checkout war flexibel, aber genau das war auch sein Problem: Individuelle Anpassungen griffen tief in den Checkout-Code ein, wurden bei jedem Shopify-Update zum Risiko und machten den Checkout-Prozess selbst langsamer. Mit Checkout Extensibility trennt Shopify strikt zwischen dem von Shopify gewarteten Checkout-Kern und klar definierten Erweiterungspunkten, über die Händler und Entwickler eigene Logik einhängen.
Was Shopify Functions konkret leisten
Shopify Functions sind kleine, serverseitig von Shopify selbst ausgeführte Programme, die an festgelegten Stellen im Bestell-, Rabatt- oder Versandprozess eingreifen. Sie laufen nicht auf einem eigenen Server, sondern direkt in Shopifys Infrastruktur – das bedeutet weniger Latenz und keine eigene Serverwartung.
- Individuelle Rabattlogik: z. B. gestaffelte Mengenrabatte, die über die Standard-Rabattregeln hinausgehen
- Versandregeln: Versandoptionen dynamisch ein- oder ausblenden, etwa abhängig von Warenkorbinhalt oder Zielland
- Zahlungsanpassungen: bestimmte Zahlarten für bestimmte Kundengruppen oder Bestellwerte anbieten oder ausblenden
- Validierungen: eigene Prüfregeln vor Bestellabschluss, z. B. Mindestbestellwerte pro Produktkategorie
Wichtig für das Verständnis: Eine Function ersetzt nicht die komplette Checkout-Logik, sondern hängt sich an klar definierte Extension Points – benannte Stellen im Bestellprozess, an denen Shopify explizit erlaubt, eigenen Code auszuführen. Für Rabatte gibt es z. B. eigene Extension Points für Produkt-, Bestell- und Versandrabatte, die unabhängig voneinander bestückt werden können. Das ist bewusst restriktiv – und genau das macht das System robust: Eine Function kann strukturell gar nicht in Bereiche eingreifen, für die sie nicht vorgesehen ist.
Grenzen von Shopify Functions: was (noch) nicht geht
Genauso wichtig wie zu wissen, was möglich ist, ist zu wissen, wo die Grenzen liegen – gerade weil viele
Migrationsprojekte daran scheitern, dass alte checkout.liquid-Anpassungen 1:1 nachgebaut
werden sollen, obwohl das technisch gar nicht vorgesehen ist.
- Keine beliebigen Netzwerkaufrufe: Functions laufen isoliert und dürfen zur Laufzeit nicht eigenständig externe APIs aufrufen – Daten, die von außen kommen sollen, müssen vorher über Metafields oder ein separates Backend bereitgestellt werden
- Striktes Zeitlimit: eine Function muss innerhalb weniger Millisekunden antworten, damit der Checkout nicht spürbar langsamer wird – aufwendige Berechnungen gehören in einen vorgelagerten Batch-Prozess, nicht in die Function selbst
- Kein direkter Datenbankzugriff: Functions bekommen die für sie relevanten Daten als strukturierten Input übergeben, statt sich eigenständig Daten aus Shopify zu holen
- Begrenzte Sprachunterstützung: Functions werden aktuell primär in Rust, JavaScript oder anderen zu WebAssembly kompilierbaren Sprachen entwickelt – ein bestehendes PHP- oder Node-Backend lässt sich nicht einfach "hineinkopieren"
In der Praxis bedeutet das: Wer komplexe, datenintensive Logik braucht (z. B. eine Preisberechnung, die Live-Daten aus einem externen ERP-System zieht), muss diese Daten vorab in Shopify synchronisieren – etwa über Metafields, die periodisch aus dem ERP aktualisiert werden – statt sie live im Checkout abzufragen. Diese Vorab-Synchronisierung ist fast immer der aufwendigere Teil eines Migrationsprojekts, nicht die Function selbst.
UI Extensions: der sichtbare Teil
Während Functions im Hintergrund Logik ausführen, sorgen UI Extensions für sichtbare Anpassungen im Checkout selbst – etwa zusätzliche Formularfelder, individuelle Hinweistexte, Upsell-Banner oder ein Fortschrittsbalken für ein Treueprogramm. Beides zusammen ersetzt einen Großteil dessen, was früher nur mit direkten Liquid-Eingriffen möglich war – nur eben zukunftssicher und ohne Shopifys eigenen Checkout-Code zu berühren.
Praxisbeispiel: B2B-Preislogik
Für einen Kunden mit gemischtem B2B- und B2C-Geschäft haben wir eine Function umgesetzt, die abhängig von der Kundengruppe automatisch Staffelpreise anwendet und bestimmte Zahlarten (z. B. Kauf auf Rechnung) nur für verifizierte Geschäftskunden freischaltet – vollständig ohne Eingriff in den Kern-Checkout.
Technischer Unterbau: WebAssembly und die Extension-Runtime
Was Shopify Functions von einem klassischen Plugin-System unterscheidet, ist die Ausführungsumgebung: Functions werden zu WebAssembly (WASM) kompiliert und laufen in einer sandboxed Runtime direkt neben dem Checkout-Prozess selbst – nicht auf einem entfernten Server, den man erst per HTTP anfragen müsste. Das erklärt, warum Functions so strikt in Ausführungszeit und Netzwerkzugriff begrenzt sind: Sie sind bewusst als eng gekapselte, extrem schnelle Codebausteine konzipiert, nicht als vollwertige Backend-Services.
Für Entwickler bedeutet das einen spürbaren Umstieg im Denken. Statt "ein Server, der auf Anfragen reagiert" zu bauen, schreibt man eine reine Funktion nach dem Muster Input rein, Output raus – ohne Seiteneffekte, ohne eigenen Zustand zwischen Aufrufen. Das klingt zunächst einschränkend, macht Functions aber auch deterministisch testbar: Bei gleichem Input kommt immer derselbe Output heraus, was automatisierte Tests erheblich einfacher macht als bei klassischem, zustandsbehaftetem Server-Code.
Praktisch heißt das für die Entwicklung: lokale Tests mit Shopify CLI, ein klar definiertes
GraphQL-Schema als Input/Output-Vertrag, und ein Build-Schritt, der den Function-Code (typischerweise
Rust oder JavaScript über eine Toolchain wie Javy) zu einer kompakten .wasm-Datei kompiliert,
die anschließend zu Shopify hochgeladen wird. Der gesamte Prozess ist deutlich näher an klassischer
Softwareentwicklung mit Versionierung und CI/CD als das alte Copy-Paste-Liquid-Snippet-Vorgehen.
Migration: worauf Sie achten sollten
Wer noch mit checkout.liquid arbeitet, sollte die Migration nicht auf die lange Bank
schieben: Shopify unterstützt den alten Checkout nur noch für einen begrenzten Kreis bestehender Shops,
neue Individualisierungen sind darauf gar nicht mehr möglich. Bei einer Migration lohnt sich vorher eine
saubere Bestandsaufnahme:
- Welche bisherigen Checkout-Anpassungen sind wirklich noch geschäftsrelevant?
- Welche lassen sich 1:1 als Function oder UI Extension abbilden?
- Wo lohnt es sich, eine alte "Krücke" durch eine sauberere, native Lösung zu ersetzen, statt sie nur nachzubauen?
Typischer Migrationsablauf in der Praxis
Bei unseren eigenen Migrationsprojekten hat sich ein Ablauf in fünf Schritten bewährt, der das Risiko eines "Big Bang"-Umstiegs am Live-Shop deutlich reduziert:
- Audit des bestehenden Checkouts: jede Liquid-Anpassung, jedes Snippet und jeden externen Script-Tag dokumentieren – inklusive der Frage, wann und warum sie ursprünglich eingebaut wurden. Erfahrungsgemäß sind 20–30 % der gefundenen Anpassungen inzwischen ohnehin obsolet.
- Klassifizieren nach Extension-Typ: jede verbleibende Anpassung einem der drei Töpfe zuordnen – Function (Logik), UI Extension (sichtbare Änderung) oder "geht nativ nicht mehr", was eine bewusste Geschäftsentscheidung statt einer technischen Notlösung erfordert.
- Function-für-Function neu aufbauen und lokal testen: mit der Shopify CLI und dem Function-Testing-Framework, bevor überhaupt ein Deployment in eine Staging-Umgebung erfolgt.
- Parallelbetrieb in einer Development Store-Kopie: den neuen Checkout mit realistischen Testbestellungen gegen den alten validieren, insbesondere Rand- und Fehlerfälle (ungültige Gutscheincodes, Grenzwerte bei Mengenrabatten, internationale Adressformate).
- Stufenweiser Rollout statt Komplettumschaltung: wo möglich zunächst für einen Teil des Traffics aktivieren und Bestellabschlussraten sowie Fehlermeldungen aktiv beobachten, bevor auf 100 % umgestellt wird.
Der mit Abstand unterschätzte Aufwand liegt fast nie in Schritt 3 (dem eigentlichen Function-Code), sondern in Schritt 1 und 4: Alte Checkout-Anpassungen sind über Jahre gewachsen, oft ohne Dokumentation, und niemand im Unternehmen erinnert sich mehr im Detail an jede einzelne Sonderregel. Genug Zeit für die Bestandsaufnahme einzuplanen, ist der wichtigste Erfolgsfaktor einer Migration – nicht die Programmierarbeit selbst.
Fazit
Checkout Extensibility ist kein Rückschritt gegenüber dem alten, freien Liquid-Checkout – es ist ein anderer, robusterer Weg zum gleichen Ziel: ein Checkout, der zur eigenen Marke und den eigenen Geschäftsregeln passt, ohne bei jedem Shopify-Update ein Risiko zu sein.
Der wichtigste Perspektivwechsel ist dabei ein konzeptioneller: Statt zu fragen "wie baue ich das nach, was ich schon hatte?", lohnt es sich zu fragen "welches Geschäftsziel stand eigentlich hinter der alten Anpassung – und wie erreiche ich das mit den heutigen, nativen Werkzeugen am saubersten?". Shops, die die Migration so angehen, kommen am Ende meist mit einem schlankeren, wartbareren Checkout heraus, als sie vorher hatten.
Checkout-Migration oder individuelle Function geplant?
Wir unterstützen bei der Migration von Legacy-Checkouts und der Umsetzung individueller Shopify Functions.