Shopify Scripts seit dem 30. Juni 2026: Migration zu Functions

Von Shubham Vats, Gründer von Revize

Veröffentlicht am Aktualisiert am 13 Min. Lesezeit

Auf dieser Seite

Stand 14. Oktober 2026 sind beide Meilensteine für Shopify Scripts bereits verstrichen: Bearbeiten und Veröffentlichen endeten am 15. April, die Ausführung von Scripts am 30. Juni. Prüfen Sie Shopifys Customizations Report und ermitteln Sie alle Checkout-Abläufe, die von Scripts abhängig waren.

Dieser Leitfaden erklärt, wie Sie betroffene Anpassungen bewerten und Shopify Functions für unterstützte Rabatt-, Versand- und Zahlungslogik einsetzen. Scripts steuerten das Checkout-Verhalten; sie ermöglichten keine Bestelländerungen nach dem Kauf, etwa eine Änderung der Lieferadresse nach Aufgabe einer Bestellung.

Entwickler bei der Migration von Shopify Scripts zu Shopify Functions

Kurzantwort: Von Scripts zu Functions in 60 Sekunden

Aktueller Stand: Shopify Scripts werden seit dem 30. Juni 2026 nicht mehr ausgeführt. Shopify Functions bieten unterstützte APIs für Checkout-Anpassungen wie Rabatte, Versand und Zahlungen. Öffentliche Apps, die Functions nutzen, sind tarifübergreifend verfügbar; benutzerdefinierte Apps mit Functions erfordern Shopify Plus. Beginnen Sie mit Shopifys Migrationsleitfaden und der aktuellen, von der CLI erzeugten Erweiterungsvorlage und prüfen Sie das Verhalten anschließend in einem Entwicklungs-Shop.

Was sich 2026 geändert hat

Die von Shopify angekündigten Termine sind verstrichen. Der Script Editor ist seit dem 15. April schreibgeschützt, und Scripts werden seit dem 30. Juni 2026 nicht mehr ausgeführt.

Datum Was passiert Ihre Maßnahme
15. April 2026 (verstrichen) Das Bearbeiten und Veröffentlichen von Shopify Scripts wurde eingestellt. Neue Änderungen benötigten einen unterstützten Ersatz.
30. Juni 2026 (verstrichen) Shopify Scripts wurden nicht mehr ausgeführt. Prüfen Sie betroffene Checkout-Logik und ihren aktuellen Ersatz.

Wenn ein Shop von einem Script abhängig war, wurde dessen Logik nach dem Stichtag nicht mehr ausgeführt, sofern sie nicht ersetzt oder anderweitig neu konfiguriert worden war. Prüfen Sie das tatsächliche Checkout-Verhalten im Shop; gehen Sie nicht davon aus, dass jede betroffene Einstellung auf dieselbe Weise auf einen Standard zurückfällt.

Tipp: Prüfen Sie den Customizations Report im Shopify-Adminbereich, um die von der Scripts-Abschaltung betroffenen Anpassungen zu erfassen. Bestätigen Sie anhand der aktuellen Migrationsdokumentation von Shopify den Ersatz für jede einzelne Anpassung.

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

Aspekt Shopify Scripts (eingestellt) Shopify Functions (Ersatz)
Sprache Ruby-DSL (Shopify-spezifisch) Rust oder JavaScript mit aktuellen Werkzeugempfehlungen für die gewählte Laufzeit
Laufzeit Abgeschottetes Ruby auf Shopify-Infrastruktur WebAssembly-Laufzeit (WASM)
Tarifverfügbarkeit Nur Plus Öffentliche Apps mit Functions sind tarifübergreifend verfügbar; benutzerdefinierte Apps mit Functions erfordern Plus
Editor Script Editor im Adminbereich Lokale IDE + Shopify CLI
Versionierung Keine — direkte Änderungen Git-freundlich — 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
Targets Positionen, Versand, Zahlungen Discounts, Cart Transform, Validation, Delivery Customization, Payment Customization, Order Routing, Fulfillment Constraints und weitere

Der Architekturwechsel ist entscheidend: Scripts waren Ruby-Anpassungen im Script Editor; Functions sind App-Erweiterungen, die mit Shopifys unterstützten Werkzeugen entwickelt werden. Ihre Erweiterungs-Targets und Tarifanforderungen unterscheiden sich. Ordnen Sie daher jedes Script mithilfe der Migrationsdokumentation einem unterstützten Ersatz zu.

