Shopify Scripts après le 30 juin 2026 : migrer vers Functions

Par Shubham Vats, Fondateur de Revize

Publié le Mis à jour le 15 min de lecture

Sur cette page

Au 14 octobre 2026, les deux échéances de Shopify Scripts sont passées : la modification et la publication ont cessé le 15 avril, et l’exécution des Scripts le 30 juin. Consultez le rapport des personnalisations de Shopify et identifiez les comportements du paiement qui dépendaient de Scripts.

Ce guide explique comment évaluer les personnalisations concernées et utiliser Shopify Functions pour la logique de réduction, de livraison et de paiement prise en charge. Scripts gérait les comportements du paiement ; il ne permettait pas de modifier les commandes après achat, par exemple de changer une adresse de livraison après la commande.

Développeur migrant des Shopify Scripts vers des modules Shopify Functions

Réponse rapide : passer de Scripts à Functions en 60 secondes

Situation actuelle : Shopify Scripts a cessé de s’exécuter le 30 juin 2026. Shopify Functions fournit des API prises en charge pour les personnalisations du paiement, notamment les réductions, la livraison et les moyens de paiement. Les applications publiques utilisant Functions sont disponibles sur tous les forfaits ; les applications personnalisées contenant des Functions nécessitent Shopify Plus. Commencez par le guide de migration Shopify et le modèle d’extension généré par la CLI actuelle, puis validez le comportement dans une boutique de développement.

Ce qui a changé en 2026

Les dates annoncées par Shopify sont passées. Script Editor est devenu accessible en lecture seule le 15 avril, et Scripts a cessé de s’exécuter le 30 juin 2026.

Date Ce qui se passe Ce que vous devez faire
15 avril 2026 (échéance passée) La modification et la publication de Shopify Scripts ont cessé. Toute nouvelle modification nécessitait une solution de remplacement prise en charge.
30 juin 2026 (échéance passée) Shopify Scripts a cessé de s’exécuter. Auditez toute logique de paiement concernée et examinez sa solution de remplacement actuelle.

Si une boutique dépendait d’un Script, son comportement a cessé de s’exécuter après l’échéance, sauf s’il avait été remplacé ou reconfiguré d’une autre manière. Vérifiez le comportement réel du paiement dans la boutique ; ne supposez pas que chaque paramètre concerné revient au même fonctionnement par défaut.

Conseil : Consultez le rapport des personnalisations dans Shopify Admin pour inventorier les personnalisations concernées par l’arrêt de Scripts. Utilisez la documentation actuelle de migration Shopify pour confirmer la solution de remplacement de chacune.

Functions et Scripts : qu’est-ce qui a changé ?

Critère Shopify Scripts (obsolète) Shopify Functions (remplacement)
Langage DSL Ruby (propre à Shopify) Rust ou JavaScript, avec les recommandations d’outillage actuelles pour l’environnement d’exécution choisi
Environnement d’exécution Ruby en bac à sable sur l’infrastructure Shopify Environnement WebAssembly (WASM)
Disponibilité par forfait Plus uniquement Les applications publiques utilisant Functions sont disponibles sur tous les forfaits ; les applications personnalisées avec Functions nécessitent Plus
Éditeur Script Editor dans l’interface d’administration Environnement de développement local + Shopify CLI
Gestion des versions Aucune — modifications directement en production Compatible avec Git — gestion complète des versions
Tests Manuels, au paiement Développement local avec shopify app dev, liens d’aperçu
Déploiement Clic sur « Save » dans l’interface d’administration shopify app deploy depuis le terminal
Cibles Lignes d’articles, expédition, paiements Réductions, Cart Transform, Validation, Delivery Customization, Payment Customization, Order Routing, Fulfillment Constraints, entre autres

Le changement d’architecture compte : Scripts consistait en des personnalisations Ruby dans Script Editor ; Functions consiste en des extensions d’application développées avec l’outillage pris en charge par Shopify. Leurs cibles d’extension et leurs exigences de forfait diffèrent : utilisez donc la documentation de migration pour associer chaque Script à une solution de remplacement prise en charge.

Associer chaque Script au bon type de Function

Un Script peut être remplacé par une Function, une application publique, un autre paramètre pris en charge, ou ne disposer d’aucun remplacement. Utilisez le guide de migration Shopify pour vérifier l’option appropriée à chaque personnalisation.

