🗞

【Shopify.dev和訳】Apps/Subscriptions/Fulfillments

2021/09/17に公開

この記事について

この記事は、Apps/Subscriptions/Fulfillmentsの記事を和訳したものです。

記事内で使用する画像は、公式ドキュメント内の画像を引用して使用させていただいております。

Shopify アプリのご紹介

Shopify アプリである、「商品ページ発売予告アプリ | リテリア Coming Soon」は、商品ページを買えない状態のまま、発売日時の予告をすることができるアプリです。Shopify で Coming Soon 機能を実現することができます。

https://apps.shopify.com/shopify-application-314?locale=ja&from=daniel

Shopify アプリである、「らくらく日本語フォント設定|リテリア Font Picker」は、ノーコードで日本語フォントを使用できるアプリです。日本語フォントを導入することでブランドを演出することができます。

https://apps.shopify.com/font-picker-1?locale=ja&from=daniel

プリペイドサブスクリプションのフルフィルメントを作成および管理する| Create and manage fulfillments for prepaid subscriptions

スケジュールされた履行を伴うプリペイドサブスクリプションを作成することができます。顧客がマーチャントからプリペイドサブスクリプションを購入すると、SubscriptionContract と order が作成されます。注文には、後で履行される予定の複数の履行命令が含まれています。この日付は、sellingPlanRecurringDeliveryPolicy に設定された配信 anchorsinterval、およびvに基づいて決定intervalCountれます。これにより、支払いと販売された商品が同じ順序で保持され、Shopify での正確な報告をサポートします。

このチュートリアルでは、サブスクリプションのフルフィルメントを管理するためのコールを説明します。延期されたフルフィルメント注文、フルフィルメントの手動変更、カットオフ、更新、スケジューリング、スキップ、および返金に関する情報を提供します。

要件| Requirements

スコープ| Scopes

アプリがフルフィルメント注文を再スケジュールまたはオープンするには、以下の権限が必要です。これらのパーミッションにより、アプリは、すでに請求された注文のスケジュールされたサイクルを管理することができます。

  • read_merchant_managed_fulfillment_orders: マーチャントが管理するロケーションに割り当てられた、スケジュールされたフルフィルメント注文を読み取ります。
  • write_merchant_managed_fulfillment_orders: マーチャントが管理するロケーションに割り当てられたフルフィルメント注文を再スケジュールし、オープンします。
  • read_third_party_fulfillment_orders: サードパーティサービスに割り当てられたフルフィルメントオーダーのスケジュールを読み取る。
  • write_third_party_fulfillment_orders: サードパーティサービスに割り当てられたフルフィルメントオーダーを再スケジュールして開く。

コアコンセプト| Core concepts

チェックアウトおよび注文のラインアイテム

サブスクリプションは、チェックアウト時に 1 つのラインアイテムとして表示されます。しかし、対応する注文のラインアイテムの数量は、定期購入の課金ポリシーインターバルカウントを表しています。例えば、お客様がコーヒーブランの 3 ヶ月分の定期購入をした場合、チェックアウト時のラインアイテムの数量は 1、注文時のラインアイテムの数量は 3 となります。

フルフィルメント注文の属性

フルフィルメントオーダーの fulfillAt 属性は、マーチャントがフルフィルメントオーダーのアイテムのフルフィルメントをいつ開始すべきかを表します。また、この属性は、locationfulfillmentServicedeliveryMethodTypedeliveryProfileとともに、SCHEDULED ステータスのフルフィルメントオーダーのラインアイテムのグループ化に貢献します。

第三者のフルフィルメントサービスに割り当てられたフルフィルメントオーダーの場合、fulfillAt 属性は、マーチャントがフルフィルメントサービスにフルフィルメントを要求するタイミングを表します。

fulfillmentOrderStatusSCHEDULED 状態は、将来の fulfillAt の日付で作成されたフルフィルメント注文の状態を表します。このステータスは、関連するすべてのフルフィルメント注文が SCHEDULED 状態である注文の場合、注文の displayFulfillmentStatus でも表されます。

フルフィルメント注文| Fulfillment orders

