Shopify Checkout Extensibility: UX-Patterns nach dem Scripts-EOL am 30. Juni
Shopify Checkout Extensibility: UX-Patterns nach dem Scripts-EOL am 30. Juni
In 13 Tagen, am 30. Juni 2026, laufen Shopify Scripts aus. Für Shops, die bisher Scripts für Checkout-Anpassungen genutzt haben, ist das kein theoretisches Datum mehr. Die Migration auf die neue Checkout Extensibility API (UI Extensions, Functions, Checkout Blocks) ist Pflicht.
Das Gute: die neue API ist strukturierter. Die Checkout-Logik ist von der UX-Schicht getrennt, was Wiederverwendung und Testbarkeit verbessert. Das weniger Gute: viele der UX-Muster, die mit Scripts umgesetzt wurden, mussen für die neue Architektur neu gedacht werden.
Dieser Post gibt dir 5 konkrete Pattern-Vorlagen für den Übergang.
Warum die UX-Arbeit neu beginnt
Scripts liefen serverseitig und konnten Checkout-Daten direkt manipulieren: Preise ändern, Produkte hinzufugen, Versandoptionen filtern. Die neue API arbeitet anders:
- UI Extensions rendern clientseitig an definierten Extension-Points
- Checkout Functions laufen serverseitig für Logik (Rabatte, Versandfilter, Zahlungsmethoden)
- Checkout Blocks sind vorgefertigte UI-Elemente, die über den Editor platziert werden
Diese Trennung ist architektonisch sauber. Aber sie bedeutet, dass jedes bisherige Pattern neu gemappt werden muss. Ein Script, das "kostenloser Versand ab 50 Euro" implementiert hat, wird zur Kombination aus einer Checkout Function (Versandlogik) und einer UI Extension (Banner-Anzeige).
Pattern 1: Progress Indicator
Was er tut: Zeigt dem Kaufer an, wie weit er vom nachsten Schwellenwert entfernt ist (z. B. kostenloser Versand, Bonus-Produkt).
Bisherige Lösung mit Scripts: Serverseitig den Warenkorbwert pruten, Wert berechnen, als Metafield zuruck in den Checkout schreiben.
Neue Lösung mit UI Extensions:
// Extensions/progress-indicator/src/index.jsx
import { useCartLines, useApplyCartLinesChange, Text, ProgressBar } from '@shopify/checkout-ui-extensions-react';
export default function ProgressIndicator() {
const lines = useCartLines();
const total = lines.reduce((sum, line) => sum + line.cost.totalAmount.amount, 0);
const threshold = 50;
const progress = Math.min(total / threshold, 1);
const remaining = Math.max(threshold - total, 0);
if (progress >= 1) {
return <Text>Versandkostenfrei inklusive.</Text>;
}
return (
<>
<ProgressBar value={progress} />
<Text>Noch {remaining.toFixed(2)} Euro bis zur kostenfreien Lieferung.</Text>
</>
);
}UX-Aspekte:
- Fortschrittsbalken muss accessible sein:
aria-labelundaria-valuenowdurch das Shopify-Component-System bereits abgedeckt. - Text formulierung: konkret und handlungsorientiert, nicht "fast geschafft" (vage), sondern "noch X Euro" (Aktion klar).
- Platzierung: Warenkorb-Summary-Block, über dem CTA. Nicht unten auf der Seite wo er ignoriert wird.
Vorteil der neuen API: Die Extension sieht den Warenkorb in Echtzeit. Beim Script war ein Server-Round-Trip notig.
Pattern 2: Express-Wallet-Integration
Was es tut: Shop Pay, Apple Pay und Google Pay werden an prominenter Stelle im Checkout platziert, um Friction vor dem Checkout-Formular zu reduzieren.
Bisherige Lösung mit Scripts: Scripts konnten Payment-Methoden nicht selbst rendern. Dieses Pattern musste über Theme-Code umgesetzt werden, was bei Headless-Storefronts oft zu Konflikten führte.
Neue Lösung mit Checkout Extensions (Wallets sind nativ):
Express-Payment-Methoden sind in der neuen Extensibility-Architektur in den purchase.checkout.payment-method-list.free-payment-methods-before Extension-Point integrierbar. Shopify rendert Shop Pay, Apple Pay und Google Pay bereits nativ. Die UX-Arbeit liegt in der richtigen Positionierung und einer klaren visuellen Hierarchie.
UX-Checkliste:
- Express-Wallets vor dem Formular anzeigen, nicht nach "Weiter zur Zahlung".
- Klarer visueller Trenner zwischen Express-Optionen und Standard-Formular (z. B. "Oder mit Zahlungsdaten fortfahren").
- Mobile-First: auf mobilen Geraten nimmt Apple Pay / Google Pay Biometrie in Anspruch. TTFB und LCP mussen stimmen, sonst bricht der Biometrie-Flow ab.
Das Checkout Growth Kit enthält fertige Komponenten für genau diesen Express-Flow, inkl. getesteter Mobiloptimierung.
Nachteil: Wallet-Integration ist plattformgebunden. Wer einen eigenen Headless-Checkout aufbaut (nicht über Shopify Checkout), hat mehr Freiheit, tragt aber auch mehr Komplexitat.
Pattern 3: Custom Validation
Was es tut: Verhindert, dass Benutzer mit unvollständigen oder fehlerhaften Daten den Checkout abschließen (z. B. fehlende Pflichtfelder in benutzerdefinierten Attributen).
Bisherige Lösung mit Scripts: Shopify Scripts konnten keine clientseitigen Validierungen triggern. Validierung lief entweder über Theme-JavaScript oder gar nicht - ein haufiger Bug-Kandidat.
Neue Lösung mit Checkout Functions:
// functions/custom-validation/src/run.js
export function run(input) {
const errors = [];
const attributes = input.cart.attribute || [];
const companyName = attributes.find(a => a.key === 'company_name');
if (!companyName || !companyName.value.trim()) {
errors.push({
localizedMessage: 'Firmenname ist Pflichtangabe für B2B-Bestellungen.',
target: 'cart.attribute.company_name'
});
}
return { errors };
}UX-Aspekte:
- Fehlermeldungen mussen direkt am betroffenen Feld erscheinen, nicht als generische Toast-Message oben auf der Seite.
- Sprache: konkret und lösungsorientiert. "Firmenname fehlt" statt "Fehler in Feld 3".
- Accessibilityanforderung: Fehlermeldungen mussen mit Screen-Readern ankundbar sein. Das
target-Feld im Functions-Output koppelt die Fehlermeldung an das korrekte DOM-Element.
Pattern 4: Dynamic Upsell Block
Was es tut: Zeigt kontext-relevante Zusatzprodukte im Checkout, abhangig vom Warenkorbinhalt.
Bisherige Lösung mit Scripts: Scripts konnten Produkte zum Warenkorb hinzufugen, aber keine Rich-UI für Produktempfehlungen rendern. Upsell-UI kam aus dem Theme.
Neue Lösung mit UI Extensions + Checkout Functions:
// Extensions/dynamic-upsell/src/index.jsx
import { useCartLines, useApplyCartLinesChange, ProductThumbnail, Button, Text } from '@shopify/checkout-ui-extensions-react';
export default function DynamicUpsell({ productRecommendation }) {
const applyChange = useApplyCartLinesChange();
const addProduct = () => {
applyChange({
type: 'addCartLine',
merchandiseId: productRecommendation.variantId,
quantity: 1,
});
};
return (
<div>
<ProductThumbnail source={productRecommendation.imageUrl} size="small" />
<Text size="medium">{productRecommendation.title}</Text>
<Text size="small" appearance="subdued">{productRecommendation.price}</Text>
<Button onPress={addProduct} kind="secondary">
Zum Warenkorb hinzufugen
</Button>
</div>
);
}UX-Aspekte:
- Nie mehr als ein Upsell-Produkt gleichzeitig zeigen. Mehr als eines erhöht Kaufabbruchrate.
- Klar als "Andere kauften auch" oder "Passend dazu" markieren, nie als Pflichtartikel.
- A/B-testen: Position (vor vs. nach Lieferadresse) macht 10-20 % Unterschied in Adoption-Rate.
Für die Implementierung auf dem Headless Frontend für Shopify sind Upsell-Blocks Teil des Standard-Checkout-Komponentensets.
Pattern 5: Accessibility-konformer Checkout-Button
Was er tut: Der primaire CTA im Checkout muss für Screen-Reader, Tastaturnavigation und Kontrast-Anforderungen korrekt implementiert sein.
Warum das in den Fokus kommt: Der Barrierefreiheitsstärkungsgesetz (BFSG) tritt ab Juli 2025 für private Unternehmen in Deutschland in Kraft. Wer seinen Checkout neu implementiert, sollte Accessibility von Anfang an einholen, nicht als Nachbesserung.
Neue Lösung mit UI Extensions:
Shopify Checkout Extensibility verwendet das Checkout UI Extensions React-Framework, das ARIA-Attribute bereits korrekt implementiert. Deine Arbeit liegt nicht im ARIA-Markup, sondern in:
- Farbkontrast: CTA-Buttons mussen WCAG 2.1 Level AA erfullen (4.5:1 Kontrastverhaltnis).
- Fokus-Management: Nach einer Modal-Offnung (z. B. Adress-Validierung) muss der Fokus in das Modal wandern und nach Schluss zum auslosenden Element zuruckkehren.
- Ladezustande kommunizieren: Wenn die Bestellung verarbeitet wird, muss der Screen-Reader "Bestellung wird verarbeitet" auslesen konnen, nicht nur ein Spinner sehen.
// Richtig: Ladezustand kommunizieren
<Button
loading={isProcessing}
accessibilityLabel={isProcessing ? 'Bestellung wird verarbeitet, bitte warten.' : 'Jetzt kaufen'}
onPress={handleSubmit}
>
{isProcessing ? 'Verarbeitung...' : 'Jetzt kaufen'}
</Button>Das Performance- und Core-Web-Vitals-Modul enthält WCAG-Compliance-Checks für Checkout-Komponenten als Teil der automatisierten QA-Pipeline.
Weiterführend: Composable Visual Page Builder für den Bereich oberhalb des Checkouts.
Zusammenfassung: was sich mit dem EOL ändert
- Dimension | Vor EOL (Scripts) | Nach EOL (Extensibility API)
- Logik-Ausführung | Serverseitig (synchron) | Functions serverseitig + Extensions clientseitig
- UI-Rendering | Theme-Code | UI Extensions an deklarierten Extension-Points
- Testbarkeit | Schwierig (kein Unit-Test-Framework) | Besser (Functions sind pures JS/TS)
- Deployment | Shopify Script-Editor | CI/CD via Shopify CLI
- Accessibility | Manual | Teilweise vom Component-System getragen
Das EOL-Datum ist kein "nice to have" Migrationsdatum. Shopify deaktiviert Scripts am 30. Juni hart. Wenn du noch Scripts im Einsatz hast: Priorisiere die Migration dieser Woche.
Der Cross-Link zu einem weiterführenden Artikel: Shopify Scripts End of Life 2026 - Plus Brands.