🐙

Shopifyで予約販売(受注生産)を実装する方法を考察

2024/08/11に公開

はじめに

今回は、Shopify で予約販売(受注生産)を実装する方法について考察しました。

メタフィールドを利用する方法や、Shopify の Webhook を利用する方法、Shopify の pre-prderAPI を利用する方法等についてまとめました。

それでは、頑張っていきましょう。

Shopifyにおける予約販売(受注生産)の定義

まずは、Shopify における予約販売(受注生産)の定義からです。

Shopifyの「予約販売」または「受注生産」機能は、ストアオーナーが在庫がまだ確保できていない商品や、発売前の商品を販売するための便利な方法です。この機能を利用することで、顧客は先に商品を購入し、商品が準備でき次第、配送を受けることができます。

特に限定商品や新商品の発売前に、予約を通じて顧客の関心を集めることができ、売上の安定化を図ることが可能です。この記事では、Shopifyにおける予約販売の定義とその活用方法について詳しく解説します。

かなり具体的に書くと、予約販売開始前に Shopify の購入ボタンを非活性にしたり、予約販売中の商品の購入ボタンの表示を変更したり、予約販売終了後の購入ボタンを非活性にする機能等が挙げられます。

また、予約販売商品が含まれているかどうか注文で判別するために、注文にタグをつける機能等も上げられます。

Shopifyで予約販売(受注生産)を行うメリット

次に、Shopify で予約販売(受注生産)を行うメリットについて解説します。

メリットが無いと、予約販売を行う方法を考察する必要があまり無いですからね。

Shopifyのストアにおいて、予約販売(受注生産)を導入することは、ストア運営者にとってさまざまなメリットをもたらします。この販売手法は、まだ在庫がない商品や発売前の商品を顧客に提供する方法であり、特に新商品や限定商品の販売に効果的です。以下に、Shopifyで予約販売を行う主なメリットについて詳しく解説します。

1. 先行収益の確保

予約販売を導入することで、商品がまだ生産中であったり、在庫がない段階でも、売上を先行して確保することができます。これにより、商品の製造や仕入れにかかるコストを事前にカバーすることができ、キャッシュフローを安定させる効果があります。特に、大規模な製造プロジェクトや新商品の投入前に、リスクを分散させる手段として有効です。

2. 需要予測と在庫管理の最適化

予約販売を通じて、どの程度の需要があるのかを事前に把握することができます。これにより、実際の製造や仕入れの数量を適切に調整することが可能になり、過剰在庫や欠品を防ぐことができます。需要予測が正確にできることで、無駄な在庫コストを削減し、効率的な在庫管理が実現します。

3. 顧客のエンゲージメント向上

予約販売を行うことで、顧客とのエンゲージメントを強化することができます。特に、新商品や限定商品の予約販売は、顧客に対して特別な価値を提供する機会となり、ブランドに対する興味や関心を高める効果があります。また、予約購入による期待感を持たせることで、顧客が再訪する可能性も高まり、長期的なロイヤルティの向上につながります。

4. 限定感の演出による購買意欲の刺激

予約販売を利用することで、商品に対して限定感を演出することができます。数量限定や発売日限定の予約販売は、顧客に「今しか手に入らない」という意識を持たせることで、購買意欲を強く刺激することができます。このような限定販売は、ストアに訪れる顧客に対して「特別感」を提供し、競合他社との差別化にも寄与します。

5. 市場反応のテストとフィードバックの収集

新商品を市場に投入する際、予約販売を行うことで、顧客からの反応を事前に確認することができます。予約状況を通じて、商品の人気度や顧客の関心度を把握することができ、必要に応じてマーケティング戦略や製品仕様の調整を行うことができます。また、予約販売中に収集した顧客フィードバックは、今後の商品改善や新製品開発において非常に有益な情報となります。

6. 機会損失の防止

予約販売を導入することで、在庫切れや供給不足の際に顧客が他のストアに流れるのを防ぐことができます。通常であれば、在庫がない商品に興味を持った顧客は他の選択肢を探しに行くかもしれませんが、予約販売が提供されていれば、その場で注文を確保することができ、顧客を逃すリスクを減少させることができます。