お客様が商人からプリペイド型のサブスクリプションを購入すると、サブスクリプション契約と注文が作成されます。また、1 つまたは複数のフルフィルメントオーダーが作成され、オーダーに関連付けられます。これにより、プリペイドサブスクリプションのシナリオをサポートすることができます。お客様は、請求と配送の間隔を利用して配送される製品に対して前払いを希望します。

API object Description
Subscription contract サブスクリプション契約とは、一定期間または未定義の期間にわたって定期的に購入するための、お客様とマーチャントとの間の契約です。購入者がマーチャントからプリペイドサブスクリプションを購入すると、サブスクリプション契約と注文が作成されます。
Order この注文には、プリペイドサブスクリプションの期間中に送信されるすべてのアイテムが含まれます。この注文には、sellingPlanRecurringDeliveryPolicy で設定された配送アンカー、間隔、および間隔カウントに基づいて、後から配送される予定の複数の関連する履行注文があります。これにより、支払いと販売された商品が同じ順序で保持され、Shopify での正確な報告をサポートします。
Line items ショッピングカート内の 1 行を表します。顧客がプリペイドサブスクリプションのチェックアウトを完了すると、注文にはプリペイドサブスクリプションの期間中に送信されるラインアイテムが含まれます。
Line items 以下に基づいて、履行のためにグループ化された仕事の単位(例えば、ラインアイテム):
location
fulfillment service
delivery method
delivery profile

構築するもの| What you'll build

このチュートリアルの例では、コーヒーバッグの 3 ヶ月間のプリペイド定期購入を作成するシナリオを中心に説明します。このシナリオでは、注文に対して 3 つの別々のフルフィルメントオーダーが作成されます。このシナリオで想定しているテストショップの設定は次のとおりです。

このチュートリアルでは、以下の内容を説明します。

プリペイドサブスクリプションのライフサイクル

成功したプリペイドサブスクリプションフローは次のようになります。

  1. お客様はチェックアウトを開始します。チェックアウトの項目は「コーヒーバッグの 3 ヶ月前払い定期購入」で、数量は 1 です。
  2. お客様はチェックアウトを完了します。定期購入の契約と注文の両方が作成されます。注文の行項目はコーヒーバッグで、数量は 3 個です。
  3. 注文に関連して、SCHEDULED 状態の 3 つのフルフィルメント注文が作成される。フルフィルメントオーダーの fulfillAt の日付は次のとおりです。
    • フルフィルメント注文 1: 1 月 15 日
    • フルフィルメント注文 2: 2 月 15 日
    • フルフィルメント注文 3: 3 月 15 日

各フルフィルメントオーダーの fulfillAt 日付に達すると、在庫がコミットされ、フルフィルメントオーダーが OPEN 状態に移行して、そのフルフィルメントオーダーのアイテムがフルフィルメント可能としてマークされます。

1 月 15 日には、最初の fulfillmentOrder が OPEN 状態に移行し、そのアイテムのフルフィルメントが開始されることを示します。1 月 15 日にフルフィルメントされる予定のアイテムだけがフルフィルメントの準備ができており、残りのアイテムは予定として表示されています。

フルフィルメント注文を手動で開く| Manually open a fulfillment order

マーチャントは、Shopify 管理画面で、スケジュールされたフルフィルメントのための早期フルフィルメントを選択することができます。スケジュールされたフルフィルメント注文の場合、これはフルフィルメント注文のステータスを fulfillAt の日付の前に OPEN に変更します。以下の例のように、API を使用してフルフィルメントオーダーのステータスを OPEN に設定することもできます。

Request

POST /admin/api/unstable/graphql.json

Query
mutation {
fulfillmentOrderOpen(
  id: "gid://shopify/FulfillmentOrder/1899849515064"
)
{
   fulfillmentOrder {
      id
    status
   }
   userErrors {
    field
    message
   }
  }
}

JSON response:

Response
{
  "data": {
    "fulfillmentOrderOpen": {
      "fulfillmentOrder": {
        "id": "gid://shopify/FulfillmentOrder/1899849515064",
        "status": "OPEN"
      },
      "userErrors": []
    }
  },
  ...
}

