2026年6月30日以降のShopify Scripts:Functionsへの移行

執筆:Shubham Vats(Revize創業者)

公開日:更新日:読了まで20分

目次

2026年10月14日現在、Shopify Scriptsの期限は両方とも過ぎています。編集・公開は4月15日に終了し、実行は6月30日に終了しました。ShopifyのCustomizations Reportを確認し、Scriptsに依存していたチェックアウトの動作を特定してください。

このガイドでは、影響したカスタマイズを評価し、対応する割引、配送、決済ロジックにShopify Functionsを使う方法を説明します。Scriptsはチェックアウトの動作を扱い、注文後の配送先住所変更など、購入後の注文編集は実装していませんでした。

Shopify ScriptsをShopify Functionsのモジュールへ移行する開発者

要点:ScriptsからFunctionsへ、60秒で理解

現在の状況: Shopify Scriptsは2026年6月30日に実行を停止しました。Shopify Functionsは、割引、配送、決済などのチェックアウトカスタマイズに対応するAPIを提供します。Functionsを使う公開アプリは各プランで利用でき、Functionsを含むカスタムアプリにはShopify Plusが必要です。Shopifyの移行ガイドと現在のCLIが生成する拡張テンプレートから始め、開発ストアで動作を検証してください。

2026年に変わったこと

Shopifyが発表した日付は過ぎました。Script Editorは4月15日に読み取り専用となり、Scriptsは2026年6月30日に実行を停止しました。

日付 起きたこと 対応
2026年4月15日 (経過済み) Shopify Scriptsの編集と公開を停止。 新しい変更には対応する代替が必要。
2026年6月30日 (経過済み) Shopify Scriptsの実行を停止。 影響するチェックアウトのロジックと現在の代替を確認。

Scriptに依存していたストアでは、置き換えや再設定をしていなければ、期限後にその動作は停止しました。実際のチェックアウトを確認し、影響するすべての設定が同じように代替動作へ戻ると想定しないでください。

ヒント: Shopify管理画面のCustomizations Reportで、Scripts終了の影響を受けたカスタマイズを一覧にします。現在の移行資料で各項目の代替を確認してください。

FunctionsとScripts:実際に変わった点

項目 Shopify Scripts(非推奨) Shopify Functions(代替)
言語 Ruby DSL(Shopify固有) RustまたはJavaScript。選んだ実行環境の現在のツール案内に従う
実行環境 Shopifyのインフラ上で動くサンドボックス化されたRuby WebAssembly(WASM)
利用できるプラン Plusのみ すべてのプラン(カスタムアプリにはPlusが必要。公開アプリは利用可能)
エディター Shopify Admin内のScript Editor ローカルIDEとShopify CLI
バージョン管理 なし。編集内容がそのまま本番に反映 Gitで完全にバージョン管理可能
テスト チェックアウトで手動テスト shopify app devによるローカル開発、プレビューリンク
デプロイ 管理画面で「保存」をクリック ターミナルからshopify app deployを実行
対象 明細項目、配送、決済 割引、Cart Transform、Validation、Delivery Customization、Payment Customization、Order Routing、Fulfillment Constraintsなど

構造の変化は重要です。ScriptsはScript Editor内のRubyカスタマイズでした。FunctionsはShopifyの対応ツールで開発するアプリ拡張です。拡張ターゲットとプラン要件が異なるため、移行資料で各Scriptを対応する代替に割り当ててください。

Scriptsに対応するFunctionの種類を選ぶ

Scriptの代替はFunction、公開アプリ、別の対応設定、または代替なしの場合があります。Shopifyの移行ガイドで各カスタマイズの正しい選択肢を確認してください。

