Shopify Scripts: Bestellungen bis 30. Juni 2026 auf Functions umstellen

Von Shubham Vats, Gründer von Revize

Veröffentlicht am 15 Min. Lesezeit

Auf dieser Seite

Heute ist der 16. April 2026. Gestern, am 15. April, hat Shopify den Script Editor endgültig gesperrt. Sie können keine neuen Scripts mehr erstellen oder veröffentlichen. Besonders betroffen ist die Logik für Änderungen nach dem Kauf: Änderungen der Versandadresse sind mit 30,2 % aller bearbeiteten Bestellungen die häufigste Änderung nach dem Kauf (Revize, 2026). Jedes Script, das solche Änderungen verarbeitet, ist jetzt eingefroren. In 75 Tagen, am 30. Juni 2026, endet die Ausführung.

Wenn Sie als Entwickler für einen Shopify Plus Shop arbeiten oder als Agentur einen Plus Shop betreuen und diese Migration seit zwölf Monaten auf den „nächsten Sprint“ verschieben, müssen Sie jetzt handeln. Es geht um einen Checkout, der ab dem 1. Juli nicht mehr wie vorgesehen funktioniert. In den meisten Plus Shops haben sich über die Jahre 5 bis 20 Scripts angesammelt. Jedes steuert im Hintergrund eine Rabattregel, blendet eine Versandart aus oder schränkt Zahlungsmethoden ein. Oft weiß niemand mehr, wer es geschrieben hat.

Dieser Leitfaden ist die technische Migrationsanleitung, die wir uns im Januar gewünscht hätten. Er behandelt den konkreten Code und nicht nur die Planung. Danach wissen Sie, wie Sie mit der Shopify CLI eine Function erstellen, die Logik für Rabatte sowie Versand- und Zahlungsanpassungen in Rust oder JavaScript schreiben, sie sicher mit einer markierten Kundengruppe testen und in Produktion bringen, ohne Ihren bestehenden Checkout zu beeinträchtigen.

Stellen wir Ihren Shop von Scripts auf Functions um.

Entwickler bei der Migration von Shopify Scripts zu Shopify Functions

Kurzantwort: Von Scripts zu Functions in 60 Sekunden

Die Migration in einem Absatz: Shopify Scripts (Ruby-Code im Script Editor, nur für Plus) werden durch Shopify Functions ersetzt (WebAssembly-Module in Rust oder JavaScript, für alle Tarife verfügbar). Sie erstellen eine Function mit shopify app generate extension, schreiben eine run.graphql-Abfrage für die benötigten Warenkorbdaten und eine Datei run.rs oder run.js, die Aktionen zurückgibt, etwa Rabatte oder ausgeblendete Versandarten. Anschließend stellen Sie sie mit shopify app deploy bereit und aktivieren sie im Adminbereich oder per GraphQL-Mutation. Functions laufen als kompiliertes WASM mit einer Ausführungszeit unter 5 ms, sind in jedem Tarif nutzbar und sind künftig der einzige von Shopify unterstützte Weg für solche Anpassungen.

Was sich am 30. Juni tatsächlich ändert

Bevor wir uns den Code ansehen, klären wir die Termine. Es gibt zwei, und beide sind wichtig.

Datum Was passiert Was Sie tun müssen
15. April 2026 (bereits vorbei) Der Script Editor ist schreibgeschützt. Keine neuen Scripts, keine Änderungen an bestehenden Scripts. Bestehende Scripts werden weiterhin ausgeführt. Migrieren Sie jetzt; Ihre Script-Logik lässt sich nicht mehr ändern.
30. Juni 2026 Alle Shopify Scripts werden nicht mehr ausgeführt. Ohne Ausnahme. Ihr Ersatz durch eine Function muss vor diesem Datum aktiv sein.

Entweder ist Ihre Function bis zum 30. Juni bereitgestellt und Ihr Checkout funktioniert weiter wie vorgesehen, oder sie ist es nicht. Dann gelten für jeden betroffenen Warenkorb wieder die Standardpreise und regulären Versandtarife, und alle Zahlungsmethoden sind aktiviert. Eine teilweise Migration hilft nicht: Ein Script wird entweder ausgeführt oder nicht. Nach dem 30. Juni wird es nicht mehr ausgeführt.

Tipp: Öffnen Sie in Shopify Admin Settings → Checkout → Customizations Report. Der Bericht listet alle aktiven Scripts Ihres Shops, ihre Aufgaben und den jeweils empfohlenen Function-Typ als Ersatz auf. Beginnen Sie dort.

Functions und Scripts: Was sich tatsächlich geändert hat