販売プランの締切日の設定 | Set the cutoff date for a selling plan

販売プランは、sellingPlanRecurringDeliveryPolicy にカットオフを設定することができます。カットオフは、次の配送サイクルの対象となるために、配送アンカーの何日前に注文を行う必要があるかを示します。

以下の例では、cutoff を「5」に設定しています。フルフィルメント注文に含めるためには、締切日(10 日 23:59:59:999)の 5 日前までに注文を行う必要があります。SelingPranilDelivalPolicyPreAnchorBehavior フィールドは ASAP に設定されています。このフィールドは、アイテムがいつフルフィルメントされるかを決定します。例えば、お客様が 1 月 8 日にチェックアウトを完了した場合、設定は以下のように機能します。

NEXT - fulfillAt date は、1 月 15 日、2 月 15 日、3 月 15 日となります。
ASAP - fulfillAt の日付は、1 月 8 日、2 月 15 日、3 月 15 日となります。

Request

POST /admin/api/unstable/graphql.json

Query
mutation ($input: SellingPlanGroupInput!, $resources: SellingPlanGroupResourceInput) {
  sellingPlanGroupCreate(input: $input, resources: $resources) {
    userErrors {
      field
      message
    }
  }
}

Input:

以下の入力には、preAnchorBehaviorASAP に設定された deliveryPolicy カットオフが「5」に設定されていることが含まれます。

{
  "input": {
      "name": "Prepaid",
      "merchantCode": "prepaid",
      "options": ["prepaid options"],
      "sellingPlansToCreate": [
        {
          "name": "Prepaid 3 months - delivery every months - 20% off",
          "options": ["3 months - delivery every month"],
          "billingPolicy": { "recurring": { "interval": "MONTH", "intervalCount": 3 } },
          "deliveryPolicy": { "recurring": { "interval": "MONTH", "intervalCount": 1, "cutoff": 5, "preAnchorBehavior": "ASAP"  } },
          "pricingPolicies": [
            {
              "fixed": {
                "adjustmentType": "PERCENTAGE",
                "adjustmentValue": { "percentage": 20 }
              }
            }
          ]
        }
      ]
  },
  ...
  }
}

サブスクリプションの更新| Renew the subscription

プリペイドのサブスクリプション契約が更新されると、アプリは subscriptionBillingAttemptCreate ミューテーションを使用して請求を試行する必要があります。その後、顧客に請求書が発行され、新しい請求サイクルのための新しい注文が生成されます。

例題のシナリオでは、3 月 15 日に最後のフルフィルメントオーダーが実行された後、次の 3 か月分の新しいオーダーを作成する必要があります(4 月、5 月、6 月の 15 日に予定されている 3 つのフルフィルメントオーダーを含む)。

フルフィルメント注文を再スケジュールする| Reschedule a fulfillment order

次の例では、フルフィルメントオーダーの ID とともに fulfillAt の新しい値を指定することにより、フルフィルメントを再スケジュールします。

Example request:

POST /admin/api/unstable/graphql.json

Query
mutation {
fulfillmentOrderReschedule(
  id: "gid://shopify/FulfillmentOrder/1899851251768",
  fulfillAt: "2021-01-01"
)
{
   fulfillmentOrder {
      fulfillAt
   }
   userErrors {
    field
    message
   }
  }
}

JSON response:

Response
Copy
{
  "data": {
    "fulfillmentOrderReschedule": {
      "fulfillmentOrder": {
        "fulfillAt": "2021-01-01T00:00:00Z"
      },
      "userErrors": []
    }
  },
  ...
}

フルフィルメント注文をスキップする| Skip fulfillment orders

お客様は、予定していたフルフィルメントをスキップすることができます。例えば、3 ヶ月間のコーヒーの定期購入の場合、お客様はその月に十分なコーヒーを持っているため、フルフィルメントをスキップすることを決めるかもしれません。このユースケースをサポートするためには、フルフィルメント注文を再スケジュールするためのコールと、更新日を 1 サイクル変更するためのコールを行う必要があります。