7. 簡単なマーケティングとプロモーション戦略

予約販売は、マーケティングとプロモーション戦略の一環としても非常に有効です。予約販売を開始するタイミングを利用して、ソーシャルメディアやメールキャンペーンを通じて顧客にアプローチし、商品への期待感を高めることができます。また、予約販売を行うことで、リピーターの顧客に対して特別なオファーを提供する機会が生まれ、さらなる販売促進につながります。

ついでに、Shopify で予約販売(受注生産)を行うデメリットについても考えていきましょう。

Shopifyで予約販売(受注生産)を行うデメリット

ここからは、Shopify で予約販売(受注生産)を行うデメリットについて解説します。

Shopifyで予約販売(受注生産)を導入することには多くのメリットがありますが、同時にいくつかのデメリットや課題も存在します。これらのデメリットを理解し、適切に対策を講じることで、予約販売のリスクを最小限に抑えることができます。以下に、Shopifyで予約販売を行う際の主なデメリットについて詳しく解説します。

1. 納期遅延のリスク

予約販売では、商品が製造中またはまだ在庫が確保できていない状態で顧客から注文を受けるため、納期遅延が発生するリスクがあります。商品の生産や供給に予期しない遅延が発生した場合、顧客に対して予定された納期を守ることができず、結果的に顧客満足度の低下を招く可能性があります。これにより、クレームやキャンセルが増加し、ブランドイメージが損なわれるリスクがあります。

2. キャンセルや返金対応の増加

予約販売では、商品が手元に届く前に顧客が注文をキャンセルしたり、返金を求めるケースが増える可能性があります。特に、納期が遅れたり、顧客の期待と異なる商品が届いた場合、キャンセルや返金の対応が必要となります。これにより、運営コストが増加し、カスタマーサポートの負担が大きくなる可能性があります。

3. 在庫管理の複雑化

予約販売と通常販売の在庫管理が混在する場合、在庫管理が複雑化する可能性があります。予約注文分と通常の販売在庫を正確に把握し、適切に管理するためには、在庫管理システムの調整や追加のプロセスが必要です。これにより、管理の負担が増加し、在庫管理のミスが発生するリスクも高まります。

4. キャッシュフローのリスク

予約販売は先行収益を確保する手段として有効ですが、商品の納期が遅れたり、キャンセルが発生した場合、返金処理や補償対応が必要となり、キャッシュフローに悪影響を及ぼす可能性があります。また、先行収益を基に商品製造を行う場合、予想外のコストが発生するリスクもあります。これらの要因により、短期的なキャッシュフローの圧迫が生じる可能性があります。

5. 顧客の期待管理が難しい

予約販売を行う際、顧客は商品に対して高い期待を抱くことが多く、その期待を管理することが難しい場合があります。特に、新商品や限定商品の場合、顧客は発売日を楽しみにしているため、商品が期待通りでない場合や納期が遅れた場合、失望感が強まり、ネガティブなレビューや口コミが広がるリスクがあります。これにより、ブランドイメージの低下や将来の販売に悪影響を及ぼす可能性があります。

6. 法的および規制上のリスク

予約販売を行う際には、各国や地域の法規制に注意が必要です。特に、消費者保護法や契約法に基づいて、予約販売に関する特定の情報を顧客に提供する義務がある場合があります。これを怠ると、法的なトラブルや罰金が発生する可能性があります。また、返金やキャンセルに関するポリシーが明確でない場合、顧客との間で紛争が発生するリスクもあります。

7. ブランドイメージへの影響

予約販売において、納期遅延やキャンセル、顧客の期待を満たせない場合、ブランドイメージに悪影響を与えるリスクがあります。特に、複数回にわたって問題が発生すると、顧客はブランドに対する信頼を失い、リピート購入が減少する可能性があります。これにより、長期的なビジネスにおいてマイナスの影響が生じるリスクがあります。