Merkmal Shopify Scripts (werden eingestellt) Shopify Functions (Ersatz)
Sprache Ruby DSL (Shopify-spezifisch) Rust, JavaScript, TypeScript
Laufzeit Isolierte Ruby-Umgebung auf der Shopify-Infrastruktur WebAssembly (WASM) — Ausführung unter 5 ms
Verfügbarkeit nach Tarif Nur Plus Alle Tarife (benutzerdefinierte Apps erfordern Plus; öffentliche Apps stehen allen offen)
Editor Script Editor im Adminbereich Lokale Entwicklungsumgebung + Shopify CLI
Versionierung Keine — Änderungen gehen direkt live Gut mit Git verwaltbar — vollständige Versionskontrolle
Tests Manuell im Checkout Lokale Entwicklung mit shopify app dev, Vorschau-Links
Bereitstellung Im Adminbereich auf „Speichern“ klicken shopify app deploy im Terminal
Einsatzbereiche Positionen, Versand, Zahlungen Rabatte, Cart Transform, Validierung, Delivery Customization, Payment Customization, Order Routing, Fulfillment Constraints und weitere

Der Unterschied in der Architektur ist wichtig. Bei Scripts änderten Sie Ruby-Code in einem Textfeld. Für Functions entwickeln Sie eine App, verwalten den Code in der Versionskontrolle, testen lokal und stellen ihn über eine CI-Pipeline bereit. Der Einstieg ist aufwendiger. Zugleich ist Functions Shopifys langfristiger Ansatz für die Checkout-Logik. Auf absehbare Zeit sollte dafür keine weitere Migration nötig sein.

So ordnen Sie Ihre Scripts dem richtigen Function-Typ zu

Jedes Ihrer heutigen Scripts lässt sich genau einer Function-API zuordnen. Diese Tabelle hilft bei der Auswahl.

Bisheriger Script-Typ Aufgabe Neue Function-API Function-Ziel
Line Item Script Rabatte für bestimmte Produkte, Kunden oder Warenkorbbedingungen anwenden Cart & Checkout Discounts API cart.lines.discounts.generate.run
Shipping Script (Rabatt) Kostenlosen oder vergünstigten Versand anhand von Warenkorbregeln anbieten Cart & Checkout Discounts API cart.delivery-options.discounts.generate.run
Shipping Script (ausblenden / umbenennen / neu sortieren) Einen Versandtarif ab $X ausblenden, „Standard“ in „Kostenlos ab $50“ umbenennen Delivery Customization API cart.delivery-options.transform.run
Payment Script PayPal für B2B ausblenden, Nachnahme über $500 ausblenden, Zahlungsmethoden neu sortieren Payment Customization API cart.payment-methods.transform.run
Script zur Änderung des Warenkorbs (selten) Produkte bündeln, Positionen austauschen Cart Transform API cart.transform.run
Script zur Sperrung des Checkouts Warenkorb bei einer ungültigen Kombination von SKUs zurückweisen Cart & Checkout Validation API cart.validations.generate.run

Wenn Sie zehn Scripts haben, werden Sie vermutlich drei bis fünf Functions erstellen. Mehrere Scripts lassen sich oft in einer Function mit übersichtlicheren Verzweigungen zusammenfassen.

Shopify Functions bündeln Anpassungen für Rabatte, Versand und Zahlungen

Voraussetzung: Lokale Entwicklungsumgebung einrichten

Bevor Sie eine Function erstellen, müssen drei Dinge lokal installiert sein. Prüfen Sie sie im Terminal.

1. Node.js 18+

Shell
node --version
# Must be >= 18.0.0

Falls Ihre Version älter ist, installieren Sie Node.js über nvm oder laden Sie es von nodejs.org herunter.

2. Shopify CLI 3+

Shell
npm install -g @shopify/cli@latest
shopify version
# Should output 3.x or higher

3. Rust-Toolchain (nur wenn Sie Functions in Rust schreiben)

Shell
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup target add wasm32-wasip1
cargo --version

Für JavaScript-Functions brauchen Sie kein Rust. Wählen Sie für Ihr Team eine Sprache und bleiben Sie dabei. Zwei Sprachen erhöhen den Wartungsaufwand.

4. Ein Entwicklungsshop

Melden Sie sich in Ihrem Partner-Dashboard an und erstellen Sie einen neuen Entwicklungsshop, oder verwenden Sie einen vorhandenen. Sie stellen die Functions zuerst dort bereit und bringen sie anschließend in Produktion.

Ihre erste Function erstellen

Die CLI übernimmt den Großteil des Grundgerüsts. Führen Sie in einem beliebigen Verzeichnis Folgendes aus:

Shell
# Create a new Shopify app (skip if you already have one)
shopify app init my-checkout-functions
cd my-checkout-functions