フルフィルメントオーダーを再スケジュールする

次のミューテーションは、2 月 15 日に予定されているフルフィルメント注文を 4 月 15 日に再スケジュールします。

Example request:

POST /admin/api/unstable/graphql.json

Query
mutation {
fulfillmentOrderReschedule(
  id: "gid://shopify/FulfillmentOrder/1899851251768",
  fulfillAt: "“2020-04-15”"
)
{
   fulfillmentOrder {
      fulfillAt
   }
   userErrors {
    field
    message
   }
  }
}

JSON response:

Response
{
  "data": {
    "FulfillmentOrderReschedule": {
      "fulfillmentOrder": {
        "fulfillAt": "2020-04-15T00:00:00Z"
      },
      "userErrors": []
    }
  },
  ...
}

更新日を変更する

次のミューテーションは、更新日を 1 サイクル分変更します。2 月 15 日のフルフィルメントオーダーが 4 月 15 日に移動されたため、更新は 5 月 15 日に発動しています。

Example request:

POST /admin/api/unstable/graphql.json

Query
mutation {
subscriptionContractSetNextBillingDate(
  contractId: "gid://shopify/SubscriptionContract/1671224",
  date: "2020-05-15"
)
{
   contract {
      nextBillingDate
   }
   userErrors {
    field
    message
   }
  }
}

JSON response:

Response
{
  "data": {
    "subscriptionContractSetNextBillingDate": {
      "contract": {
        "nextBillingDate": "2020-05-15T00:00:00Z"
      },
      "userErrors": []
    }
  },
  ...
}

払い戻しを処理する| Handle refunds

顧客は、1 つ以上のスケジュールされたフルフィルメントの払い戻しをリクエストできます。また、Shopify 管理者では払い戻しがサポートされています。 refundCreateミューテーションを使用して、さまざまな払い戻しシナリオをサポートできます。

払い戻しの仕組み

払い戻しは、最後のサイクルから始まり、時系列の逆順で逆方向に行われます。

SCHEDULED ステータスのフルフィルメント注文は OPEN ステータスの注文よりも優先されます。また、返金対象となるフルフィルメントオーダーは fulfillAt の値を用いて降順に選択されます。

返金とサブスクリプション契約のキャンセルについて

フルフィルメントオーダーを返金しても、サブスクリプション契約に関連する更新は自動的にキャンセルされません。更新をキャンセルするには、サブスクリプション契約を更新する必要があります。

払い戻しの電話の例

次の例を使用して、いくつかの一般的な払い戻しシナリオを実装できます。

一部払い戻し

次のリクエストは、最初のサイクルがすでに完了した後、残りのサブスクリプションサイクルをキャンセルします。

Example request:

POST /admin/api/unstable/graphql.json

Query
mutation {
refundCreate(
  input: {
    orderId: "gid://shopify/Order/2067697074232",
    refundLineItems: {
      lineItemId: "gid://shopify/LineItem/4780880232504",
      quantity: 2,
      restockType: CANCEL,
      locationId: "gid://shopify/Location/9562054"
    }
  }
)
{
   refund {
      id
   }
   userErrors {
    field
    message
   }
  }
}

JSON response:

Response
{
  "data": {
    "refundCreate": {
      "refund": {
        "id": "gid://shopify/Refund/65502773304"
      },
      "userErrors": []
    }
  },
  ...
}

最後のサイクルの払い戻し

次のリクエストは、最後に予定されていたフルフィルメントをキャンセルします。

Example request:

POST /admin/api/unstable/graphql.json

Query
mutation {
refundCreate(
  input: {
    orderId: "gid://shopify/Order/2067697074232",
    refundLineItems: {
      lineItemId: "gid://shopify/LineItem/4780880232504",
      quantity: 1,
      restockType: CANCEL,
      locationId: "gid://shopify/Location/9562054"
    }
  }
)
{
   refund {
      id
   }
   userErrors {
    field
    message
   }
  }
}

JSON response:

Response
{
  "data": {
    "refundCreate": {
      "refund": {
        "id": "gid://shopify/Refund/659856"
      },
      "userErrors": []
    }
  },
  ...
}