ここまでで、Shopify で予約販売(受注生産)を行うメリット・デメリットについての解説は終了です。

それでは次に、Shopify で予約販売(受注生産)を実装する方法について考察していきましょう。

Shopifyで予約販売(受注生産)を実装する方法

それではここから、Shopify で予約販売(受注生産)を実装する方法について考察していきます。

最初に、Shopify で予約販売(受注生産)を実装するためのデータ構造について考えていきましょう。

予約販売(受注生産)を実装するためのデータ構造

予約販売(受注生産)を実装するためのデータ構造について考えていきます。

まずは、予約販売開始日時・予約販売終了日時を設定する必要が有るかと思います。

これは、Shopify の Liquid のストアフロントで設定する必要があるので、まずは Shopify の Liquid のproductの公式ドキュメントを確認していきましょう。

https://shopify.dev/docs/api/liquid/objects/product

Liquid のproductからは、以下のオブジェクトを取得できます。

{
  "available": true,
  "collections": [],
  "compare_at_price": "25.00",
  "compare_at_price_max": "25.00",
  "compare_at_price_min": "25.00",
  "compare_at_price_varies": false,
  "content": "<h3>Are you low on health? Well we've got the potion just for you!</h3>\n<p>Just need a top up? Almost dead? In between? No need to worry because we have a range of sizes and strengths!</p>",
  "created_at": "2022-04-13 14:46:16 -0400",
  "description": "<h3>Are you low on health? Well we've got the potion just for you!</h3>\n<p>Just need a top up? Almost dead? In between? No need to worry because we have a range of sizes and strengths!</p>",
  "featured_image": {},
  "featured_media": {},
  "first_available_variant": {},
  "gift_card?": false,
  "handle": "health-potion",
  "has_only_default_variant": false,
  "id": 6786188247105,
  "images": [],
  "media": [],
  "metafields": {},
  "options": [
    "Size",
    "Strength"
  ],
  "options_by_name": {},
  "options_with_values": [],
  "price": "10.00",
  "price_max": "22.00",
  "price_min": "10.00",
  "price_varies": true,
  "published_at": "2022-04-13 14:53:34 -0400",
  "quantity_price_breaks_configured?": false,
  "requires_selling_plan": false,
  "selected_or_first_available_selling_plan_allocation": {},
  "selected_or_first_available_variant": {},
  "selected_selling_plan": null,
  "selected_selling_plan_allocation": null,
  "selected_variant": null,
  "selling_plan_groups": [],
  "tags": [
    "healing"
  ],
  "template_suffix": "",
  "title": "Health potion",
  "type": {},
  "url": {},
  "variants": [],
  "vendor": "Polina's Potent Potions"
}

今回は、metafieldに値を設定していきましょう。

一旦、予約販売開始日時と予約販売終了日時を設定すれば良さそうです。

以下のデータ構造になりそうですね。

{
  start_datetime: date | null,
  end_datetime: date | null
}

上記のデータをproductのメタフィールドに設定すれば、予約販売開始前と予約販売期間中、予約販売終了後の購入ボタンの変更ができそうですね。

後は、こちらの予約販売が設定されている商品を購入した際の注文に、どのタグを付与するかを設定しましょう。

そちらの要件を考慮すると、以下のようなデータ構造になるかと思います。

{
  start_datetime: date | null,
  end_datetime: date | null,
  order_tag: string
}

ここまでで、予約販売を行うためのデータ構造の決定は終了です。

それでは次に、メタフィールドの定義を行っていきましょう。

予約販売を行うためのメタフィールドの定義

予約販売を行うためのメタフィールドの定義を行っていきます。

設定カスタムデータに移動してください。

メタフィールドの定義商品を選択してください。

定義を追加するをクリックしてください。

以下の画面に移動します。

入力項目を埋めていきましょう。

名前にはpreOrderと入力してください。適当に良い感じに設定して頂ければ大丈夫です。

タイプを選択するをクリックしてください。

以下の画面のように、様々なタイプを設定できます。

