👌

Shopify でおひとり様 1 点限りの設定を行う方法|購入制限アプリの作成方法を考察

2024/08/13に公開

はじめに

今回は、Shopify でおひとり様一点限りの購入制限設定を行う方法を考察していきます。

Shopify のメタフィールドや Shopify の Function を利用する方法等について調べました。

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

おひとり様 1 点限りの設定の定義

まずは、おひとり様一点限りの購入制限設定の定義からまとめていきます。

「おひとり様一点限りの購入制限設定」とは、特定の商品に対して、同一顧客が一度に複数個購入することを制限するルールです。

この購入制限は、商品在庫の適切な管理や、より多くの顧客に公平に商品を提供するために使用されます。

かなり具体的に書くと、ログインしていないお客様は購入できず、ログインしているお客様は過去にその商品の購入履歴が存在しない場合に購入できる、というものになります。

こちらの記事を参考にしました。
https://unblog.unreact.jp/blog/gxiixxbs6_2o
https://qiita.com/eijiSaito/items/90fd2a304571b8f34f8e
https://unreact.jp/blog/shopify-one-per-person-setup
https://unreact.jp/shopify-apps/sa-058-ur-one-per-person/guide

おひとり様 1 点限りの設定を行うメリット

まずは、おひとり様一点限りの購入制限を行うメリットについて解説していきます。

おひとり様一点限りの購入制限メリットが無いと、考察する意味もあまり無いですからね。

オンラインストアにおいて「おひとり様一点限りの購入制限」を設定することは、商品の在庫管理や顧客満足度の向上において多くのメリットをもたらします。以下に、その主なメリットを解説します。

1. 公平な商品配分

「おひとり様一点限りの購入制限」を設定することで、特に人気商品や限定商品に対して、より多くの顧客に商品が行き渡るようにできます。これにより、特定の顧客が商品を独占することを防ぎ、全体の顧客満足度を向上させることができます。

2. 転売対策の強化

購入制限を行うことで、転売目的で大量に商品を購入する行為を抑制できます。転売業者が商品を買い占めるリスクを軽減し、正規の顧客が適正な価格で商品を購入できるようにすることで、ブランドの信頼性を保ちます。

3. 商品の希少価値の向上

「一点限り」という制限を設けることで、商品に対して希少性を感じさせることができます。これは顧客に対して購買意欲を高める効果があり、特に限定商品や新商品において有効なマーケティング手法となります。

4. 在庫管理の効率化

購入制限を設けることで、在庫管理が容易になります。過剰な購入を防ぐことで、在庫の偏りや不足を抑え、効率的な在庫管理を実現できます。これにより、商品が常に適切な数量で提供されるようになり、販売機会の損失を防ぎます。

5. 顧客満足度の向上

顧客が購入しやすい環境を整えることで、ブランドに対する信頼とロイヤルティを高めることができます。購入制限があることで、顧客は自分が特別な商品を購入できたと感じ、満足度が向上します。これがリピート購入につながる可能性も高まります。

6. マーケティング効果の強化

購入制限は、プロモーションやキャンペーンにおいて非常に効果的です。例えば、期間限定で「おひとり様一点限り」の商品を販売することで、顧客の関心を引きつけ、キャンペーンの成功率を高めることができます。

ここまでで、おひとり様一点限りの購入制限を行うメリットについての解説は終了です。

次に、おひとり様一点限りの購入制限を行うデメリットについて解説します。

おひとり様 1 点限りの設定を行うデメリット

ついでに、おひとり様一点限りの購入制限を行うデメリットについてもまとめていきます。

「おひとり様一点限りの購入制限」は、公平な商品配分や転売対策に有効な手段ですが、導入にあたってはいくつかのデメリットも考慮する必要があります。以下に、その主なデメリットを解説します。

1. 売上機会の損失