So ordnen Sie Ihre Scripts dem richtigen Function-Typ zu

Ein Script lässt sich möglicherweise durch eine Function, eine öffentliche App oder eine andere unterstützte Einstellung ersetzen — oder es gibt keinen Ersatz. Prüfen Sie anhand von Shopifys Migrationsleitfaden die passende Option für jede Anpassung.

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

Mehrere Scripts können einer einzigen Function entsprechen oder getrennte Ersatzlösungen erfordern. Bestätigen Sie die Zuordnung und das Verhalten in jedem Fall, bevor Sie Logik zusammenführen.

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

Verwenden Sie eine Node.js-Version, die von der aktuellen Shopify-CLI-Version unterstützt wird; prüfen Sie vor dem Einrichten des Projekts die Installationsanforderungen der CLI.

Shell
node --version
# Check the version required by your installed Shopify CLI

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

2. Aktuelle Shopify CLI

Installieren Sie die aktuelle Shopify CLI und prüfen Sie die Version mit shopify version. Für das aktuelle Rust-Function-Crate (2.0.0 und neuer) nennt Shopify CLI 3.85.0 oder höher.

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-unknown-unknown
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 Entwicklungs-Shop

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 --name 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-10"
 
[[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-unknown-unknown --release"
path = "target/wasm32-unknown-unknown/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 CreateAutomaticDiscount($startsAt: DateTime!) {
  discountAutomaticAppCreate(
    automaticAppDiscount: {
      title: "Volume Discount (5+ collection items)"
      functionHandle: "volume-discount-fn"
      discountClasses: [ORDER]
      startsAt: $startsAt
    }   
  ) {
    automaticAppDiscount { discountId }
    userErrors { field message }
  }  
}  

Setzen Sie im Bereich Query Variables von GraphiQL startsAt auf einen zukünftigen ISO-8601-Zeitstempel. Prüfen Sie vor dem Ausführen der Mutation alle zusätzlichen Pflichtfelder für Ihre API-Version.

Damit wird der automatische Rabatt erstellt, der die bereitgestellte Function aufruft; die Function ersetzt die Script-Logik für diesen Anwendungsfall.

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.

Anleitungen 2 und 3 verwenden die aktuellen JavaScript-Vorlagen. Behalten Sie die generierten Targets und die Exporte in src/index.js bei, setzen Sie api_version = "2026-10" in der shopify.extension.toml jeder Erweiterung und führen Sie nach dem Ersetzen der Eingabeabfrage shopify app function typegen im Verzeichnis der jeweiligen Erweiterung aus.

Schritt 2.1: Grundgerüst erstellen

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

Schritt 2.2: Eingabeabfrage (src/cart_delivery_options_transform_run.graphql)

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

Schritt 2.3: Logik (src/cart_delivery_options_transform_run.js)

JavaScript
// @ts-check
/**
 * @typedef {import("../generated/api").CartDeliveryOptionsTransformRunInput} CartDeliveryOptionsTransformRunInput
 * @typedef {import("../generated/api").CartDeliveryOptionsTransformRunResult} CartDeliveryOptionsTransformRunResult
 */
           
/** @type {CartDeliveryOptionsTransformRunResult} */
const NO_CHANGES = { operations: [] };
const THRESHOLD = 500.0;
const HIDE_TITLES = ["Express", "Overnight"];
            
/** 
 * @param {CartDeliveryOptionsTransformRunInput} input
 * @returns {CartDeliveryOptionsTransformRunResult}
 */ 
export function cartDeliveryOptionsTransformRun(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) => ({
        deliveryOptionHide: { deliveryOptionHandle: opt.handle },
      }))
  );
              
  return { operations };
}    

Schritt 2.4: Versandanpassung erstellen und aktivieren

Führen Sie nach shopify app deploy und der Installation der App im Zielshop deliveryCustomizationCreate über den authentifizierten Admin-GraphQL-Client dieser App mit dem Scope write_delivery_customizations aus. Setzen Sie die Variable functionHandle auf den handle der Erweiterung in shopify.extension.toml (zum Beispiel hide-express-fn).