特定のサイクル数を払い戻す

次のリクエストは、6 か月のサブスクリプションの最後の 4 か月をキャンセルします。

Example request:

POST /admin/api/unstable/graphql.json

Query
mutation {
refundCreate(
  input: {
    orderId: "gid://shopify/Order/2067697074232",
    refundLineItems: {
      lineItemId: "gid://shopify/LineItem/4780880232504",
      quantity: 4,
      restockType: CANCEL,
      locationId: "gid://shopify/Location/9562054"
    }
  }
)
{
   refund {
      id
   }
   userErrors {
    field
    message
   }
  }
}
Response
{
  "data": {
    "refundCreate": {
      "refund": {
        "id": "gid://shopify/Refund/659856"
      },
      "userErrors": []
    }
  },
  ...
}

Webhook

マーチャントが Shopify 管理画面や他のアプリでプリペイド定期購入注文の返金を行った場合に、refunds/create webhook を購読することができます。これらのシナリオでは、Webhook をマーチャントと通信するためのトリガーとして使用できます。

重要な注意事項| Important notes

レガシーモバイルクライアント

モバイル クライアント (バージョン 8.75.0 以前) では、スケジュールされたフルフィルメント注文はモバイル UI から隠されます。スケジュールされたフルフィルメント注文の fulfillAt の期限が切れ、OPEN の状態に移行すると、UI で表示されるようになります。

レガシー POS クライアント

POS クラシック(Android および iOS)は、スケジュールされた注文のフルフィルメントステータスを表示しません。

v6.19 以前の全く新しい POS(iOS のみ)では、スケジュールされた注文に対してフルフィルメントステータスが公開されない。定期購入のみの商品は、POS の商品カタログに表示されません。また、アプリがカートに定期購入を追加すると、エラーが発生します。

次のステップ

サブスクリプションベースのフルフィルメント注文の高度なシナリオの処理

このチュートリアルでは、サブスクリプションの高度なフルフィルメントシナリオを管理するための呼び出しを説明します。以下についての情報を提供しています。

https://shopify.dev/apps/subscriptions/fulfillments/advanced#multiple-prepaid-subscriptions

https://shopify.dev/apps/subscriptions/fulfillments/advanced#prepaid-subscription-with-non-subscription-items

https://shopify.dev/apps/subscriptions/fulfillments/advanced#prepaid-subscription-with-subscribe-and-save-subscription-items

要件

このチュートリアルのシナリオ例

サブスクリプション API を使用して、コーヒーバッグの定期的な 3 か月のプリペイドサブスクリプションを作成できます。このシナリオでは、注文に対して 3 つの個別の履行注文が作成されます。このシナリオで想定されるテストショップには、次の設定があります。

  • 1 つのロケーション
  • 1 つのマニュアルフルフィルメントサービス
  • 1 つの配信プロファイル、1 つの配信方法

複数のプリペイドサブスクリプション

お客様は 1 つの注文に複数のプリペイド定期購入商品を追加することができます。

次の例では、顧客は 1 月 10 日に次のアイテムを注文します。

  • 3 ヶ月間のコーヒーフィルターのプリペイド購読
  • 3 ヶ月分のコーヒーバッグの定期購入

どちらも販売プランが異なり、コーヒーバッグのフルフィルメントは毎月 15 日から、フィルターは 17 日から始まります。

API リクエスト

Query
mutation ($input: SellingPlanGroupInput!, $resources: SellingPlanGroupResourceInput) {
  sellingPlanGroupCreate(input: $input, resources: $resources) {
    userErrors {
      field
      message
    }
  }
}

コーヒーバッグの入力