# Generate a Function extension
shopify app generate extension

Die CLI führt Sie durch die Auswahl. Für eine Rabatt-Function wählen Sie:

  • Typ: Function
  • Vorlage: discount (oder cart_checkout_validation, delivery_customization, payment_customization usw.)
  • Sprache: Rust oder JavaScript
  • Name: beispielsweise volume-discount-fn

Dadurch entsteht extensions/volume-discount-fn/ mit folgender Struktur:

Code
extensions/volume-discount-fn/
├── shopify.extension.toml      # Function config — targets, build, version
├── src/
│   ├── cart_lines_discounts_generate_run.graphql   # Input query
│   └── cart_lines_discounts_generate_run.rs        # Function logic
├── Cargo.toml                  # Rust dependencies (Rust only)
└── README.md

Sie werden hauptsächlich drei Dateien bearbeiten: .toml für die Konfiguration, .graphql für die Eingabedaten und .rs / .js für die Logik.

Anleitung 1: Line Item Script ersetzen (Mengenrabatt)

Angenommen, Ihr bisheriges Script gewährt 10 % Rabatt auf die Zwischensumme der Bestellung, sobald der Warenkorb mindestens 5 Artikel aus einer bestimmten Kollektion enthält. So setzen Sie das als Function um.

Schritt 1.1: Konfiguration (shopify.extension.toml)

TOML
api_version = "2026-01"

[[extensions]]
name = "volume-discount-fn"
handle = "volume-discount-fn"
type = "function"

[[extensions.targeting]]
target = "cart.lines.discounts.generate.run"
input_query = "src/cart_lines_discounts_generate_run.graphql"
export = "cart_lines_discounts_generate_run"

[extensions.build]
command = "cargo build --target=wasm32-wasip1 --release"
path = "target/wasm32-wasip1/release/volume-discount-fn.wasm"
watch = ["src/**/*.rs"]

Schritt 1.2: Eingabeabfrage (src/cart_lines_discounts_generate_run.graphql)

GraphQL
query Input {
  cart {
    lines {
      id
      quantity
      cost {
        subtotalAmount {
          amount
        }
      }
      merchandise {
        ... on ProductVariant {
          product {
            inAnyCollection(ids: ["gid://shopify/Collection/123456789"])
          }
        }
      }
    }
  }
  discount {
    discountClasses
  }
}

Tipp: Functions sehen nur die Daten, die Sie abfragen. Halten Sie die GraphQL-Abfrage so knapp wie möglich. Jedes weggelassene Feld macht die Ausführung schneller und günstiger.

Schritt 1.3: Logik (src/cart_lines_discounts_generate_run.rs)

Rust
use super::schema;
use shopify_function::prelude::*;
use shopify_function::Result;

#[shopify_function]
fn cart_lines_discounts_generate_run(
    input: schema::cart_lines_discounts_generate_run::Input,
) -> Result<schema::CartLinesDiscountsGenerateRunResult> {
    // Bail if discount class doesn't match
    let has_order_discount = input
        .discount()
        .discount_classes()
        .contains(&schema::DiscountClass::Order);

    if !has_order_discount {
        return Ok(schema::CartLinesDiscountsGenerateRunResult { operations: vec![] });
    }

    // Sum quantities of items in the target collection
    let qualifying_qty: i64 = input
        .cart()
        .lines()
        .iter()
        .filter(|line| {
            if let schema::Merchandise::ProductVariant(v) = line.merchandise() {
                *v.product().in_any_collection()
            } else {
                false
            }
        })
        .map(|line| *line.quantity())
        .sum();

    if qualifying_qty < 5 {
        return Ok(schema::CartLinesDiscountsGenerateRunResult { operations: vec![] });
    }

    // Apply 10% off the order subtotal
    Ok(schema::CartLinesDiscountsGenerateRunResult {
        operations: vec![schema::CartOperation::OrderDiscountsAdd(
            schema::OrderDiscountsAddOperation {
                selection_strategy: schema::OrderDiscountSelectionStrategy::First,
                candidates: vec![schema::OrderDiscountCandidate {
                    targets: vec![schema::OrderDiscountCandidateTarget::OrderSubtotal(
                        schema::OrderSubtotalTarget {
                            excluded_cart_line_ids: vec![],
                        },
                    )],
                    message: Some("Volume discount: 10% off".to_string()),
                    value: schema::OrderDiscountCandidateValue::Percentage(
                        schema::Percentage { value: Decimal(10.0) }
                    ),
                    conditions: None,
                    associated_discount_code: None,
                }],
            },
        )],
    })
}

Schritt 1.4: Testen, bereitstellen, aktivieren