JSONを選択して下さい。

JSONスキーマを設定していきましょう。

以下のように入力してください。

{
  "start_datetime": "",
  "end_datetime": "",
  "order_tag": ""
}

後は、保存をクリックしてください。

ここまでで、メタフィールドの定義は終了です。

それでは次に、予約販売が設定されている商品が購入された際に注文にタグをつける機能について考察していきましょう。

予約販売が設定されている商品が購入された際に注文にタグをつける機能を考察

それでは、機能について考察していきましょう。

こちらの機能には、Shopify の Webhook を利用することになるかと思います。

まずは、以下の公式ドキュメントから、該当のWebhookトピックを探しましょう。
https://shopify.dev/docs/api/admin-graphql/2024-07/enums/WebhookSubscriptionTopic

以下の、ORDERS_CREATEの Webhook を使用できそうですね。

それでは、orders/createの Webhook のリクエストボディについて確認していきましょう。

以下の公式ドキュメントです。

https://shopify.dev/docs/api/admin-rest/2024-07/resources/webhook#event-topics

orders/createを探しましょう。

以下のなります。

こちらの Webhook のリクエストボディを確認できました。

非常に長いので、途中で省略しています。

{
  "id": 820982911946154508,
  "admin_graphql_api_id": "gid://shopify/Order/820982911946154508",
  "app_id": null,
  "browser_ip": null,
  "buyer_accepts_marketing": true,
  "cancel_reason": "customer",
  "cancelled_at": "2021-12-31T19:00:00-05:00",
  "cart_token": null,
  "checkout_id": null,
  "checkout_token": null,
  "client_details": null,
  "closed_at": null,
  "confirmation_number": null,
  "confirmed": false,
  "contact_email": "jon@example.com",
  "created_at": "2021-12-31T19:00:00-05:00",
  "currency": "USD",
  "current_subtotal_price": "398.00",
  "current_subtotal_price_set": {
    "shop_money": {
      "amount": "398.00",
      "currency_code": "USD"
    },
    "presentment_money": {
      "amount": "398.00",
      "currency_code": "USD"
    }
  },
  "current_total_additional_fees_set": null,
  "current_total_discounts": "0.00",
  "current_total_discounts_set": {
    "shop_money": {
      "amount": "0.00",
      "currency_code": "USD"
    },
    "presentment_money": {
      "amount": "0.00",
      "currency_code": "USD"
    }
  },
  "current_total_duties_set": null,
  "current_total_price": "398.00",
  "current_total_price_set": {
    "shop_money": {
      "amount": "398.00",
      "currency_code": "USD"
    },
    "presentment_money": {
      "amount": "398.00",
      "currency_code": "USD"
    }
  },
  "current_total_tax": "0.00",
  "current_total_tax_set": {
    "shop_money": {
      "amount": "0.00",
      "currency_code": "USD"
    },
    "presentment_money": {
      "amount": "0.00",
      "currency_code": "USD"
    }
  },
  "customer_locale": "en",
  "device_id": null,
  "discount_codes": [

  ],
  "email": "jon@example.com",
  "estimated_taxes": false,
  "financial_status": "voided",
  "fulfillment_status": "pending",
  "landing_site": null,
  "landing_site_ref": null,
  "location_id": null,
  "merchant_of_record_app_id": null,
  "name": "#9999",
  "note": null,
  "note_attributes": [

  ],
  "number": 234,
  "order_number": 1234,
  "order_status_url": "https://jsmith.myshopify.com/548380009/orders/123456abcd/authenticate?key=abcdefg",
  "original_total_additional_fees_set": null,
  "original_total_duties_set": null,
  "payment_gateway_names": [
    "visa",
    "bogus"
  ],
  "phone": null,
  "po_number": null,
  "presentment_currency": "USD",
  "processed_at": "2021-12-31T19:00:00-05:00",
  "reference": null,
  "referring_site": null,
  "source_identifier": null,
  "source_name": "web",
  "source_url": null,
  "subtotal_price": "388.00",
  "subtotal_price_set": {
    "shop_money": {
      "amount": "388.00",
      "currency_code": "USD"
    },
    "presentment_money": {
      "amount": "388.00",
      "currency_code": "USD"
    }
  },
  "tags": "tag1, tag2",
  "tax_exempt": false,
  "tax_lines": [

  ],
  "taxes_included": false,
  "test": true,
  "token": "123456abcd",
  "total_discounts": "20.00",
  "total_discounts_set": {
    "shop_money": {
      "amount": "20.00",
      "currency_code": "USD"
    },
    "presentment_money": {
      "amount": "20.00",
      "currency_code": "USD"
    }
  },
  "total_line_items_price": "398.00",
  "total_line_items_price_set": {
    "shop_money": {
      "amount": "398.00",
      "currency_code": "USD"
    },
    "presentment_money": {
      "amount": "398.00",
      "currency_code": "USD"
    }
  },
  "total_outstanding": "398.00",
  "total_price": "388.00",
  ...
}