GraphQL
mutation CreateDeliveryCustomization($functionHandle: String!) {
  deliveryCustomizationCreate(deliveryCustomization: {
    functionHandle: $functionHandle
    title: "Hide express shipping above cart threshold"
    enabled: true
  }) {
    deliveryCustomization { id enabled }
    userErrors { field message }
  }
}

Prüfen Sie, ob die Antwort eine aktivierte Anpassung und keine userErrors zurückgibt. Kontrollieren Sie anschließend Einstellungen → Versand und Zustellung → Versandanpassungen und testen Sie das Checkout-Verhalten. Die Bereitstellung liefert die Function; diese Mutation erstellt und aktiviert die Anpassung des Shops.

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 --flavor vanilla-js --name hide-cod-b2b-fn

Schritt 3.2: Eingabeabfrage (src/cart_payment_methods_transform_run.graphql)

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

Schritt 3.3: Logik (src/cart_payment_methods_transform_run.js)

JavaScript
// @ts-check
/**
 * @typedef {import("../generated/api").CartPaymentMethodsTransformRunInput} CartPaymentMethodsTransformRunInput
 * @typedef {import("../generated/api").CartPaymentMethodsTransformRunResult} CartPaymentMethodsTransformRunResult
 */
/** @type {CartPaymentMethodsTransformRunResult} */
const NO_CHANGES = { operations: [] }; 
               
/**
 * @param {CartPaymentMethodsTransformRunInput} input
 * @returns {CartPaymentMethodsTransformRunResult}
 */
export function cartPaymentMethodsTransformRun(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: [{ paymentMethodHide: { paymentMethodId: codMethod.id } }],
  };
}      

Schritt 3.4: Zahlungsanpassung erstellen und aktivieren

Führen Sie nach der Bereitstellung und Installation der App im Zielshop paymentCustomizationCreate über den authentifizierten Admin-GraphQL-Client dieser App mit dem Scope write_payment_customizations aus. Setzen Sie functionHandle auf den handle der Zahlungserweiterung in shopify.extension.toml (zum Beispiel hide-cod-b2b-fn).

GraphQL
mutation CreatePaymentCustomization($functionHandle: String!) {
  paymentCustomizationCreate(paymentCustomization: {
    functionHandle: $functionHandle
    title: "Hide Cash on Delivery for B2B-tagged customers"
    enabled: true
  }) {
    paymentCustomization { id enabled }
    userErrors { field message }
  }
}

Prüfen Sie, ob die Antwort eine aktivierte Zahlungsanpassung ohne userErrors enthält. Kontrollieren Sie diese unter Einstellungen → Zahlungen → Zahlungsanpassungen und testen Sie anschließend den Checkout mit Kunden mit und ohne B2B-Tag.

Ein Wort zu Änderungen nach dem Kauf

Für Änderungen nach dem Checkout bietet Revize berechtigte Kundenselbstbedienung vor dem Fulfillment über die Bestellstatusseite oder einen Bestätigungs-E-Mail-Link während des vom Händler festgelegten Bearbeitungszeitfensters. Produktwechsel und Zusatzprodukte erfordern Pro; die Bearbeitung durch Mitarbeitende ist in Entwicklung. Kunden prüfen zusätzlich fällige Beträge und bezahlen über Shopify Checkout. Der Shopify-Bestellverwaltungsleitfaden 2026 für Plus-Betreiber behandelt Shopifys nativen Ablauf nach dem Checkout.

Zurück zur Migration.

Teststrategie: Kunden mit Tags schrittweise einbeziehen

Nutzen Sie einen Entwicklungs-Shop und repräsentative Eingabetestdaten, um den Ersatz gegen dokumentierte Anforderungen oder gespeicherte Script-Testergebnisse zu prüfen. Scripts werden nicht mehr ausgeführt, daher ist ein paralleler Live-Test von Script und Function nicht mehr möglich. Eine Kundentag-Prüfung kann eine Test-Function auf interne Konten begrenzen, während Sie ihr Verhalten prüfen; halten Sie die Produktiveinführung von diesen Tests getrennt.

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

Rust
// Rust example: return this target's empty result for non-testers
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);  // No operations from this Function
}       
                   