Shell
# Local development with hot reload
shopify app dev

# When ready, deploy
shopify app deploy

# In the GraphiQL panel that opens (press `g` in the dev terminal),
# create the automatic discount that uses your Function:
GraphQL
mutation {
  discountAutomaticAppCreate(
    automaticAppDiscount: {
      title: "Volume Discount (5+ collection items)"
      functionHandle: "volume-discount-fn"
      discountClasses: [ORDER]
      startsAt: "2026-04-16T00:00:00Z"
    }
  ) {
    automaticAppDiscount { discountId }
    userErrors { field message }
  }
}

Damit ist die Function aktiv, versioniert und ersetzt das bisherige Script vollständig.

Anleitung 2: Shipping Script ersetzen (Versandart ab einem Warenkorbwert ausblenden)

Ein häufiges Script lautet: „Expressversand ausblenden, wenn die Zwischensumme des Warenkorbs über $500 liegt, damit für große Bestellungen keine teure Zustellung über Nacht angeboten wird.“ So sieht die Umsetzung mit einer Delivery Customization Function aus.

Schritt 2.1: Grundgerüst erstellen

Shell
shopify app generate extension --template delivery_customization --name hide-express-fn

Schritt 2.2: Eingabeabfrage (src/run.graphql)

GraphQL
query Input {
  cart {
    cost {
      subtotalAmount {
        amount
      }
    }
    deliveryGroups {
      deliveryOptions {
        handle
        title
      }
    }
  }
}

Schritt 2.3: Logik (src/run.js — JavaScript-Variante)

JavaScript
// @ts-check
/**
 * @typedef {import("../generated/api").RunInput} RunInput
 * @typedef {import("../generated/api").FunctionRunResult} FunctionRunResult
 */

const NO_CHANGES = { operations: [] };
const THRESHOLD = 500.0;
const HIDE_TITLES = ["Express", "Overnight"];

/**
 * @param {RunInput} input
 * @returns {FunctionRunResult}
 */
export function run(input) {
  const subtotal = parseFloat(input.cart.cost.subtotalAmount.amount);
  if (subtotal < THRESHOLD) return NO_CHANGES;

  const operations = input.cart.deliveryGroups.flatMap((group) =>
    group.deliveryOptions
      .filter((opt) => HIDE_TITLES.some((t) => opt.title.includes(t)))
      .map((opt) => ({
        hide: { deliveryOptionHandle: opt.handle },
      }))
  );

  return { operations };
}

Schritt 2.4: Im Adminbereich aktivieren (kein GraphQL nötig)

Für Delivery Customizations gibt es eine integrierte Oberfläche im Adminbereich. Nach shopify app deploy:

  1. Öffnen Sie Settings → Shipping and delivery
  2. Scrollen Sie nach unten zum Abschnitt Customizations
  3. Klicken Sie auf Add customization und wählen Sie Ihre Function aus
  4. Speichern Sie

Die Regel zum Ausblenden ist nun in Produktion aktiv. Eine Mutation ist nicht erforderlich.

Shopify Delivery Customization Function blendet eine Versandoption im Checkout aus

Anleitung 3: Payment Script ersetzen (Nachnahme für B2B ausblenden)

Bisheriges Script: „Nachnahme für alle Kunden mit dem Tag ‚B2B‘ ausblenden.“ So setzen Sie es mit Payment Customization um.

Schritt 3.1: Grundgerüst erstellen

Shell
shopify app generate extension --template payment_customization --name hide-cod-b2b-fn

Schritt 3.2: Eingabeabfrage

GraphQL
query Input {
  cart {
    buyerIdentity {
      customer {
        hasTags(tags: [{ tag: "B2B" }]) {
          tag
          hasTag
        }
      }
    }
  }
  paymentMethods {
    id
    name
  }
}

Schritt 3.3: Logik (src/run.js)

JavaScript
const NO_CHANGES = { operations: [] };

export function run(input) {
  const tagCheck = input.cart?.buyerIdentity?.customer?.hasTags?.[0];
  const isB2B = tagCheck?.hasTag === true;
  if (!isB2B) return NO_CHANGES;

  const codMethod = input.paymentMethods.find((pm) =>
    pm.name.toLowerCase().includes("cash on delivery")
  );
  if (!codMethod) return NO_CHANGES;

  return {
    operations: [{ hide: { paymentMethodId: codMethod.id } }],
  };
}

Schritt 3.4: Aktivieren

Auch Payment Customizations haben eine Oberfläche im Adminbereich unter Settings → Payments → Customizations. Gehen Sie wie bei der Versandanpassung vor: Function auswählen und speichern.