購入制限を設けることで、特定の顧客が同一商品を複数購入することを防ぐため、短期的には売上機会の損失につながる可能性があります。特に、リピーターやまとめ買いを希望する顧客に対して制限がかかるため、全体の売上が減少するリスクがあります。

2. 顧客の不満を引き起こす可能性

購入制限により、顧客が希望する数量を購入できない場合、不満が生じることがあります。特に、購入意欲の高い顧客や、家族や友人の分もまとめて購入したい顧客にとっては、制限が煩わしく感じられることがあり、ブランドに対するネガティブな印象を与える可能性があります。

3. 管理の複雑化

購入制限を導入することで、ストア運営側の管理が複雑になることがあります。制限を設定・管理するためには、システム面での追加開発やメンテナンスが必要になることがあり、運営コストや時間が増加するリスクがあります。また、誤って制限が適用されない場合や、逆に不要な制限が適用される場合には、顧客対応が必要となり、運営負担が増えることも考えられます。

4. マーケティング施策への影響

購入制限を設定することで、プロモーションやキャンペーンの内容が制限される可能性があります。例えば、複数購入による割引やボリュームディスカウントの提供が難しくなり、顧客の購買意欲を削ぐ可能性があります。これにより、キャンペーンの効果が減少し、期待した成果が得られないリスクが伴います。

5. 柔軟性の欠如

購入制限を一律に設けることで、ストア運営の柔軟性が失われることがあります。異なる商品や状況に応じた柔軟な対応が難しくなり、特定の商品や顧客セグメントに対する適切な施策が実施しづらくなることがあります。この結果、ストア全体の戦略に制約が生じることがあります。

6. ロイヤルカスタマーへの影響

長期的なロイヤルカスタマーに対しても、購入制限が不利に働くことがあります。これにより、リピーターが離れてしまう可能性があり、長期的な顧客ロイヤルティに悪影響を与えることが考えられます。特に、高価な商品や限定商品に対する購入制限は、ロイヤルカスタマーの購買行動に制限をかける可能性があります。

それでは、おひとり様一点限りの購入制限設定を実装する方法について解説していきます。

おひとり様 1 点限りの設定の実装方法

ここから、おひとり様一点限りの購入制限設定の実装方法について考察しています。

今回は、購入制限設定を行う方法なので、liquid を用いて Shopify のストアフロントで購入制限を行う方法と、Shopify Function を用いて購入制限を行う方法の二種類があります。

まずは、liquid を用いて Shopify のストアフロントで購入制限を行う方法について考察していきます。

Liquid を用いて Shopify のストアフロントで購入制限を行う方法

それでは、Liquid を用いて Shopify のストアフロントで購入制限を行う方法について解説していきます。

shop のメタフィールドを活用する

今回は、Liquid の shop オブジェクトのメタフィールドに対して値を入れることで、購入制限を行っていきましょう。

以下の Shopify の公式ドキュメントを参照していきます。

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

以下の画像にあるように、shop には metafields が存在します。

こちらの shop のメタフィールドに値を入れることで、ストアフロントで購入制限を行うことができそうです。

product オブジェクトを活用する

また、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"
}

上記にあるように、productにはidが存在します。

こちらのproductオブジェクトのidshopのメタフィールドを比較することで、Shopify のストアフロントでおひとり様一点限りの購入制限を行うかどうかの判定が可能です。

後は、おひとり様一点限りの購入制限を行う際に、ストアの購入ボタンを非表示にすれば良さそうですね。次は、customerオブジェクトを活用していきましょう。

customer オブジェクトを活用する

また、顧客がログインしており、かつ該当の商品を購入したことが有るかどうかを判定するために、Liquid のcustomerオブジェクトを使用する必要があります。

以下の公式ドキュメントを参照してください。
https://shopify.dev/docs/api/liquid/objects/customer

以下が、Liquidのcustomerオブジェクトの実体です。