Ancien type de Script Son rôle Nouvelle API de Function Cible de la Function
Line Item Script Appliquer des réductions selon les produits, les clients ou les conditions du panier Cart & Checkout Discounts API cart.lines.discounts.generate.run
Shipping Script (réduction) Offrir ou réduire les frais d’expédition selon les règles du panier Cart & Checkout Discounts API cart.delivery-options.discounts.generate.run
Shipping Script (masquer / renommer / réordonner) Masquer un tarif d’expédition au-delà de $X, renommer « Standard » en « Gratuit dès $50 » Delivery Customization API cart.delivery-options.transform.run
Payment Script Masquer PayPal pour les clients B2B, masquer le paiement à la livraison au-delà de $500, réordonner les moyens de paiement Payment Customization API cart.payment-methods.transform.run
Script qui modifie le panier (rare) Regrouper des produits, remplacer des lignes d’articles Cart Transform API cart.transform.run
Script qui bloque le paiement Refuser un panier contenant une combinaison de SKU non valide Cart & Checkout Validation API cart.validations.generate.run

Plusieurs Scripts peuvent correspondre à une seule Function ou nécessiter des remplacements distincts. Confirmez la correspondance et le comportement pour chaque cas avant de combiner la logique.

Shopify Functions réunissant les personnalisations des réductions, de la livraison et du paiement

Prérequis : préparer votre environnement de développement local

Avant de créer une Function, installez localement les trois outils suivants. Vérifiez-les dans votre terminal.

1. Node.js

Utilisez une version de Node.js prise en charge par la version actuelle de Shopify CLI ; vérifiez les exigences d’installation de la CLI avant de configurer le projet.

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

Si votre version est plus ancienne, installez Node.js avec nvm ou téléchargez-le sur nodejs.org.

2. Shopify CLI actuelle

Installez la version actuelle de Shopify CLI et vérifiez-la avec shopify version. Pour la crate Rust Function actuelle (2.0.0 et versions ultérieures), Shopify indique une CLI 3.85.0 ou supérieure.

3. Chaîne d’outils Rust (uniquement si vous écrivez vos Functions en Rust)

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

Les Functions en JavaScript ne nécessitent pas Rust. Choisissez un langage pour votre équipe et conservez-le : mélanger les deux alourdit la maintenance.

4. Une boutique de développement

Connectez-vous à votre tableau de bord Partner pour créer une boutique de développement, ou utilisez une boutique existante. Vous y déploierez vos Functions avant de les mettre en production.

Créer la structure de votre première Function

La CLI génère l’essentiel des fichiers de départ. Depuis n’importe quel répertoire :

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

La CLI vous guide avec quelques questions. Pour une Function de réduction, choisissez :

  • Type : Function
  • Modèle : discount (ou cart_checkout_validation, delivery_customization, payment_customization, etc.)
  • Langage : Rust ou JavaScript
  • Nom : par exemple volume-discount-fn

Elle crée extensions/volume-discount-fn/ avec :

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

Vous modifierez surtout trois fichiers : .toml (configuration), .graphql (données d’entrée) et .rs / .js (logique). C’est tout.

Tutoriel 1 : remplacer un Line Item Script (réduction sur quantité)

Supposons que votre ancien Script appliquait 10 % de réduction sur le sous-total de la commande dès que le panier contenait au moins 5 articles d’une collection donnée. Voici l’équivalent avec une Function.

Étape 1.1 : la configuration (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"]

Étape 1.2 : la requête d’entrée (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
  } 
}

Conseil : une Function ne voit que les données demandées dans la requête. Limitez les champs GraphQL au nécessaire : chaque champ omis rend l’exécution plus rapide et moins coûteuse.

Étape 1.3 : la logique (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,
                }],
            },
        )],
    })
} 

Étape 1.4 : tester, déployer, activer

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 }
  }  
}  

Dans le volet Query Variables de GraphiQL, définissez startsAt sur un horodatage ISO 8601 futur. Examinez tout autre champ obligatoire pour votre version d’API avant d’exécuter la mutation.

Cela crée la réduction automatique qui appelle la Function déployée ; la Function remplace la logique du Script pour ce cas d’usage.

Tutoriel 2 : remplacer un Shipping Script (masquer un mode d’expédition au-delà d’un seuil)

Voici un Script courant : « Masquer l’expédition express quand le sous-total du panier dépasse $500 pour éviter une livraison coûteuse dès le lendemain sur les grosses commandes. » Voici sa version avec une Function Delivery Customization.

Les tutoriels 2 et 3 utilisent les modèles JavaScript actuels. Conservez les cibles générées et les exports de src/index.js, définissez api_version = "2026-10" dans le fichier shopify.extension.toml de chaque extension et exécutez shopify app function typegen dans le répertoire de chaque extension après avoir remplacé sa requête d’entrée.

Étape 2.1 : créer la structure

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