// 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 markierter Nutzer an und prüfen Sie berechtigte und unberechtigte Warenkörbe, Rabattkombinationen sowie Liefer- und Zahlungsoptionen. Wiederholen Sie dies mit einem nicht markierten Nutzer, um sicherzustellen, dass diese Function keine Operationen zurückgibt. Vergleichen Sie die Ergebnisse mit dem aus der alten Logik festgehaltenen Sollverhalten; beziehen Sie Gast-Checkouts in die Tests ein, bevor Sie die Tag-Prüfung entfernen.

Schritt 5: Produktivaktivierung prüfen

Aktivieren Sie den getesteten Ersatz über die passende Rabatt-, Liefer- oder Zahlungskonfiguration. Dokumentieren Sie bereitgestellte App-Version und Rücknahmeplan und entfernen Sie veraltete Script-Anweisungen aus Ihrer Teamdokumentation.

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: '22' }
      - uses: dtolnay/rust-toolchain@stable
        with: { targets: wasm32-unknown-unknown }
      - run: npm install -g @shopify/cli@latest
      - run: shopify app deploy --force
        env:
          SHOPIFY_APP_AUTOMATION_TOKEN: ${{ secrets.SHOPIFY_APP_AUTOMATION_TOKEN }}

Erstellen Sie ein App Automation Token im Shopify Dev Dashboard und speichern Sie es als oben gezeigtes Repository-Secret. Die aktuelle CLI erfordert Node.js 22.12 oder neuer. Verknüpfen Sie das Projekt vor der CI-Nutzung mit seiner App-Konfiguration; ergänzen Sie vor der Bereitstellung Test- und Freigabeprüfschritte. Dieses Beispiel stellt bei einem Push auf main bereit. Passen Sie den Auslöser deshalb an die Veröffentlichungsrichtlinie Ihres Teams an.

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

Dies sind häufige Migrationsfehler, die Sie vor der Veröffentlichung einer Function prüfen sollten.

1. Functions wie eine 1:1-Portierung von Scripts behandeln. Das sind sie nicht. Eine einzige Function kann drei Scripts mit übersichtlicheren Verzweigungen ersetzen. Prüfen Sie Ihre Scripts als Gesamtsystem, bevor Sie sie neu schreiben.

2. App-Berechtigungen mit Function-Eingabedaten verwechseln. Eine Function liest die Felder, die ihre Eingabeabfrage und die konfigurierten Metafelder bereitstellen; durch Hinzufügen von read_customers oder read_orders erhält sie keinen Admin-API-Zugriff. Ergänzen Sie App-Berechtigungen nur für separate Admin-API-Vorgänge und prüfen Sie die Eingabe- und Konfigurationsregeln der Function API für die Erweiterung, die Sie entwickeln.

3. Tests auf funktionale Gleichwertigkeit auslassen. Vergleichen Sie die Function vor der Veröffentlichung anhand repräsentativer Warenkörbe und relevanter Grenzfälle mit dem alten Script. Nutzen Sie eine schrittweise Einführung nur, wenn Ihre Erweiterung und Konfiguration dies unterstützen.

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

Prüfen Sie mit dieser Checkliste den aktuellen Stand einer Scripts-Migration.

Schritt Maßnahme
Erfassen Identifizieren Sie betroffene Logik mit Shopifys Customizations Report und der Migrationsdokumentation.
Zuordnen Bestätigen Sie für jedes Script, ob eine Shopify Function, eine öffentliche App oder eine andere unterstützte Einstellung der richtige Ersatz ist.
Entwickeln und validieren Nutzen Sie die aktuelle Shopify-CLI-Vorlage und testen Sie das Verhalten in einem Entwicklungs-Shop mit repräsentativen Warenkörben.
Bereitstellen Folgen Sie Shopifys aktuellen Bereitstellungs- und Aktivierungsschritten für das jeweilige Function-Target.
Bestätigen Prüfen Sie das Verhalten im produktiven Checkout und entfernen Sie veraltete Script-Verweise aus interner Dokumentation und Arbeitsabläufen.

Da der Stichtag für das Ende der Ausführung bereits verstrichen ist, haben die Prüfung des produktiven Checkout-Verhaltens und noch ausstehende Ersatzlösungen Vorrang.

Migrationsplan von Shopify Scripts zu Functions