{
  "input": {
    "name": "Prepaid",
    "merchantCode": "prepaid",
    "options": ["prepaid options"],
    "sellingPlansToCreate": [
      {
        "name": "Prepaid 3 months - coffee bags - 20% off",
        "options": ["3 months - delivery every month"],
        "billingPolicy": {
          "recurring": {
            "interval": "MONTH",
            "intervalCount": 1,
            "anchors": [{ "day": 15, "type": "MONTHDAY" }]
          }
        },

        "deliveryPolicy": {
          "recurring": {
            "interval": "MONTH",
            "intervalCount": 1,
            "anchors": [{ "day": 15, "type": "MONTHDAY" }],
            "cutoff": 5
          }
        },
        "pricingPolicies": [
          {
            "fixed": {
              "adjustmentType": "PERCENTAGE",
              "adjustmentValue": { "percentage": 20 }
            }
          }
        ]
      }
    ]
  },
  "resources": {
    "productIds": ["gid://shopify/Product/1588439187512"],
    "productVariantIds": []
  }
}

Input for coffee filters

{
  "input": {
    "name": "Prepaid",
    "merchantCode": "prepaid",
    "options": ["prepaid options"],
    "sellingPlansToCreate": [
      {
        "name": "Prepaid 3 months - coffee filters - 20% off",
        "options": ["3 months - delivery every month"],
        "billingPolicy": {
          "recurring": {
            "interval": "MONTH",
            "intervalCount": 1,
            "anchors": [{ "day": 17, "type": "MONTHDAY" }]
          }
        },

        "deliveryPolicy": {
          "recurring": {
            "interval": "MONTH",
            "intervalCount": 1,
            "anchors": [{ "day": 17, "type": "MONTHDAY" }]
          }
        },
        "pricingPolicies": [
          {
            "fixed": {
              "adjustmentType": "PERCENTAGE",
              "adjustmentValue": { "percentage": 20 }
            }
          }
        ]
      }
    ]
  },
  "resources": {
    "productIds": ["gid://shopify/Product/1588439187512"],
    "productVariantIds": []
  }
}

JSON response:

Response
{
  "data": {
    "sellingPlanGroupCreate": {
      "sellingPlanGroup": {
        "name": "Every month delivery",
        "sellingPlans": {
          "edges": [
            {
              "node": {
                "name": "15th of the month",
                "options": [
                  "15"
                ]
              }
            }
          ]
        }
      },
      "userErrors": []
    }
  },
  ...
}

関連する製品を購入すると、API 呼び出しにより次の履行注文が発生します。

ルフィルメントオーダーの組み合わせ

異なるフルフィルメントオーダーに含まれる 2 つのアイテムが同じアンカーデートを共有している場合、それらは各サイクルの 1 つのフルフィルメントオーダーにまとめられます。例えば、両方の商品のアンカー日が毎月 15 日の場合、両方の商品を含む 3 つのフルフィルメントオーダーになります(各月に 1 つずつ)。

非サブスクリプションアイテムを含むプリペイドサブスクリプション

お客様は、前払いの定期購入商品と通常の単発商品(非定期購入)を同時に購入することができます。生成される注文には、購入された両方の商品が含まれます。

API の例では、3 ヶ月間のコーヒーバッグのプリペイド定期購入に加えて、お客様はセイコーのエスプレッソマシンを追加し、1 月 10 日にチェックアウトプロセスを完了しました。セイコーは 1 回限りの商品であり、すぐにフルフィルメントできるため、4 つのフルフィルメントオーダーが生成されます。

ただし、配送ポリシーで締切日が削除され、注文が 15 日に行われた場合、3 つの履行注文が生成されます。最初のフルフィルメント注文には、次の両方のアイテムが含まれます。

購読・保存可能なサブスクリプション項目を持つプリペイドサブスクリプション

お客様は、プリペイド型の購読アイテムと配信型の購読アイテムを同時に購入することができます。これにより、プリペイドアイテムの契約と通常のペイパーデリバリの契約の 2 つの契約が作成されます。生成された最初の注文には、プリペイドアイテムのすべてのサイクルと、サブスクライブ&セーブアイテムの最初のサイクルが含まれます。

次の例では、お客様が 3 ヶ月間のコーヒーバッグの定期購入と、コーヒーフィルターの有料配送の定期購入を購入します。1 月 10 日にチェックアウトが完了します。コーヒーフィルターの販売プランは、そのアイテムが毎月 12 日に請求・履行されるように設定されており、カットオフは定義されていません。