旧Scriptの種類 処理内容 新しいFunction API Functionのターゲット
Line Item Script 特定の商品、顧客、カートの条件に応じて割引を適用 Cart & Checkout Discounts API cart.lines.discounts.generate.run
Shipping Script(割引) カートのルールに応じて送料無料や送料割引を適用 Cart & Checkout Discounts API cart.delivery-options.discounts.generate.run
Shipping Script(非表示・名称変更・並べ替え) $Xを超える場合に配送料を非表示にする、「Standard」を「$50以上で無料」に変更する Delivery Customization API cart.delivery-options.transform.run
Payment Script B2B向けにPayPalを非表示にする、$500を超える場合に代金引換を非表示にする、決済方法を並べ替える Payment Customization API cart.payment-methods.transform.run
カートを変更するScript(まれ) 商品をバンドルする、明細項目を入れ替える Cart Transform API cart.transform.run
チェックアウトをブロックするScript SKUの組み合わせが無効なカートを拒否する Cart & Checkout Validation API cart.validations.generate.run

複数のScriptsが1つのFunctionに対応する場合や、別々の代替が必要な場合があります。ロジックをまとめる前に、各ケースの対応と動作を確認してください。

割引、配送、決済のカスタマイズを統合するShopify Functions

前提条件:ローカル開発環境を準備する

Functionのひな形を作る前に、次の3つをローカルにインストールします。ターミナルで確認してください。

1. Node.js

現在のShopify CLIリリースが対応するNode.jsのバージョンを使います。設定前にCLIのインストール要件を確認してください。

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

古いバージョンの場合は、nvmを使うか、nodejs.orgからダウンロードしてインストールします。

2. 現在のShopify CLI

現在のShopify CLIをインストールし、shopify versionで確認してください。現在のRust Functionクレート(2.0.0以降)では、ShopifyはCLI 3.85.0以上を案内しています。

3. Rustツールチェーン(FunctionsをRustで記述する場合のみ)

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

JavaScriptのFunctionsにはRustは必要ありません。チームで使う言語を1つ選び、統一しましょう。両方を混在させると保守の負担が増えます。

4. 開発ストア

Partnerダッシュボードにログインして新しい開発ストアを作成するか、既存の開発ストアを使用します。本番環境へ公開する前に、このストアへFunctionsをデプロイします。

最初のFunctionのひな形を作る

定型的な部分の大半はCLIが生成します。任意のディレクトリで次を実行してください。

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

CLIの案内に従って選択します。割引用のFunctionなら、次のように選びます。

  • 種類: Function
  • テンプレート: discount(またはcart_checkout_validation、delivery_customization、payment_customizationなど)
  • 言語: RustまたはJavaScript
  • 名前: volume-discount-fnなど

extensions/volume-discount-fn/が作成され、次のファイルが入ります。

コード
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

主に編集するのは、設定用の .toml、入力用の .graphql、処理内容を記述する .rs / .js の3種類です。

チュートリアル1:Line Item Scriptを置き換える(数量割引)

以前のScriptが、特定のコレクションの商品をカートに5点以上入れた場合に、注文の小計を10%割り引いていたとします。対応するFunctionは次のとおりです。

手順1.1:設定(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"]

手順1.2:入力クエリ(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
  } 
}

ヒント: Functionsが参照できるのは、クエリで取得したデータだけです。GraphQLの取得項目は必要最小限にしましょう。不要なフィールドを省くほど、実行が速くなり、コストも抑えられます。

手順1.3:処理内容(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,
                }],
            },
        )],
    })
} 

手順1.4:テスト、デプロイ、有効化

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

GraphiQLのQuery Variables欄で、startsAtに将来のISO 8601日時を指定してください。実行前に、使うAPIバージョンの追加必須フィールドを確認します。

これでデプロイ済みFunctionを呼ぶ自動割引を作成します。この用途では、FunctionがScriptのロジックを置き換えます。

チュートリアル2:Shipping Scriptを置き換える(カート金額に応じて配送方法を非表示にする)

よくあるScriptの例は、「カートの小計が$500を超える場合、高額な注文に翌日配送を適用しないようExpress Shippingを非表示にする」というものです。Delivery Customization Functionでは、次のように実装します。