Étape 2.2 : requête d’entrée (src/cart_delivery_options_transform_run.graphql)

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

Étape 2.3 : logique (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 };
}    

Étape 2.4 : créer et activer la personnalisation de livraison

Après shopify app deploy et l’installation de l’application sur la boutique cible, exécutez deliveryCustomizationCreate via le client GraphQL Admin authentifié de cette application avec le périmètre d’accès write_delivery_customizations. Définissez la variable functionHandle sur la valeur de handle de l’extension dans shopify.extension.toml (par exemple, 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 }
  }
}

Vérifiez que la réponse renvoie une personnalisation activée et aucun userErrors, puis contrôlez Paramètres → Expédition et livraison → Personnalisations de livraison et testez le comportement au paiement. Le déploiement fournit la Function ; cette mutation crée et active la personnalisation de la boutique.

Function de personnalisation de la livraison Shopify masquant une option d’expédition au paiement

Tutoriel 3 : remplacer un Payment Script (masquer le paiement à la livraison pour le B2B)

Ancien Script : « Masquer le paiement à la livraison pour tout client portant la balise “B2B”. » Voici la version Payment Customization.

Étape 3.1 : créer la structure

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

Étape 3.2 : requête d’entrée (src/cart_payment_methods_transform_run.graphql)

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

Étape 3.3 : logique (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 } }],
  };
}      

Étape 3.4 : créer et activer la personnalisation de paiement

Après le déploiement et l’installation de l’application sur la boutique cible, exécutez paymentCustomizationCreate via le client GraphQL Admin authentifié de cette application avec le périmètre d’accès write_payment_customizations. Définissez functionHandle sur la valeur de handle de l’extension de paiement dans shopify.extension.toml (par exemple, 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 }
  }
}

Vérifiez que la réponse contient une personnalisation de paiement activée sans userErrors. Contrôlez-la sous Paramètres → Paiements → Personnalisations de paiement, puis testez le paiement avec des clients portant le tag B2B et des clients sans ce tag.

Puisque vous êtes ici : un mot sur l’après-achat

Pour les changements après paiement, Revize propose le libre-service admissible avant traitement via la page de statut ou un lien de confirmation pendant la période définie par le marchand. Le changement et l’ajout de produits nécessitent Pro ; la modification par le personnel est en développement. Les clients vérifient le solde supplémentaire et paient via Shopify Checkout. Le Gestion des commandes Shopify 2026 : le guide opérationnel Plus couvre le parcours natif après paiement.

Revenons à la migration.

Stratégie de test : identifier les clients avec une balise

Utilisez une boutique de développement et des jeux d’entrée représentatifs pour tester le remplacement selon vos exigences documentées ou les résultats de tests Scripts enregistrés. Scripts ne s’exécute plus : un test parallèle en direct Script/Function n’est donc plus possible. Un filtre par balise client peut limiter la Function de test aux comptes internes ; séparez le déploiement en production de ces tests.

Étape 1 : ajouter une balise à vos utilisateurs de test

Dans Customers, ajoutez la balise FN-TESTER à deux ou trois comptes internes.

Étape 2 : conditionner la Function à la présence de la balise

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

Étape 3 : ajouter hasAnyTag à votre requête d’entrée

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

Étape 4 : vérifier au paiement

Connectez-vous avec un utilisateur balisé et vérifiez les paniers admissibles et non admissibles, les combinaisons de réductions et les options de livraison et de paiement. Répétez avec un utilisateur sans balise pour confirmer que cette Function ne renvoie aucune opération. Comparez avec le comportement attendu enregistré de l’ancienne logique ; testez aussi le paiement invité avant de retirer le filtre.

Étape 5 : vérifier l’activation en production

Activez le remplacement testé dans la configuration de réduction, de livraison ou de paiement appropriée. Consignez la version déployée de l’application et le plan de retour arrière, puis retirez les instructions Scripts obsolètes de la documentation de l’équipe.

Un processus de déploiement qui tient la charge

Ne déployez pas indéfiniment depuis l’ordinateur d’un développeur. Après avoir migré un ou deux Scripts, mettez en place un pipeline d’intégration continue.

Le processus minimal

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 }}

Créez un App Automation Token dans le Dev Dashboard Shopify et enregistrez-le comme secret du dépôt indiqué ci-dessus. La CLI actuelle nécessite Node.js 22.12 ou supérieur. Associez le projet à sa configuration d’application avant d’utiliser la CI ; ajoutez vos tests et vérifications de version avant déploiement. Cet exemple déploie lors d’un push vers main : adaptez le déclencheur à la politique de votre équipe.