Ein Wort zu Änderungen nach dem Kauf

Da Sie diesen Artikel im Blog von Revize lesen, ein kurzer Hinweis: Revize übernimmt Aufgaben, die Functions nicht abdecken. Nach einer Bestellung möchten Kunden vielleicht einen Artikel hinzufügen, eine Größe tauschen, die Versandadresse korrigieren oder einen vergessenen Rabatt anwenden. Functions greifen im Checkout. Revize greift danach. Functions bestimmen, was im Warenkorb zulässig ist. Revize ermöglicht Ihren Kunden und Ihrem Supportteam, die Bestellung anschließend zu bearbeiten, ohne sie erst zu erstatten und neu anzulegen. Das ist für zwei Arten von Shops wichtig: für Shops mit so vielen Bestellungen, dass manuelle Bearbeitung nicht mehr mithält – darunter Plus Shops, aber auch Advanced Shops mit hohem Bestellvolumen – und für Shops, deren Marke stark vom Kundenerlebnis lebt. Dort kann eine E-Mail mit „Leider können wir das nicht ändern“ den nächsten Kauf verhindern.

Wenn Ihr Migrationsplan Scripts durch Functions ersetzt, Sie aber die Bestellbearbeitung nach dem Kauf noch nicht gelöst haben, stehen Sie in etwa drei Wochen vor dem nächsten Problem. Unser kürzlich veröffentlichter Leitfaden zur Bestellverwaltung zeigt den gesamten Ablauf nach dem Checkout.

Zurück zur Migration.

Teststrategie: Kunden mit Tags schrittweise einbeziehen

Functions haben keinen „Entwurfsmodus“, den Sie im Adminbereich ein- oder ausschalten können. In der Praxis begrenzen Sie die neue Function zunächst auf Kunden mit einem bestimmten Tag. Lassen Sie das alte Script und die neue Function parallel laufen, prüfen Sie, ob beide für diese Kunden dieselben Ergebnisse liefern, und schalten Sie die Function dann für alle frei.

Schritt 1: Testkunden markieren

Fügen Sie unter Kunden bei zwei oder drei internen Konten den Tag FN-TESTER hinzu.

Schritt 2: Die Function anhand des Tags verzweigen lassen

JavaScript
// At the top of your run function
let is_tester = input
    .cart()
    .buyer_identity()
    .and_then(|bi| bi.customer())
    .map(|c| c.has_any_tag())
    .unwrap_or(&false);

if !*is_tester {
    return Ok(default_result);  // Fall through to existing Script
}

// New Function logic only runs for tagged users

Schritt 3: hasAnyTag zur Eingabeabfrage hinzufügen

GraphQL
cart {
  buyerIdentity {
    customer {
      hasAnyTag(tags: ["FN-TESTER"])
    }
  }
}

Schritt 4: Im Checkout prüfen

Melden Sie sich als Kunde mit Tag an, durchlaufen Sie den Checkout und prüfen Sie, ob die Function ausgeführt wird. Melden Sie sich anschließend als Kunde ohne Tag an und prüfen Sie, ob das alte Script weiterhin läuft. Wenn die Ergebnisse einige Tage lang übereinstimmen, entfernen Sie die Tag-Prüfung und lassen Sie die Function für alle ausführen.

Schritt 5: Das alte Script deaktivieren

Öffnen Sie Apps → Script Editor → [Your Script] → Unpublish. Danach ist allein die Function maßgeblich.

Ein Bereitstellungsablauf, der mit Ihrem Team wächst

Stellen Sie Functions nicht dauerhaft vom Laptop eines Entwicklers bereit. Sobald Sie ein oder zwei Scripts migriert haben, richten Sie eine CI-Pipeline ein.

Der kleinste sinnvolle Ablauf

YAML
# .github/workflows/deploy-functions.yml
name: Deploy Shopify Functions
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - uses: dtolnay/rust-toolchain@stable
        with: { targets: wasm32-wasip1 }
      - run: npm install -g @shopify/cli@latest
      - run: shopify app deploy --force
        env:
          SHOPIFY_CLI_PARTNERS_TOKEN: ${{ secrets.SHOPIFY_CLI_PARTNERS_TOKEN }}

Erstellen Sie das Partner-Token in Ihrem Partner-Dashboard unter Settings → Tokens. Danach stellt jeder Merge in main Ihre Functions bereit. Die Frage, ob jemand die letzte Änderung schon bereitgestellt hat, entfällt.

Versionierung und Zurücksetzen

shopify app deploy erstellt einen versionierten Stand. So kehren Sie zu einer früheren Version zurück:

Shell
shopify app versions list
shopify app release --version <previous-version-id>