Häufig gestellte Fragen

Brauche ich Shopify Plus, um Functions zu nutzen?

Öffentliche Apps mit Functions können in allen Shopify-Tarifen genutzt werden, vorbehaltlich der Anforderungen der jeweiligen Function API. Eigene Apps mit Functions erfordern Shopify Plus; prüfen Sie die Tarifanforderungen des Targets vor der Wahl eines Implementierungswegs.

Kann ich Functions in TypeScript schreiben?

Shopifys Functions-Werkzeuge unterstützen JavaScript. TypeScript lässt sich mit einer geeigneten Build-Pipeline verwenden. Folgen Sie jedoch den aktuellen Sprach- und Vorlagenempfehlungen für das konkrete Function-Target, statt anzunehmen, dass die CLI direkt ein TypeScript-Grundgerüst erzeugt.

Wie schnell sind Functions im Vergleich zu Scripts?

Shopify Functions laufen in einer eingeschränkten WebAssembly-Laufzeit. Prüfen Sie in Shopifys Dokumentation die aktuellen Grenzen für Ihr Function-Target; verlassen Sie sich bei der Implementierungsplanung nicht auf einen allgemeingültigen Ausführungszeit-Benchmark.

Kann eine Function eine externe API aufrufen?

Einige Function APIs unterstützen Netzwerkzugriff über ein Fetch-Target, mit eingeschränkter Verfügbarkeit und Freischaltung durch Shopify. Shopify führt die deklarierte HTTP-Anfrage aus und übergibt ihr Ergebnis an das Run-Target. Gehen Sie nicht davon aus, dass eine gewöhnliche Function beliebige APIs aufrufen kann; prüfen Sie die Target-Verfügbarkeit und nutzen Sie vorab befüllte Metafelder, wenn kein Netzwerkzugriff verfügbar ist.

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, innerhalb der Aktivierungsgrenzen der API. Discount Functions laufen parallel, ohne voneinander zu wissen. Shopify kombiniert ihre Kandidaten anhand der Kombinationsregeln der Rabattknoten. Prüfen Sie die Discount Function API und die Dokumentation der Delivery-/Payment-Targets, statt anzunehmen, dass Ausgaben sequenziell in eine andere Function fließen.

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

Der Ausführungsstichtag ist verstrichen; benötigtes Verhalten erfordert einen unterstützten Ersatz oder eine Neukonfiguration. Falls ein Script weiterhin im Adminbereich angezeigt wird, behandeln Sie es als Altbestand und prüfen Sie anhand der aktuellen Shopify-Migrationshinweise, ob ein Ersatz oder eine Bereinigung nötig ist.

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 ist, wenn ein Script nach dem 30. Juni noch verwendet wurde?

Veröffentlichte Scripts wurden zum Stichtag deaktiviert. Prüfen Sie Rabatt-, Liefer- und Zahlungsverhalten des betroffenen Shops, priorisieren Sie fehlende Regeln und validieren Sie den Ersatz vor Veröffentlichung mit repräsentativen Warenkörben.

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

Entscheiden Sie anhand von Shopifys aktuellen Admin- und Migrationshinweisen, ob ein alter Script-Editor-Eintrag bereinigt werden muss. Shopify Functions sind App-Erweiterungen und werden getrennt von alten Scripts verwaltet.

Nächste Schritte

  1. Prüfen Sie den Customizations Report und Shopifys aktuellen Migrationsleitfaden.
  2. Testen Sie die relevanten Checkout-Fälle in einem Entwicklungs-Shop.
  3. Bestätigen Sie, welche Functions oder öffentlichen Apps die benötigte Logik in Ihrem Tarif unterstützen.
  4. Prüfen Sie jeden produktiven Ersatz und dokumentieren Sie dessen Verantwortlichen und Konfiguration.

Halten Sie Checkout-Regeltests getrennt von Tests zur Bestellbearbeitung nach dem Kauf. Dokumentieren Sie für jedes System verantwortliche App, aktivierte Funktionen sowie Fulfillment- und Zahlungsverhalten, damit künftige Änderungen eine klare Zuständigkeit haben.

Ressourcen

Weiterführende Artikel: Revize, 2026 · Kunden ihre Shopify-Bestellungen selbst bearbeiten lassen