チュートリアル2と3では、現在のJavaScriptテンプレートを使用します。生成されたターゲットとsrc/index.jsのエクスポートはそのまま保持し、各拡張機能のshopify.extension.tomlでapi_version = "2026-10"を設定してください。入力クエリを置き換えた後、各拡張機能のディレクトリでshopify app function typegenを実行します。

手順2.1:ひな形を作る

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

手順2.2:入力クエリ(src/cart_delivery_options_transform_run.graphql)

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

手順2.3:処理内容(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 };
}    

手順2.4:配送のカスタマイズを作成して有効化する

shopify app deployを実行し、対象ストアにアプリをインストールした後、write_delivery_customizationsスコープを持つ、そのアプリの認証済みAdmin GraphQLクライアントからdeliveryCustomizationCreateを実行します。functionHandle変数には、shopify.extension.tomlにある拡張機能のhandle(例: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 }
  }
}

レスポンスに有効なカスタマイズが返され、userErrorsがないことを確認します。その後、設定 → 配送と配達 → 配送のカスタマイズを確認し、チェックアウトの動作をテストしてください。デプロイによってFunctionが利用可能になり、このミューテーションによってストアのカスタマイズが作成・有効化されます。

チェックアウトで配送方法を非表示にするShopifyのDelivery Customization Function

チュートリアル3:Payment Scriptを置き換える(B2B顧客には代金引換を非表示にする)

以前のScriptが「『B2B』タグの付いた顧客には代金引換を表示しない」という処理をしていたとします。Payment Customizationでは、次のように実装します。

手順3.1:ひな形を作る

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

手順3.2:入力クエリ(src/cart_payment_methods_transform_run.graphql)

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

手順3.3:処理内容(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 } }],
  };
}      

手順3.4:決済のカスタマイズを作成して有効化する

対象ストアにアプリをデプロイしてインストールした後、write_payment_customizationsスコープを持つ、そのアプリの認証済みAdmin GraphQLクライアントからpaymentCustomizationCreateを実行します。functionHandleには、shopify.extension.tomlにある決済用拡張機能のhandle(例: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 }
  }
}

レスポンスに有効な決済カスタマイズが含まれ、userErrorsがないことを確認します。設定 → 決済 → 決済のカスタマイズで確認し、B2Bタグのある顧客とない顧客でチェックアウトをテストしてください。

ここで購入後の注文編集について

チェックアウト後の変更には、Revizeが、販売者の編集期間内に注文状況ページや注文確認メールのリンクから、フルフィルメント前の対象となる顧客セルフサービスを提供します。別商品への変更と商品の追加にはProが必要で、スタッフ向け編集は開発中です。顧客は追加の残額を確認し、Shopifyのチェックアウトで支払います。Shopify注文管理2026:Plus運用担当者の実践ガイドで、標準のチェックアウト後の流れを説明しています。

移行の話に戻りましょう。

テスト戦略:顧客タグを使う方法

開発ストアと代表的な入力データで、記録した要件や保存したScriptのテスト結果に代替の動作を照合します。Scriptsは実行されないため、本番でScriptとFunctionを並行テストすることはできません。顧客タグでテストFunctionを社内アカウントに限定できます。本番公開はこれらのテストと分けてください。

手順1:テスト用ユーザーにタグを付ける

Customersで、社内のアカウント2~3件にFN-TESTERタグを付けます。

手順2:タグの有無でFunctionの処理を分岐する

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

手順3:入力クエリにhasAnyTagを追加する

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

手順4:チェックアウトで確認する

タグ付きユーザーで、対象・対象外のカート、割引の併用、配送・決済方法を確認します。タグなしユーザーで操作を返さないことも確認してください。古いロジックの期待動作と比較し、タグ制限を外す前にゲストのチェックアウトもテストします。

手順5:本番での有効化を確認する

適切な割引・配送・決済設定から、テスト済みの代替を有効にします。デプロイしたアプリ版と復元計画を記録し、チームの資料から古いScriptの手順を削除してください。

運用規模が大きくなっても使えるデプロイ手順

開発者のノートパソコンからデプロイし続ける運用は避けましょう。1~2個のScriptsを移行したら、CIパイプラインを整えます。

