Checkout & UX
Shopify Checkout anpassen: Grenzen und Lösungen 2025

Die unbequeme Wahrheit über Shopify Checkout
Der Shopify Checkout ist absichtlich restriktiv. Warum? Weil Shopify drei Dinge garantieren will:
- Security: PCI-DSS-Compliance ohne Wenn und Aber
- Performance: Schnellster Checkout = höchste Conversion
- Reliability: Keine Custom-Code-Bugs beim Bezahlen
Das bedeutet: Ihre Anpassungsmöglichkeiten sind limitiert – egal ob Shopify Basic oder Plus.
In diesem Guide erkläre ich:
- Was auf jedem Shopify-Plan möglich ist
- Exklusive Plus-Features
- Checkout Extensibility (das neue System ab 2023)
- Workarounds für häufige Anforderungen
- Wann Sie KEINE Lösung finden werden
- Praktische Code-Beispiele für 2025
Checkout-Anpassungen: Basic vs. Plus
Standard Shopify (Basic, Shopify, Advanced)
Was Sie anpassen können:
- ✅ Branding (Logo, Farben, Fonts)
- ✅ Custom CSS (limitiert)
- ✅ Checkout-Sprache
- ✅ E-Mail-Templates (Order Confirmation etc.)
Was Sie NICHT anpassen können:
- ❌ HTML-Struktur
- ❌ Custom JavaScript
- ❌ Layout-Änderungen
- ❌ Zahlungsfelder hinzufügen/entfernen
- ❌ Checkout-Flow ändern
Beispiel: Branding anpassen
Im Shopify Admin unter Settings > Checkout:
/* Custom CSS (limitiert auf Standard-Plänen) */
.checkout-logo {
max-width: 200px;
}
.step__footer {
background-color: #2E865F; /* Shopify Green */
}
/* Button-Anpassung */
.step__footer__continue-btn {
background-color: #2E865F;
border-radius: 8px;
}Shopify Plus
Zusätzliche Möglichkeiten:
- ✅ ~~
checkout.liquideditieren~~ (Legacy, wurde 2025 abgeschaltet) - ✅ Checkout Extensibility (Apps & Custom Extensions)
- ✅ Scripts (Checkout Scripts für Discounts, Shipping)
- ✅ Custom Payment Gateway Branding
- ✅ Checkout Functions (serverless Logic)
Aber auch hier Grenzen:
- ❌ Keine Custom Payment-Flows
- ❌ Kein Zugriff auf Kreditkarten-Felder
- ❌ Keine drastischen Layout-Änderungen
Checkout Extensibility: Das neue System
Seit August 2023 führt Shopify ein neues Extension-System ein. ~~checkout.liquid wurde im August 2025 komplett abgeschaltet~~.
Was ist Checkout Extensibility?
Ein modulares System für Checkout-Erweiterungen:
- UI-Extensions (React-basiert)
- Checkout-App-Blöcke
- Validation & Custom Fields
- Payment & Shipping Customization
Vorteile gegenüber checkout.liquid:
- ✅ Kein Breaking-Code bei Shopify-Updates
- ✅ Bessere Performance durch isolierte Components
- ✅ Einfachere Wartung
- ✅ Type-Safety mit TypeScript
UI Extensions: Was Sie bauen können
1. Custom Felder hinzufügen
// extensions/checkout-ui/src/Checkout.tsx
import {
reactExtension,
TextField,
useApplyAttributeChange,
useNote,
} from '@shopify/ui-extensions-react/checkout';
export default reactExtension(
'purchase.checkout.block.render',
() => <CustomDeliveryNote />
);
function CustomDeliveryNote() {
const applyAttributeChange = useApplyAttributeChange();
const note = useNote();
const handleChange = (value: string) => {
applyAttributeChange({
type: 'updateAttribute',
key: 'delivery_notes',
value,
});
};
return (
<TextField
label="Lieferhinweise (optional)"
placeholder="z.B. Hintereingang nutzen"
value={note || ''}
onChange={handleChange}
/>
);
}
// shopify.extension.toml
# [extension]
# type = "ui_extension"
# name = "delivery-notes"
# handle = "delivery-notes"
#
# [[extensions.targeting]]
# module = "./src/Checkout.tsx"
# target = "purchase.checkout.block.render"2. Upsell-Banner anzeigen
// extensions/free-shipping-banner/src/Checkout.tsx
import {
reactExtension,
Banner,
useSubtotalAmount,
useSettings,
} from '@shopify/ui-extensions-react/checkout';
export default reactExtension(
'purchase.checkout.block.render',
() => <FreeShippingBanner />
);
function FreeShippingBanner() {
const subtotal = useSubtotalAmount();
const settings = useSettings();
const threshold = settings.freeShippingThreshold || 50;
const remaining = threshold - parseFloat(subtotal.amount);
// Nicht anzeigen wenn Schwelle erreicht
if (remaining <= 0) {
return (
<Banner status="success">
🎉 Sie erhalten kostenlosen Versand!
</Banner>
);
}
return (
<Banner status="info">
Noch {remaining.toFixed(2)} {subtotal.currencyCode} bis kostenloser Versand!
</Banner>
);
}
// Extension Settings (shopify.extension.toml)
# [settings]
# [[settings.fields]]
# key = "freeShippingThreshold"
# type = "number_decimal"
# name = "Free Shipping Threshold"
# description = "Minimum order value for free shipping"3. Trust-Badges hinzufügen
// extensions/trust-badges/src/Checkout.tsx
import {
reactExtension,
BlockStack,
InlineStack,
Image,
Text,
} from '@shopify/ui-extensions-react/checkout';
export default reactExtension(
'purchase.checkout.block.render',
() => <TrustBadges />
);
function TrustBadges() {
return (
<BlockStack spacing="tight">
<InlineStack spacing="base" blockAlignment="center">
<Image
source="https://cdn.shopify.com/s/files/1/0xxx/ssl-badge.png"
alt="SSL Verschlüsselt"
aspectRatio={1}
/>
<Image
source="https://cdn.shopify.com/s/files/1/0xxx/payment-icons.png"
alt="Sichere Zahlungsmethoden"
aspectRatio={4}
/>
</InlineStack>
<Text size="small" appearance="subdued">
Sichere Zahlung mit 256-Bit-Verschlüsselung.
Ihre Daten sind bei uns sicher.
</Text>
</BlockStack>
);
}4. Product Recommendations (Cross-Sell)
// extensions/product-upsell/src/Checkout.tsx
import {
reactExtension,
BlockStack,
Heading,
InlineLayout,
Image,
Text,
Button,
useCartLines,
useApplyCartLinesChange,
} from '@shopify/ui-extensions-react/checkout';
const UPSELL_PRODUCT = {
variantId: 'gid://shopify/ProductVariant/123456789',
title: 'Geschenkverpackung',
price: '5.00',
image: 'https://cdn.shopify.com/...',
};
export default reactExtension(
'purchase.checkout.block.render',
() => <ProductUpsell />
);
function ProductUpsell() {
const cartLines = useCartLines();
const applyCartLinesChange = useApplyCartLinesChange();
// Prüfen ob Upsell bereits im Warenkorb
const hasUpsell = cartLines.some(
(line) => line.merchandise.id === UPSELL_PRODUCT.variantId
);
if (hasUpsell) return null;
const handleAdd = async () => {
await applyCartLinesChange({
type: 'addCartLine',
merchandiseId: UPSELL_PRODUCT.variantId,
quantity: 1,
});
};
return (
<BlockStack spacing="base">
<Heading level={3}>Perfekt für Ihr Geschenk</Heading>
<InlineLayout
spacing="base"
columns={['auto', 'fill']}
blockAlignment="center"
>
<Image
source={UPSELL_PRODUCT.image}
alt={UPSELL_PRODUCT.title}
aspectRatio={1}
/>
<BlockStack spacing="tight">
<Text size="medium" emphasis="bold">
{UPSELL_PRODUCT.title}
</Text>
<Text size="small" appearance="subdued">
{UPSELL_PRODUCT.price} €
</Text>
</BlockStack>
<Button kind="secondary" onPress={handleAdd}>
Hinzufügen
</Button>
</InlineLayout>
</BlockStack>
);
}Checkout Functions (Shopify Plus)
Was sind Checkout Functions? Serverless-Funktionen, die während des Checkouts ausgeführt werden – z.B. für:
- Dynamic Discounts
- Shipping-Rate-Customization
- Payment-Method-Filtering
Beispiel: Gratis-Versand ab €50
// extensions/shipping-discount/src/main.rs
use shopify_function::prelude::*;
use shopify_function::Result;
#[shopify_function]
fn run(input: input::ResponseData) -> Result<output::FunctionResult> {
let cart_total: f64 = input.cart.cost.subtotal_amount.amount.parse()?;
let operations = if cart_total >= 50.0 {
vec![output::Operation {
update: Some(output::UpdateOperation {
delivery_option: Some(output::DeliveryOption {
title: Some("Kostenloser Versand".to_string()),
cost: Some(output::Cost {
amount: 0.0,
}),
}),
}),
}]
} else {
vec![]
};
Ok(output::FunctionResult { operations })
}
// shopify.extension.toml
# api_version = "2025-01"
#
# [[extensions]]
# type = "function"
# name = "shipping-discount"
# handle = "shipping-discount"
#
# [extensions.input]
# variables = { namespace = "shipping-discount", key = "threshold" }Alternative in TypeScript (mit Shopify Function API):
// extensions/shipping-discount/src/index.ts
import type {
RunInput,
FunctionResult,
} from '../generated/api';
export function run(input: RunInput): FunctionResult {
const cartTotal = parseFloat(input.cart.cost.subtotalAmount.amount);
const threshold = 50; // € 50
if (cartTotal >= threshold) {
return {
operations: [
{
update: {
deliveryOption: {
title: 'Kostenloser Versand',
cost: {
amount: '0.00',
currencyCode: input.cart.cost.subtotalAmount.currencyCode,
},
},
},
},
],
};
}
return { operations: [] };
}
// package.json
// {
// "name": "shipping-discount",
// "scripts": {
// "build": "javy compile index.js -o index.wasm"
// }
// }Häufige Anpassungs-Anforderungen & Lösungen
1. "Ich will ein Custom Feld im Checkout"
Lösung: Checkout UI Extension (Shopify Plus)
Alternativen für Non-Plus:
- Pre-Checkout-Seite: Custom Page vor Checkout (mit Cart-Attributen)
- Cart-Page Custom Fields: Theme-Anpassung
- Post-Purchase-Survey: Nach Bestellung (Shopify Flow)
<!-- sections/cart-template.liquid -->
<div class="cart-note">
<label for="cart-note">Lieferhinweise (optional)</label>
<textarea
name="note"
id="cart-note"
form="cart"
placeholder="z.B. Hintereingang nutzen"
>{{ cart.note }}</textarea>
</div>
<script>
// Auto-save note
document.getElementById('cart-note').addEventListener('blur', function() {
fetch('/cart/update.js', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ note: this.value })
});
});
</script>2. "Ich will den Checkout komplett neu designen"
Lösung: Gibt es nicht. Shopify erlaubt keine drastischen Layout-Änderungen.
Workaround:
- Branding maximal ausreizen (Farben, Fonts, Logo)
- Headless Commerce mit Shopify Checkout-Link (Kunde wird weitergeleitet)
3. "Ich brauche Altersverifikation im Checkout"
Lösung: Checkout Validation Function (Shopify Plus)
// extensions/age-verification/src/index.ts
import type { RunInput, FunctionResult } from '../generated/api';
export function run(input: RunInput): FunctionResult {
const birthdate = input.cart.attribute?.find(
(attr) => attr.key === 'birthdate'
)?.value;
if (!birthdate) {
return {
errors: [
{
localizedMessage: 'Bitte geben Sie Ihr Geburtsdatum an.',
target: 'cart',
},
],
};
}
const age = calculateAge(new Date(birthdate));
if (age < 18) {
return {
errors: [
{
localizedMessage:
'Sie müssen mindestens 18 Jahre alt sein, um zu bestellen.',
target: 'cart',
},
],
};
}
return {};
}
function calculateAge(birthDate: Date): number {
const today = new Date();
let age = today.getFullYear() - birthDate.getFullYear();
const monthDiff = today.getMonth() - birthDate.getMonth();
if (
monthDiff < 0 ||
(monthDiff === 0 && today.getDate() < birthDate.getDate())
) {
age--;
}
return age;
}Alternative für Non-Plus:
- Pre-Checkout-Seite mit Altersabfrage
- Post-Purchase-Stornierung bei ungültigem Alter (mit Shopify Flow)
4. "Ich will bestimmte Zahlungsmethoden ausblenden"
Lösung: Payment Customization Function (Shopify Plus)
// extensions/payment-filtering/src/index.ts
import type { RunInput, FunctionResult } from '../generated/api';
export function run(input: RunInput): FunctionResult {
const cartTotal = parseFloat(input.cart.cost.totalAmount.amount);
const operations = [];
// PayPal nur für Orders > €100
if (cartTotal < 100) {
const paypalMethod = input.paymentMethods.find(
(method) => method.name === 'PayPal'
);
if (paypalMethod) {
operations.push({
hide: {
paymentMethodId: paypalMethod.id,
},
});
}
}
// Rechnung nur für B2B-Kunden
const isB2BCustomer = input.cart.attribute?.find(
(attr) => attr.key === 'customer_type'
)?.value === 'b2b';
if (!isB2BCustomer) {
const invoiceMethod = input.paymentMethods.find(
(method) => method.name === 'Rechnung'
);
if (invoiceMethod) {
operations.push({
hide: {
paymentMethodId: invoiceMethod.id,
},
});
}
}
return { operations };
}Alternative für Non-Plus:
- Keine native Lösung
- Custom App mit post-checkout Validierung (komplex und nicht empfohlen)
5. "Ich will Geschenkverpackung als Option"
Lösung 1: Line-Item-Property im Cart (Theme-Anpassung)
<!-- sections/cart-template.liquid -->
<div class="gift-wrap-option">
<label>
<input
type="checkbox"
name="attributes[gift_wrap]"
value="Ja"
{{ if cart.attributes.gift_wrap == 'Ja' }}checked{{ endif }}
/>
Geschenkverpackung hinzufügen (+€5)
</label>
</div>
<script>
// Auto-save attribute
document.querySelector('[name="attributes[gift_wrap]"]')
.addEventListener('change', function() {
fetch('/cart/update.js', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
attributes: {
gift_wrap: this.checked ? 'Ja' : 'Nein'
}
})
});
});
</script>Lösung 2: Product-Upsell im Cart (Geschenkbox als Produkt)
Lösung 3: Checkout Extension mit Custom Checkbox (Plus)
6. "Ich brauche B2B-Features (USt-ID-Eingabe)"
Lösung: Shopify B2B-Modus (Plus) oder Custom Field Extension
// extensions/vat-id-field/src/Checkout.tsx
import {
reactExtension,
TextField,
useApplyAttributeChange,
useAttributes,
} from '@shopify/ui-extensions-react/checkout';
export default reactExtension(
'purchase.checkout.block.render',
() => <VatIdField />
);
function VatIdField() {
const applyAttributeChange = useApplyAttributeChange();
const attributes = useAttributes();
const vatId = attributes.find((attr) => attr.key === 'vat_id')?.value || '';
const handleChange = (value: string) => {
applyAttributeChange({
type: 'updateAttribute',
key: 'vat_id',
value,
});
};
// Basic VAT ID validation
const validateVatId = (value: string): boolean => {
// DE VAT ID: DE + 9 digits
const dePattern = /^DE[0-9]{9}$/;
return dePattern.test(value);
};
return (
<TextField
label="USt-ID (optional)"
placeholder="DE123456789"
value={vatId}
onChange={handleChange}
error={vatId && !validateVatId(vatId)
? 'Ungültiges USt-ID-Format'
: undefined
}
/>
);
}Was Sie NIEMALS anpassen können
1. Kreditkarten-Felder
Grund: PCI-DSS-Compliance Keine Ausnahme: Selbst mit Plus nicht möglich.
2. Checkout-URL ändern
Der Checkout läuft immer unter:
your-store.myshopify.com/checkout
Workaround (Plus): Custom Domain für den gesamten Shop (inkl. Checkout)
3. Checkout komplett überspringen
Grund: Shopify will sicherstellen, dass Zahlungen korrekt abgewickelt werden.
Workaround: "Express Checkout" mit Shop Pay (automatisch verfügbar)
4. Multi-Page-Checkout erstellen
Shopify erzwingt einen Single-Page-Checkout (alle Steps auf einer Seite).
Grund: Bessere Conversion durch weniger Klicks.
5. Checkout ohne Shopify-Branding (Non-Plus)
Das "Powered by Shopify"-Badge ist auf Basic/Shopify/Advanced-Plänen Pflicht.
Lösung: Upgrade auf Shopify Plus (ab €2.000/Monat)
Checkout-Performance: Was Sie beachten müssen
Best Practices
1. Minimale Extensions Jede Extension = zusätzliche Ladezeit.
- ✅ Maximal 2-3 Extensions gleichzeitig
- ❌ Keine schweren Bilder oder Videos
- ✅ Lazy Loading für Bilder
2. Server-Side-Validierung Validierungen sollten schnell sein (< 100ms Response-Zeit).
3. Keine externen API-Calls Extensions sollten keine API-Requests zu Drittanbietern machen:
- ❌ Datenschutz-Risiko
- ❌ Langsamer Checkout
- ❌ Potenzielle Timeouts
4. Testing vor Production
- ✅ Test-Checkout-Flows mit echten Daten
- ✅ Cross-Browser-Testing (Chrome, Safari, Firefox)
- ✅ Mobile-Testing (iOS & Android)
Deployment & Testing
# Extension lokal testen
shopify app dev
# Extension für Deployment builden
shopify app build
# Extension deployen (zu Shopify Partner Dashboard)
shopify app deploy
# Extension Version erstellen
shopify app release --version=1.0.0
# Mit GitHub Actions automatisieren:
# .github/workflows/deploy-extensions.yml
name: Deploy Checkout Extensions
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Shopify CLI
run: npm install -g @shopify/cli @shopify/app
- name: Build Extensions
run: shopify app build
- name: Deploy to Shopify
env:
SHOPIFY_API_KEY: ${{ secrets.SHOPIFY_API_KEY }}
SHOPIFY_API_SECRET: ${{ secrets.SHOPIFY_API_SECRET }}
run: shopify app deployKosten von Checkout-Anpassungen
Shopify Plus Upgrade
| Plan | Preis | Transaktionsgebühren | |------|-------|---------------------| | Shopify Plus | ab €2.000/Monat | 0,15% pro Transaktion | | Shopify Plus (Volumen) | individuell | verhandelbar |
Achtung: Plus lohnt sich erst ab €1 Mio. Jahresumsatz.
Entwicklungskosten
| Anpassung | Kosten (€) | Zeitaufwand | |-----------|------------|-------------| | Simple Custom Field | 600 - 1.200 | 2-3 Tage | | Trust-Badges hinzufügen | 300 - 600 | 1 Tag | | Upsell-Banner | 900 - 1.800 | 3-4 Tage | | Checkout Function (Discounts) | 1.200 - 3.000 | 1 Woche | | Payment Customization | 1.800 - 4.800 | 1-2 Wochen | | Komplexe B2B-Logik | 3.000 - 9.000 | 2-4 Wochen | | Testing & QA | +500 - 1.500 | Immer einplanen |
Alternativen zu Checkout-Anpassungen
1. Pre-Checkout-Page
Erstellen Sie eine Custom-Page vor dem Checkout:
Cart → Custom Pre-Checkout Page → Shopify Checkout
Vorteile:
- ✅ Volle Kontrolle über Design & Felder
- ✅ Funktioniert auf jedem Plan
- ❌ Ein zusätzlicher Schritt = mehr Drop-off (10-15%)
2. Post-Purchase-Upsell
Shopify bietet native Post-Purchase-Pages (nach Zahlung):
Vorteile:
- ✅ One-Click-Upsells
- ✅ Keine zusätzlichen Zahlungs-Details nötig
- ❌ Nur auf Shopify Plus
3. Thank-You-Page-Anpassung
Die Bestätigungsseite nach Bestellung ist voll anpassbar:
- ✅ Custom HTML/CSS/JS
- ✅ Tracking-Pixel (Facebook, Google)
- ✅ Cross-Sell-Angebote
- ✅ Review-Requests
Wann Sie auf Shopify Plus upgraden sollten
Upgrade macht Sinn, wenn:
- ✅ Sie > €1 Mio. Jahresumsatz machen (Break-even)
- ✅ Checkout-Anpassungen geschäftskritisch sind
- ✅ Sie B2B-Funktionen brauchen (USt-ID, Netto-Preise, Kundengruppen)
- ✅ Sie Multi-Currency & Multi-Language nutzen (Shopify Markets)
- ✅ Sie API-Rate-Limits erreichen (Plus hat höhere Limits)
Upgrade macht KEINEN Sinn, wenn:
- ❌ Budget < €2.000/Monat
- ❌ Anpassungen sind "nice to have", nicht kritisch
- ❌ Theme-Anpassungen reichen aus
- ❌ Jahresumsatz < €500.000
Fazit: Realismus bei Checkout-Anpassungen
Die 3 wichtigsten Erkenntnisse:
- Shopify Checkout ist absichtlich restriktiv – und das ist gut für Ihre Conversion (PCI-Compliance, Performance, Security).
- Checkout Extensibility (Plus) bietet Flexibilität – aber keine Wunder. Drastische Änderungen sind nicht möglich.
- Viele Anforderungen lassen sich mit Workarounds lösen – ohne Plus (Pre-Checkout Page, Cart-Anpassungen, Post-Purchase).
Bevor Sie €2.000/Monat für Plus ausgeben: Prüfen Sie, ob eine Pre-Checkout-Page oder Cart-Anpassung Ihr Problem löst.
Brauchen Sie eine Custom Checkout-Lösung?
In einem kostenlosen Erstgespräch analysiere ich:
- Ob Ihre Anforderung mit Standard-Shopify lösbar ist
- Ob sich ein Plus-Upgrade lohnt (ROI-Kalkulation)
- Welche Workarounds Sie nutzen können
- Realistische Kosten & Entwicklungszeit
- Technische Machbarkeit Ihrer Anforderungen
Checkout-Anpassung geplant?
Lassen Sie uns Ihre Anforderungen besprechen und die beste Lösung finden – ohne unnötige Kosten.
Kostenloses Erstgespräch
Über den Autor: Justin Kreutzmann ist Shopify-Entwickler mit Erfahrung in Checkout-Anpassungen auf Shopify Plus. Er hat 30+ Checkout-Extensions gebaut und berät Unternehmen bei Plan-Entscheidungen (Standard vs. Plus).