Bei Scripts mussten Sie für eine Rückkehr den alten Code wiederfinden und erneut einfügen. Hier reicht die vorherige Version.

Bereitstellungspipeline für Shopify Functions mit lokalen, Staging- und Produktionsumgebungen

Fünf häufige Fehler

Bei der Begleitung von Plus Händlern durch diese Migration sind uns im vergangenen Jahr immer wieder dieselben fünf Fehler begegnet.

1. Functions als direkte Kopie jedes Scripts behandeln. Eine Function kann drei Scripts mit übersichtlicheren Verzweigungen ersetzen. Erfassen Sie Ihre Scripts als Gesamtsystem, bevor Sie sie neu schreiben.

2. Leseberechtigungen vergessen. Viele Functions benötigen read_customers, read_orders oder write_discounts. Tragen Sie die Berechtigungen in shopify.app.toml unter scopes ein und autorisieren Sie die App erneut. Andernfalls liefert Ihre Eingabeabfrage null zurück.

3. Functions ohne Vergleichstests für Kunden ohne Tag ausführen. Auch wenn der Code richtig aussieht, können Sonderfälle Probleme aufdecken: leere Warenkörbe, Geschenkgutscheine, Shop-Guthaben oder B2B-Entwürfe. Eine schrittweise Freigabe über Tags kostet zwei Tage und kann einen schwerwiegenden Ausfall verhindern.

4. Den Customizations Report überspringen. Er bietet den besten Überblick darüber, was in Ihrem Shop tatsächlich läuft. Migrieren Sie anhand des Berichts, nicht aus dem Gedächtnis.

5. Kollektions-IDs und Kundentags fest im Code hinterlegen. Verwenden Sie die Function-Konfiguration über Metafelder, wenn Händler Werte selbst anpassen sollen. Die CLI kann eine Konfiguration auf Basis von Metafeldern erstellen. Weitere Informationen finden Sie in der Shopify-Dokumentation zur Function-Konfiguration.

Migrationscheckliste für die nächsten 75 Tage

Ein realistischer Wochenplan, damit Sie bis zum 30. Juni fertig sind.

Zeitraum Aufgabe
Woche 1 (diese Woche) Customizations Report abrufen. Alle Scripts erfassen. Für jedes entscheiden: Function, öffentliche App oder löschen.
Wochen 2–3 Lokale Entwicklungsumgebung einrichten. Erste Function erstellen. Das einfachste Script migrieren, meist eine Regel zum Ausblenden einer Zahlungsmethode.
Wochen 4–6 Rabatt-Scripts migrieren. Sie dauern am längsten, weil die Discounts API die meisten Möglichkeiten bietet. Gründlich mit Tags testen.
Wochen 7–8 Versand-Scripts migrieren. Delivery Customizations im Adminbereich aktivieren.
Wochen 9–10 CI-Pipeline einrichten. Alle Bereitstellungen von Entwickler-Laptops auf die Pipeline umstellen.
Woche 11 (Mitte Juni) Abschließend prüfen, ob die Ergebnisse übereinstimmen. Alle Scripts deaktivieren. Den Shop zwei Wochen lang ausschließlich mit Functions betreiben.
30. Juni Die Abschaltung tritt in Kraft. Da Sie rechtzeitig fertig sind, funktioniert Ihr Checkout weiter.

Wenn Sie diese Woche anfangen, haben Sie einen Puffer. Wenn Sie erst im Juni beginnen, haben Sie keinen.

Wochenplan für die Migration von Shopify Scripts zu Functions

Häufig gestellte Fragen

Brauche ich Shopify Plus, um Functions zu nutzen?

Für benutzerdefinierte Functions benötigen Sie Shopify Plus. Functions aus öffentlichen Apps funktionieren dagegen in jedem Tarif. Ohne Plus haben Sie zwei Möglichkeiten: Installieren Sie eine öffentliche App aus dem Shopify App Store, die die benötigte Function bereitstellt, oder wechseln Sie zu Plus, um eigene benutzerdefinierte Functions zu schreiben. Die meisten größeren Händler mit Scripts nutzen bereits Plus. Für sie ändert sich dadurch praktisch wenig.

Kann ich Functions in TypeScript schreiben?

Ja. TypeScript wird vollständig unterstützt, und die CLI erstellt das Grundgerüst dafür. Wenn Sie shopify app generate extension ausführen und „JavaScript“ auswählen, enthält das erzeugte Projekt Typdefinitionen aus import("../generated/api"). Wenn Sie möchten, können Sie die Dateien in .ts umwandeln und eine tsconfig.json hinzufügen. Die kompilierte Ausgabe (WASM) ist unabhängig von der Ausgangssprache identisch.