{
  "accepts_marketing": true,
  "addresses": [],
  "addresses_count": 4,
  "b2b?": false,
  "company_available_locations": [],
  "company_available_locations_count": 1,
  "current_company": {},
  "current_location": null,
  "default_address": {},
  "email": "cornelius.potionmaker@gmail.com",
  "first_name": "Cornelius",
  "has_account": true,
  "has_avatar?": false,
  "id": 5625411010625,
  "last_name": "Potionmaker",
  "last_order": {},
  "name": "Cornelius Potionmaker",
  "orders": [],
  "orders_count": 1,
  "phone": "+441314960905",
  "tags": [
    "newsletter"
  ],
  "tax_exempt": false,
  "total_spent": "56.00"
}

customerオブジェクトを取得できるかどうかで、顧客がログインしているかどうかを判定できます。

後は、customerオブジェクトのメタフィールドに、該当の商品を購入したことが有るかどうかのフラグ値を持たせれば良さそうです。

後は、customerオブジェクトのメタフィールドをwebhookを用いて更新すれば実現できそうです。

webhook を活用

どの webhook を活用するのかを考察していきましょう。

以下の公式ドキュメントを参照してください。

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

該当の商品を購入した際に、customerオブジェクトのメタフィールドを変更する必要がありますね。

そのため、今回はorders/createwebhookを活用していきましょう。

orders/createwebhookからは、以下の情報が返却されます。

かなり長いので、途中で省略しています。

{
  "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,
...
}

上記のwebhookの情報をもとに、customerのメタフィールドを編集すれば実装できそうですね。

ここまでで、Liquid を用いて Shopify のストアフロントからおひとり様一点限りの購入制限を行う方法の解説は終了です。

次は、Shopify Function を用いておひとり様一点限りの購入制限を行う方法について解説していきます。

Shopify Function API を用いておひとり様一点限りの購入制限を行う方法

それでは、Shopify Function API を用いておひとり様一点限りの購入制限を行う方法について考察していきます。

まずは、以下のShopify Function API一覧を、公式ドキュメントで確認しましょう。

https://shopify.dev/docs/api/functions

Cart and Checkout Validation APIを利用すれば、おひとり様一点限りの購入制限を行うことができそうですね。

それでは次に、Cart and Checkout Validation APIについて調べていきましょう。

Cart and Checkout Validation API について

以下のドキュメントを見ていきましょう。

https://shopify.dev/docs/api/functions/reference/cart-checkout-validation

こちらのドキュメントの内容を、ざっくりとまとめます。

Shopify Cart and Checkout Validation Function APIの概要

ShopifyのCart and Checkout Validation Function APIは、カートおよびチェックアウトのプロセスにおいて、カスタムバリデーションを提供するための強力なツールです。このAPIを利用することで、PayPalやShop Pay、Google Pay、Apple Payといったエクスプレスチェックアウトも含めたバリデーションを独自に定義することが可能になります。以下に、このAPIの機能やユースケースについて詳しく解説します。

主なユースケース

Validation APIは、以下のようなカスタムバリデーションを実現するために使用されます:

  • トークンゲーティングや顧客メンバーシップの要求

    • 特定のトークンを保持しているか、または特定のメンバーシップを持つ顧客のみがチェックアウトを完了できるように制限します。
  • 顧客の年齢やIDの確認

    • 顧客がチェックアウトに進む際に、年齢確認やID認証を行うことで、特定の商品(例:アルコール、タバコ)の販売を管理します。
  • B2B商品の最小・最大購入数および購入数の倍数の指定

    • B2B取引において、特定の商品に対する最小購入数量、最大購入数量、または購入数の倍数を指定し、これに基づくバリデーションを行います。
  • B2Bロケーションの注文最小・最大数、またはクレジットリミットの提供

    • 特定のロケーションに基づいて、注文数量の制限やクレジットリミットを設け、それに基づくバリデーションを行います。
  • フラッシュセールにおける数量制限の指定

    • 限定セール時に、各顧客が購入できる商品の数量を制限し、特定の条件を満たすかどうかをチェックします。