Gestion des versions et retour en arrière

shopify app deploy crée un instantané avec un numéro de version. Pour revenir à une version précédente :

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

Avec Scripts, revenir en arrière signifiait retrouver l’ancien code et le recoller. Ici, le processus est bien plus simple.

Pipeline de déploiement Shopify Functions entre les environnements local, de préproduction et de production

Les erreurs les plus fréquentes

Voici les pièges courants de migration à vérifier avant de mettre une Function en production.

1. Transposer chaque Script tel quel dans une Function. Une seule Function peut remplacer trois Scripts avec une logique conditionnelle plus claire. Faites l’inventaire de vos Scripts comme un ensemble avant de les réécrire.

2. Confondre les autorisations de l’application avec les données d’entrée de la Function. Une Function lit les champs exposés par sa requête d’entrée et les champs méta configurés ; elle n’obtient pas d’accès à l’Admin API par l’ajout de read_customers ou de read_orders. N’ajoutez des autorisations d’application que pour des opérations distinctes de l’Admin API, et vérifiez les règles d’entrée et de configuration de l’API Function pour l’extension que vous développez.

3. Omettre les tests de parité. Comparez la Function à l’ancien Script avec des paniers représentatifs et les cas limites pertinents avant la mise en production. N’utilisez un déploiement progressif que si votre extension et votre configuration le prennent en charge.

4. Ignorer le rapport Customizations Report. C’est le meilleur inventaire de ce qui fonctionne réellement dans votre boutique. Fondez votre migration sur ce rapport, pas sur vos souvenirs.

5. Inscrire en dur les identifiants de collection et les balises clients. Si les marchands doivent pouvoir ajuster ces valeurs, utilisez une configuration de Function fondée sur des métachamps. La CLI peut générer cette structure ; consultez la documentation Shopify sur la configuration des Functions.

Liste de vérification de la migration

Utilisez cette liste pour examiner l’état actuel d’une migration de Scripts.

Étape Action
Inventorier Utilisez le rapport des personnalisations et la documentation de migration Shopify pour identifier la logique concernée.
Associer Pour chaque Script, confirmez si une Shopify Function, une application publique ou un autre paramètre pris en charge est le bon remplacement.
Développer et valider Utilisez le modèle actuel de Shopify CLI et testez le comportement dans une boutique de développement avec des paniers représentatifs.
Déployer Suivez les étapes actuelles de déploiement et d’activation de Shopify pour la cible Function concernée.
Confirmer Vérifiez le comportement du paiement en production et supprimez les références obsolètes à Scripts de la documentation et des processus internes.

Puisque l’échéance d’exécution est passée, donnez la priorité à l’audit du comportement du paiement en production et aux remplacements restant à effectuer.

Plan de migration de Shopify Scripts vers Functions

Questions fréquentes

Ai-je besoin de Shopify Plus pour utiliser Functions ?

Les applications publiques utilisant Functions peuvent être utilisées sur les forfaits Shopify, selon les exigences de la Function API concernée. Les applications personnalisées contenant des Functions nécessitent Shopify Plus ; vérifiez les exigences de la cible avant de choisir l’implémentation.

Puis-je écrire des Functions en TypeScript ?

L’outillage Shopify Functions prend en charge JavaScript. TypeScript peut être utilisé avec une chaîne de compilation adaptée, mais suivez les recommandations actuelles de langage et de modèle pour la cible Function concernée plutôt que supposer que la CLI génère directement une base TypeScript.

Les Functions sont-elles plus rapides que les Scripts ?

Shopify Functions s’exécute dans un environnement WebAssembly contraint. Vérifiez les limites actuelles de votre cible Function dans la documentation Shopify ; ne vous appuyez pas sur une mesure universelle du temps d’exécution pour préparer l’implémentation.

Une Function peut-elle appeler une API externe ?

Certaines Function API prennent en charge l’accès réseau via une cible fetch, avec une disponibilité limitée et une activation Shopify. Shopify effectue la requête HTTP déclarée et transmet son résultat à la cible run. Ne supposez pas qu’une Function ordinaire peut appeler une API arbitraire ; vérifiez la disponibilité de la cible et utilisez des champs méta préremplis lorsque l’accès réseau est indisponible.

Quelle est la différence entre Cart Transform et Discounts ?

Discounts modifie les prix ; Cart Transform modifie le contenu du panier. Utilisez l’API Discounts pour appliquer une réduction de 10 %, offrir l’expédition ou proposer une offre « un acheté, un offert ». Utilisez Cart Transform pour regrouper deux produits sur une seule ligne d’article ou répartir une variante sur plusieurs lignes. Beaucoup d’anciens Scripts mêlaient ces deux rôles : lors de la migration, séparez-les en deux Functions.