Wie schnell sind Functions im Vergleich zu Scripts?

Functions werden normalerweise in weniger als 5 ms ausgeführt und sind damit deutlich schneller als Ruby Scripts. Sie werden zu WebAssembly kompiliert und laufen in einer schlanken Laufzeitumgebung. Shopify setzt ein Ausführungsbudget von 5 ms durch. Überschreitet Ihre Function dieses Budget, wird der Vorgang verworfen und die Function gibt keine Aktionen zurück. Eine gut geschriebene Function benötigt in der Praxis 1–2 ms. Die Leistungsgrenze liegt deutlich höher als bei Scripts.

Kann eine Function eine externe API aufrufen?

Nein. Functions können keine Netzwerkanfragen senden. Sie führen ausschließlich Berechnungen aus: Warenkorbdaten als Eingabe, Aktionen als Ausgabe. Wenn Sie externe Daten benötigen, etwa aus einem CRM oder einer Bestandsprüfung in Echtzeit, müssen Sie diese vorab in Metafeldern speichern oder einen anderen Weg nutzen, beispielsweise App Proxy, Webhooks oder Cart Transform mit einer Abfrage im Backend. Das ist der häufigste Grund, warum Teams ihre Logik neu entwerfen müssen, statt sie direkt zu übertragen.

Was ist der Unterschied zwischen Cart Transform und Discounts?

Discounts ändern Preise; Cart Transform ändert den Inhalt des Warenkorbs. Verwenden Sie die Discounts API für 10 % Rabatt, kostenlosen Versand oder „Kaufe eins, erhalte eins gratis“. Verwenden Sie Cart Transform, um zwei Produkte in einer Position zu bündeln oder eine Variante in mehrere Positionen aufzuteilen. Viele alte Scripts kombinierten beides. Trennen Sie diese Aufgaben bei der Migration in zwei Functions.

Wie teste ich eine Function lokal ohne Entwicklungsshop?

Sie können Unit-Tests mit cargo test (Rust) oder npm test (JS) ausführen. Für vollständige Integrationstests benötigen Sie aber einen Entwicklungsshop. Mit shopify app function run führt die CLI Ihre Function anhand einer Beispieldatei mit Eingabedaten aus. Das hilft bei schnellen Änderungen. Um das Verhalten im Checkout von Anfang bis Ende zu prüfen, brauchen Sie jedoch einen echten Shop mit einem echten Warenkorb.

Kann ich mehrere Functions desselben Typs haben?

Ja. Shopify unterstützt mehrere Functions pro Ziel und führt sie in einer festen Reihenfolge aus. Bei Rabatten richtet sich die Reihenfolge nach den Shopify-Regeln zur Kombination von Rabatten. Delivery und Payment Customizations können Sie verketten; die Ausgabe jeder Function fließt dabei in die nächste ein. Der Einfachheit halber verwenden die meisten Teams eine Function pro Typ.

Was passiert mit meinem Script, nachdem ich die Function bereitgestellt habe?

Beide laufen parallel, bis Sie das Script unter Apps → Script Editor deaktivieren. So können Sie die Ergebnisse während einer Testphase vergleichen. Sobald die Function nachweislich funktioniert, deaktivieren Sie das Script manuell. Nach dem 30. Juni 2026 werden alle Scripts nicht mehr ausgeführt, unabhängig davon, ob Sie sie deaktiviert haben.

Wirkt sich die Migration auf meine SEO oder mein Theme aus?

Nein. Functions laufen serverseitig im Checkout und verändern weder Ihr Theme noch Ihre Produktseiten. Sie ändern dort lediglich Rabatte, Versandoptionen und Zahlungsmethoden. Ihre Storefront, Produktvorlagen und SEO bleiben unberührt.

Wie migriere ich ein Script, das Input.line_items mit benutzerdefinierten Eigenschaften verwendet?

Benutzerdefinierte Eigenschaften sind in der GraphQL-Eingabe über das Feld attribute der Warenkorbpositionen verfügbar. Fügen Sie attribute(key: "your-key") { value } innerhalb der Auswahl lines hinzu. Die Function liest den Wert wie zuvor das Script die Eigenschaften einer Position, nur über GraphQL statt über Ruby-Methodenaufrufe.

Was ist mit Analysen und Bestelltags? Können Functions Daten schreiben?

Functions können weder selbst Bestelltags schreiben noch Webhooks auslösen. Sie geben nur Aktionen für den aktuellen Warenkorb zurück. Für Tags oder nachgelagerte Abläufe verwenden Sie Shopify Flow, ausgelöst durch die Erstellung der Bestellung. Viele Händler kombinieren eine Function für den Rabatt mit einem Flow, der die Bestellung mit „VOLUME-DISCOUNT-APPLIED“ markiert.