最小限のワークフロー

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

Shopify Dev DashboardでApp Automation Tokenを作成し、上のリポジトリシークレットに保存してください。現在のCLIにはNode.js 22.12以上が必要です。CI前にプロジェクトをアプリ設定に紐づけ、デプロイ前のテストとリリース確認を追加してください。この例はmainへのプッシュで公開するため、チームのリリース方針に合わせてトリガーを調整します。

バージョン管理とロールバック

shopify app deployはバージョン付きのスナップショットを作成します。以前のバージョンに戻すには、次を実行します。

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

以前のコードを思い出して貼り直す必要があったScriptsと比べると、大きな改善です。

ローカル、ステージング、本番環境にまたがるShopify Functionsのデプロイパイプライン

多くのチームが間違えること

Function公開前に確認する、よくある移行上の落とし穴です。

1. Scriptsを1対1でFunctionsへ移そうとする。 1つのFunctionで、3つのScriptsをより整理された分岐処理に置き換えられる場合があります。書き直す前に、Scripts全体の役割を確認しましょう。

2. アプリのスコープとFunctionの入力データを混同する。 Functionは入力クエリと設定したメタフィールドの公開データを読みます。read_customersやread_ordersを追加してもAdmin APIへのアクセスは得ません。アプリスコープは別のAdmin API操作にのみ追加し、開発する拡張の入力・設定ルールを確認してください。

3. 動作一致のテストを省く。 公開前に、代表的なカートと重要な境界条件で古いScriptとFunctionを比較してください。段階公開は拡張と設定が対応する場合のみ使います。

4. Customizations Reportを確認しない。 実際に稼働している処理を把握するうえで、最も役立つ一覧です。記憶を頼りに移行せず、レポートを基に進めましょう。

5. コレクションIDや顧客タグをコードに直接書き込む。 マーチャントが値を調整できるようにするなら、メタフィールドを使ってFunctionを設定します。CLIはメタフィールドを使う設定のひな形も作成できます。詳しくは、ShopifyのFunction設定に関するドキュメントを参照してください。

移行チェックリスト

このチェックリストでScripts移行の現在の状態を確認してください。

段階 操作
一覧化 Customizations Reportと移行資料で影響するロジックを特定。
対応付け 各Scriptについて、Function、公開アプリ、他の対応設定のどれが適切か確認。
構築と検証 現在のCLIテンプレートを使い、開発ストアで代表的なカートをテスト。
公開 Functionターゲットの現在のデプロイ・有効化手順に従う。
確認 本番のチェックアウトを確認し、社内資料やワークフローから古いScript参照を削除。

実行期限は過ぎたため、本番のチェックアウトと残る代替作業の点検を優先してください。

Shopify ScriptsからFunctionsへの移行ロードマップ

よくある質問

Functionsの利用にShopify Plusは必要ですか?

Functionsを使う公開アプリは、個別のFunction APIの要件に応じてShopifyの各プランで利用できます。Functionsを含むカスタムアプリにはShopify Plusが必要です。実装方法を選ぶ前に、ターゲットのプラン要件を確認してください。

TypeScriptでFunctionsを書けますか?

ShopifyのFunctionsツールはJavaScriptに対応します。 適切なビルド処理を用意すればTypeScriptを使えますが、CLIが直接ひな形を作ると想定せず、対象Functionの現在の言語・テンプレート案内に従ってください。

FunctionsはScriptsと比べてどれくらい速いですか?

Shopify Functionsは制限のあるWebAssembly環境で動きます。 Shopify資料でターゲットの現行制限を確認し、一律の実行時間ベンチマークに頼って実装を計画しないでください。

Functionは外部APIを呼び出せますか?

一部のFunction APIは、制限された提供範囲とShopifyによる有効化の下で、fetchターゲットによるネットワークアクセスに対応します。Shopifyが宣言されたHTTPリクエストを行い、結果をrunターゲットへ渡します。通常のFunctionが任意のAPIを呼べると想定しないでください。利用可否を確認し、ネットワークアクセスがなければ事前に値を入れたメタフィールドを使います。