制限事項
  • ドラフト注文の非対応

    • 現在のところ、Validation APIはドラフト注文には対応していません。これにより、ドラフト注文に対するカスタムバリデーションは行えません。
  • バリデーション関数のキャッシュ

    • バリデーション関数はキャッシュされます。このため、変更が適用されるまでに遅延(通常1分以内)が発生することがあります。これを考慮して運用する必要があります。

こちらのドキュメントに有る通り、Cart and Checkout Validation APIを使えば、おひとり様一点限りの購入制限を行うことはできそうです。

次に、具体的なコードを見ていきましょう。

Cart and Checkout Validation Function API の具体的なコード

それでは、Cart and Checkout Validation Funcition API の具体的なコードを見ていきましょう。

以下の Shopify 公式ドキュメントを確認していきましょう。

https://shopify.dev/docs/api/functions/reference/cart-checkout-validation/graphql

以下が、input.graphqlになります。

query Input {
  cart {
    lines {
      quantity
    }
  }
}

上記の実行結果が以下になります。

{
  "cart": {
    "lines": {
      "quantity": 2
    }
  }
}

また、以下のoutput.jsonを返却することで、validation を行うことができます。

{
  "errors": [
    {
      "localized_message": "Not possible to order more than one of each",
      "target": "$.cart"
    }
  ]
}

input.graphqlで、customerproductのメタフィールドを取得できます。

そのため、後はそちらのメタフィールドの情報をもとに、output.jsonの値を変更することで、おひとり様一点限りの購入制限を行うことになります。

メタフィールドの設定に関しては、Liquid を用いたストアフロントの実装方法と概ね同じになるので、今回は割愛します。

ここまでで、Liquid や Shopify Function を用いておひとり様一点限りの購入制限を行う方法について考察しました。

後はカスタムアプリを作成すれば、実装できるかと思います。

ここからは、非エンジニアの方にむけて、Shopify アプリを用いておひとり様一点限りの購入制限を行う方法について解説してきます。

Shopify アプリを用いておひとり様一点限りの購入制限を行う方法

それでは次に、アプリを使っておひとり様一点限りの購入制限を行う方法について解説していきます。

今回紹介するアプリはシンプルおひとり様一点限りの購入制限設定です。

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

こちらアプリの機能について解説していきいます。

以下の記事を参考にしました。

https://unblog.unreact.jp/blog/gxiixxbs6_2o
https://qiita.com/eijiSaito/items/90fd2a304571b8f34f8e
https://unreact.jp/blog/shopify-one-per-person-setup
https://unreact.jp/shopify-apps/sa-058-ur-one-per-person/guide

シンプルおひとり様一点限りの購入制限設定の機能

シンプルおひとり様一点限りの購入制限設定は、おひとり様一点限りの購入制限を行うこちができる非常にシンプルなアプリです。

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

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

こちらのアプリを利用すると、商品毎におひとり様一点限りの購入制限を設定できます。

ログインをしていないユーザーは、自動で購入制限できます。

また、一度購入したユーザーに対しても、自動で購入制限を行えます。

恐らく、Cart and Checkout Validation APIを使用して実装されていると思われます。

{
  "errors": [
    {
      "localized_message": "Not possible to order more than one of each",
      "target": "$.cart"
    }
  ]
}

また、二点以上の購入を自動で制限できます。

非常にシンプルにおひとり様一点限りの購入制限を行えるので、カスタムアプリを作成するのが難しい場合は、選択肢の一つに入ってくるかと思います。

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

最後に

ここまでで、Shopify の Function API や Liquid オブジェクトを用いておひとり様一点限りの購入制限を行う方法と、Shopify アプリを用いておひとり様一点限りの購入制限を行う方法について解説しました。

お疲れさまでした。

Discussion