Kann ich statt einer eigenen Function eine öffentliche App installieren?

Ja. Im Shopify App Store gibt es Dutzende Apps, die Functions für häufige Anwendungsfälle bereitstellen. Suchen Sie nach „discount function“, „delivery customization“ oder „payment customization“. Bei einfachen Aufgaben, etwa Mengenrabatten, dem Ausblenden von Zahlungsmethoden anhand eines Tags oder kostenlosem Versand ab einem bestimmten Betrag, kann eine bestehende App Ihnen mehrere Entwicklungstage sparen. Erstellen Sie eigene Functions für Logik, die wirklich spezifisch für Ihr Unternehmen ist.

Was passiert, wenn ich die Frist am 30. Juni verpasse?

Das Script wird nicht mehr ausgeführt. Es gibt keinen Ersatzmechanismus, keine Übergangsfrist und keine Verlängerung. Was das Script bisher bewirkt hat – etwa einen Rabatt, eine ausgeblendete Versandart oder eine gesperrte Zahlungsmethode –, fällt am 1. Juli um Mitternacht UTC auf das Standardverhalten zurück. Wenn Ihr Geschäft von dieser Logik abhängt, sollten die Functions deutlich vorher aktiv sein. Die Migration dauert länger, als die meisten Teams erwarten, besonders mit Vergleichstests.

Kann ich die Script Editor App vollständig löschen?

Sie können sie nach dem 30. Juni 2026 deinstallieren; möglicherweise entfernt Shopify sie auch automatisch. Sobald Scripts nicht mehr ausgeführt werden, erfüllt der Editor keinen Zweck mehr. Wenn Sie die Migration bereits abgeschlossen haben, können Sie auch jetzt alle Scripts deaktivieren und die App sofort deinstallieren. Ihre Functions sind davon unabhängig.

Was Sie diese Woche tun sollten

Schließen Sie nach diesem Artikel nicht einfach den Tab. Erledigen Sie in den nächsten sieben Tagen diese vier Aufgaben.

1. Rufen Sie den Customizations Report ab. Öffnen Sie Settings → Checkout → Customizations Report und exportieren Sie ihn. Das ist Ihre Aufgabenliste für die Migration.

2. Richten Sie Ihre Entwicklungsumgebung ein. Installieren Sie Node 18+, die Shopify CLI und gegebenenfalls Rust. Prüfen Sie, ob shopify version funktioniert. Zeitaufwand insgesamt: 30 Minuten.

3. Erstellen Sie eine kleine Function und stellen Sie sie in einem Entwicklungsshop bereit. Wählen Sie Ihr einfachstes Script, meist eine Regel zum Ausblenden einer Zahlungsmethode. Migrieren Sie es vollständig. Selbst wenn die Function nie in Produktion geht, haben Sie damit Ihre Entwicklungswerkzeuge geprüft.

4. Reservieren Sie für die nächsten acht Wochen feste Termine im Kalender. Eine Migration erledigt sich nicht nebenbei zwischen Sprints. Planen Sie wiederkehrende Zeitfenster ein, beispielsweise jeden Dienstag- und Donnerstagnachmittag, und behandeln Sie sie wie einen Release.

Bei den Teams, deren Migration wir begleitet haben, wiederholt sich ein Muster: zwei Wochen Aufschub, drei Wochen Arbeit, eine Woche Nachbereitung. Das sind sechs Wochen. Sie haben zehn. Nutzen Sie den Puffer für Code-Reviews und Qualitätssicherung.

Wenn Ihre Checkout-Logik steht, folgt für viele Teams die Bestellbearbeitung nach dem Kauf: Kunden ändern Adressen, tauschen Artikel oder ergänzen Rabatte nach der Bestellung. Falls das auf Ihrer Planungsliste steht – ob Sie einen Plus Shop mit hohem Bestellvolumen oder einen auf Kundenerlebnis ausgerichteten Advanced Shop betreiben –, finden Sie Revize im Shopify App Store. Die App funktioniert neben jeder Function, die Sie hier erstellen.

Ressourcen

Aktualisiert im August 2026. Revize ist eine Shopify App, mit der Kunden ihre Bestellungen nach dem Kauf selbst bearbeiten können. Sie können vor dem Fulfillment die Versandadresse ändern, eine Variante oder ein Produkt tauschen, stornieren und eine Rückerstattung oder Shop-Guthaben erhalten – ohne Supportanfrage. Erfahren Sie mehr darüber, wie Kunden ihre Shopify Bestellungen selbst bearbeiten können, oder finden Sie Revize im Shopify App Store.