Cart TransformとDiscountsの違いは?

Discountsは価格を変え、Cart Transformはカート内容を変えます。 10%割引、送料無料、1つ購入でもう1つ無料にはDiscounts APIを使います。2商品を1明細にまとめたり、1バリエーションを複数に分けたりするにはCart Transformを使います。古いScriptsは両方を混ぜることが多いため、移行時は2つのFunctionsに分けてください。

開発ストアなしでローカルテストするには?

Rustはcargo test、JSはnpm testで単体テストできますが、完全な結合テストには開発ストアが必要です。 CLIのshopify app function runはサンプル入力でFunctionを実行し、素早い反復に役立ちます。ただし、チェックアウトの一連の動作確認には実際のストアとカートが必要です。

同じ種類のFunctionを複数使えますか?

はい。APIの有効化上限に従います。Discount Functionsは互いを認識せず同時に実行され、Shopifyは割引ノードの併用ルールに従って候補を組み合わせます。結果が順に別のFunctionへ渡ると想定せず、Discount Function APIと配送・決済ターゲット資料を確認してください。

Functionを公開した後、Scriptはどうなりますか?

実行期限は過ぎたため、必要な動作には対応する代替や再設定が必要です。 管理画面にScriptが表示されても従来の記録として扱い、現在の移行ガイドで代替や整理が必要か確認してください。

移行はSEOやテーマに影響しますか?

いいえ。Functionsはチェックアウトのサーバー側で実行され、テーマや商品ページには触れません。 チェックアウトの割引、配送方法、決済方法のみを変更します。ストアフロント、商品テンプレート、SEOは変わりません。

独自プロパティを持つInput.line_itemsを使うScriptを移行するには?

独自プロパティはGraphQL入力のカート明細のattributeから取得できます。 linesにattribute(key: "your-key") { value }を追加します。Rubyのメソッドの代わりにGraphQLを使うだけで、Scriptの明細プロパティと同様にFunctionから読み取れます。

分析や注文タグなど、Functionsはデータを書き込めますか?

Functions自身は注文タグを書いたりWebhookを起動したりできず、現在のカートへの操作のみを返します。 タグ付けや後続処理は、注文作成イベントで起動するShopify Flowを使います。多くの販売者は、割引用Functionと、注文に「VOLUME-DISCOUNT-APPLIED」タグを付けるFlowを組み合わせます。

独自Functionを作る代わりに使える公開アプリはありますか?

はい。Shopify App Storeには、一般的な用途のFunctionsを組み込むアプリが多数あります。 「割引Function」「配送カスタマイズ」「決済カスタマイズ」で検索してください。数量割引、タグ別の決済方法非表示、一定額以上の送料無料などの単純な用途では、既存アプリで数日の開発を省ける場合があります。独自Functionは事業固有のロジックに使いましょう。

6月30日後もScriptを使っていた場合は?

公開済みScriptsは期限に無効化されました。ストアの割引、配送、決済の動作を確認し、不足するルールを優先して、公開前に代表的なカートで代替を検証してください。

Script Editorアプリを削除できますか?

現在のShopify管理画面と移行ガイドで、従来のScript Editorの記録を整理する必要があるか判断してください。 Shopify Functionsはアプリ拡張で、従来のScriptsとは別に管理されます。

次の手順

  1. Customizations Reportと現在のShopify移行ガイドを確認する。
  2. 開発ストアで該当するチェックアウトのケースをテストする。
  3. プランで必要なロジックに対応するFunctionsや公開アプリを確認する。
  4. 本番の各代替を検証し、管理者と設定を記録する。

チェックアウトのルールと購入後編集のテストは分けてください。各システムの担当アプリ、有効な機能、フルフィルメント・決済の動作を記録し、今後の変更に明確な担当者を付けます。

参考資料

関連記事: Shopify注文編集の統計(2026年) · Shopifyで顧客が自分の注文を編集できるようにする方法(2026年)