こちらのリクエストボディと、商品のメタフィールドに設定している値を使用すれば、注文にタグを付与することができそうですね。

注文にタグを付与する際には、以下の GraphQL Admin API を利用すれば行えそうです。

https://shopify.dev/docs/api/admin-graphql/2024-07/mutations/tagsadd

以下が、サンプルコードになります。

mutation addTags($id: ID!, $tags: [String!]!) {
  tagsAdd(id: $id, tags: $tags) {
    node {
      id
    }
    userErrors {
      message
    }
  }
}
{
  "id": "gid://shopify/Customer/544365967",
  "tags": "one, two, three"
}

ここまでで、Shopify で予約販売(受注生産)を行う方法の解説は終了です。

後は、カスタムアプリを作成して商品のメタフィールドを設定したり、Webhook 周りの実装を行ったり、Shopify のストアフロントの Liquid のコードを編集すれば Shopify で予約販売(受注生産)を実装できるかと思います。

しかし、非エンジニアの方には難しいかと思いますので、念のため Shopify アプリを用いて予約販売を行う方法について解説していきます。

Shopify アプリを使って予約販売(受注生産)を実装する方法

それでは、Shopify アプリを使って予約販売(受注生産)を実装する方法について考察していきます。

今回紹介するのは、シンプル予約販売|受注生産や在庫切れ商品販売で使えるというアプリです。

以下の記事を参考にしています。

https://unreact.jp/shopify-apps/sa-003-unreact-pre-order-app/guide

https://unreact.jp/blog/shopify-preorder-app

https://unreact.jp/blog/shopify-app-pre-order-app-ranking

https://unblog.unreact.jp/blog/38swz7u0js

https://qiita.com/eijiSaito/items/014398e7d01ab3e5f046

以下が、Shopify 公式のアプリストアになります。

https://apps.shopify.com/shopify-application-392?locale=ja

それでは、こちらのアプリについて解説していきます。

「シンプル予約販売|受注生産や在庫切れ商品販売で使える」の機能について

シンプル予約販売|受注生産や在庫切れ商品販売で使えるは、Shopify で予約販売(受注生産)を行える非常にシンプルなアプリです。

機能としては非常にシンプルで、予約販売商品が購入されると、自動でタグを付与することができます。恐らく、商品購入時にorders/createの Webhook を走らせて、注文にタグを付与することで実装しています。

予約販売したい商品を選択し、予約販売期間を設定します。また、予約販売開始前・予約販売期間中・予約販売終了後それぞれのボタンテキストを設定します。

以下の画像のように、予約販売前・販売中・販売終了後のメッセージを設定できます。

非常にシンプルで安価な予約販売アプリなので、カスタムアプリを自作するのが難しい場合には、選択肢の一つに入ってくるかと思います。

https://apps.shopify.com/shopify-application-392?locale=ja

最後に

今回は、カスタムアプリ・Webhook やメタフィールドを使って予約販売を実装する方法と、Shopify アプリを使って予約販売を実装する方法の二つを紹介しました。

お疲れさまでした。

Discussion