Checkout & UX

Shopify Checkout anpassen: Grenzen und Lösungen 2025

14 min LesezeitJustin Kreutzmann
Shopify Checkout Anpassung - Grenzen und Lösungen

Die unbequeme Wahrheit über Shopify Checkout

Der Shopify Checkout ist absichtlich restriktiv. Warum? Weil Shopify drei Dinge garantieren will:

  1. Security: PCI-DSS-Compliance ohne Wenn und Aber
  2. Performance: Schnellster Checkout = höchste Conversion
  3. 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 für Checkout (limitiert)css
/* 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.liquid editieren~~ (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

Checkout UI Extension: Custom Fieldtypescript
// 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

Free Shipping Progress Bannertypescript
// 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

Trust Badges Extensiontypescript
// 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)

Product Upsell am Checkouttypescript
// 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

Checkout Function: Shipping Customizationrust
// 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):

Checkout Function in TypeScripttypescript
// 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)
Cart-Page Custom Field (Non-Plus Alternative)liquid
<!-- 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)

Age Verification Functiontypescript
// 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)

Payment Method Filteringtypescript
// 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)

Gift Wrap Option im Cartliquid
<!-- 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

VAT ID Field Extensiontypescript
// 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

Shopify App CLI: Extension deployenbash
# 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 deploy

Kosten 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:

  1. Shopify Checkout ist absichtlich restriktiv – und das ist gut für Ihre Conversion (PCI-Compliance, Performance, Security).
  2. Checkout Extensibility (Plus) bietet Flexibilität – aber keine Wunder. Drastische Änderungen sind nicht möglich.
  3. 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).