Comment tester une Function en local sans boutique de développement ?

Vous pouvez exécuter des tests unitaires avec cargo test (Rust) ou npm test (JS), mais les tests d’intégration complets nécessitent une boutique de développement. La CLI propose shopify app function run, qui exécute votre Function avec un fichier d’entrée d’exemple. C’est utile pour avancer rapidement. Pour vérifier le comportement complet au paiement, il vous faut toutefois une vraie boutique et un vrai panier.

Puis-je avoir plusieurs Functions du même type ?

Oui, dans les limites d’activation de l’API. Les Discount Functions s’exécutent simultanément sans connaître les autres, et Shopify combine leurs propositions selon les règles des nœuds de réduction. Consultez la Discount Function API et les documents des cibles de livraison et paiement au lieu de supposer qu’une Function transmet sa sortie à la suivante.

Que devient mon Script après le déploiement de la Function ?

L’échéance d’exécution est passée ; tout comportement requis nécessite un remplacement pris en charge ou une reconfiguration. Si un Script apparaît encore dans Admin, considérez-le comme un enregistrement hérité et utilisez les recommandations actuelles de migration Shopify pour confirmer si un remplacement ou un nettoyage est nécessaire.

La migration aura-t-elle un effet sur mon référencement ou mon thème ?

Non. Les Functions s’exécutent côté serveur au paiement et ne touchent jamais à votre thème ni à vos pages produit. Elles modifient uniquement les réductions, les options d’expédition et les moyens de paiement au moment du paiement. Votre boutique en ligne, vos modèles de pages produit et votre référencement restent inchangés.

Comment migrer un Script qui utilise Input.line_items avec des propriétés personnalisées ?

Les propriétés personnalisées sont accessibles par le champ attribute des lignes du panier dans l’entrée GraphQL. Ajoutez attribute(key: "your-key") { value } dans la sélection lines. La Function lit la valeur comme Scripts lisait les propriétés des lignes d’articles, mais par GraphQL plutôt que par des appels de méthodes Ruby.

Et les analyses et les balises de commande ? Les Functions peuvent-elles écrire des données ?

Les Functions ne peuvent ni écrire des balises de commande ni déclencher elles-mêmes des webhooks : elles renvoient uniquement des opérations sur le panier en cours. Pour ajouter des balises ou lancer des processus ultérieurs, utilisez Shopify Flow déclenché par l’événement de création de la commande. De nombreux marchands associent une Function pour la réduction à un Flow qui ajoute la balise « VOLUME-DISCOUNT-APPLIED » à la commande.

Puis-je installer une application publique au lieu de créer une Function personnalisée ?

Oui, le Shopify App Store propose des dizaines d’applications qui utilisent Functions pour des besoins courants. Recherchez « discount function », « delivery customization » ou « payment customization ». Pour des cas simples (réductions sur quantité, masquage de moyens de paiement selon une balise, expédition gratuite au-delà d’un seuil), une application existante peut vous épargner plusieurs jours de développement. Réservez les Functions personnalisées à la logique propre à votre entreprise.

Que faire si un Script était encore utilisé après le 30 juin ?

L’échéance d’exécution est passée ; tout comportement requis nécessite un remplacement pris en charge ou une reconfiguration. Examinez le comportement actuel du paiement dans la boutique et remplacez toute personnalisation nécessaire par une Function ou une application prise en charge, si disponible. Vérifiez chaque cas avec la documentation actuelle de Shopify et une boutique de développement.

Puis-je supprimer complètement l’application Script Editor ?

Utilisez les recommandations actuelles de Shopify pour l’admin et la migration afin de déterminer si une ancienne entrée Script Editor nécessite un nettoyage. Shopify Functions consiste en des extensions d’application gérées séparément des anciens Scripts.

Prochaines étapes

  1. Consultez le rapport des personnalisations et le guide actuel de migration Shopify.
  2. Testez les cas de paiement pertinents dans une boutique de développement.
  3. Confirmez quelles Functions ou applications publiques prennent en charge la logique requise sur votre forfait.
  4. Vérifiez chaque remplacement en production et documentez son responsable et sa configuration.

Séparez les tests des règles de paiement de ceux des modifications après achat. Pour chaque système, consignez l’application responsable, les fonctions activées et le traitement des commandes et paiements pour attribuer clairement les changements futurs.

Ressources

À lire aussi : Statistiques sur la modification des commandes Shopify (2026) · Comment permettre aux clients de modifier leurs propres commandes Shopify (2026)