最初の注文(ID 444)には、以下のフルフィルメントオーダーがあります。

プリペイドサブスクリプションの入力

{
  "input": {
    "name": "Prepaid",
    "merchantCode": "prepaid",
    "options": ["prepaid options"],
    "sellingPlansToCreate": [
      {
        "name": "Prepaid 3 months - coffee bags - 20% off",
        "options": ["3 months - delivery every month"],
        "billingPolicy": {
          "recurring": {
            "interval": "MONTH",
            "intervalCount": 1,
            "anchors": [{ "day": 15, "type": "MONTHDAY" }]
          }
        },

        "deliveryPolicy": {
          "recurring": {
            "interval": "MONTH",
            "intervalCount": 1,
            "anchors": [{ "day": 15, "type": "MONTHDAY" }]
          }
        },
        "pricingPolicies": [
          {
            "fixed": {
              "adjustmentType": "PERCENTAGE",
              "adjustmentValue": { "percentage": 20 }
            }
          }
        ]
      }
    ]
  },
  "resources": {
    "productIds": ["gid://shopify/Product/1588439187512"],
    "productVariantIds": []
  }
}

購読して例を保存

次の例には、毎月 12 日のコーヒーフィルターのサブスクライブと保存のサブスクリプションを追加する API 呼び出しが含まれています。

Request

POST /admin/api/unstable/graphql.json

Query
mutation {
  sellingPlanGroupCreate(
    input: {
      name: "Every month coffee filters delivery on the 12th"
      options: ["Delivery Every"]
      sellingPlansToCreate: {
        name: "Coffee filters 12th of the month"
        options: ["12"]
        deliveryPolicy: {
          recurring: {
            anchors: { day: 12, type: MONTHDAY }
          }
        }
        pricingPolicies: {
          fixed: { adjustmentType: PERCENTAGE, adjustmentValue: { percentage: 10 } }
        }
        billingPolicy: {
          recurring: {
            interval: MONTH
            intervalCount: 1
            anchors: { day: 12, type: MONTHDAY }
          }
        }
      }
    }
    resources: { productIds: ["gid://shopify/Product/1588439154744"] }
  ) {
    sellingPlanGroup {
      name
      sellingPlans(first: 1) {
        edges {
          node {
            name
            id
          }
        }
      }
    }
    userErrors {
      code
      field
      message
    }
  }
}

JSON response:

{
  "data": {
    "sellingPlanGroupCreate": {
      "sellingPlanGroup": {
        "name": "Every month coffee filters delivery on the 12th",
        "sellingPlans": {
          "edges": [
            {
              "node": {
                "name": "Coffee filters 12th of the month",
                "id": "gid://shopify/SellingPlan/17268792"
              }
            }
          ]
        }
      },
      "userErrors": []
    }
  },
  ...
}

1 月には、コーヒーフィルターとコーヒーバッグの 2 つのフルフィルメントオーダーがあります。以下の図では、コーヒーフィルターは 12 日に、コーヒーバッグは 15 日に在庫が確定しています。

2 月 15 日、コーヒーバッグのフルフィルメントオーダーが OPEN に移行しました。また、コーヒーフィルターの有料配送サービスの請求が成功したことにより、新規注文(ID 555)が生成されます。

注文 ID 555 は、2 月 12 日に作成された新規注文です。注文作成時に在庫がコミットされ、フルフィルメント注文が OPEN の状態で作成されます。

次のステップ

Shopify アプリのご紹介

Shopify アプリである、「商品ページ発売予告アプリ | リテリア Coming Soon」は、商品ページを買えない状態のまま、発売日時の予告をすることができるアプリです。Shopify で Coming Soon 機能を実現することができます。

https://apps.shopify.com/shopify-application-314?locale=ja&from=daniel

Shopify アプリである、「らくらく日本語フォント設定|リテリア Font Picker」は、ノーコードで日本語フォントを使用できるアプリです。日本語フォントを導入することでブランドを演出することができます。

https://apps.shopify.com/font-picker-1?locale=ja&from=daniel

Discussion

ログインするとコメントできます