今からでも間に合う、Stripe CheckoutではじめるBlack Friday / Cyber Monday & 年末商戦

この記事では、ブラックフライデー（Black Friday）やサイバーマンデー（Cyber Monday）・そして年末商戦など、年末のさまざまな大型セール期間に向けた販売キャンペーンを、Stripe Checkoutで簡単に始める方法を紹介します。特別な割引オファーの準備や、LPの構築と提供方法などを、コードベースで解説します。

Stripe Checkoutの持つ機能を活用することで、少ない開発時間・準備期間でもセールへの参加が期待できます。年末のECサイト売り上げを獲得するためのヒントとして、ぜひご活用ください。

## Black Friday / Cyber Mondayとは？

Black Friday（ブラックフライデー）とCyber Monday（サイバーマンデー）は、年末商戦の幕開けを告げる重要な販売イベントです。

- **Black Friday**: 米国の感謝祭（11月第4木曜日）の翌日に行われる大規模セール。実店舗での買い物が中心。
- **Cyber Monday**: Black Fridayの翌週の月曜日に行われるオンラインショッピングの特別セール。

これらのイベントは、小売業者にとって年間で最も売上が期待できる時期であり、消費者にとっても大きな割引や特別オファーを享受できる機会です。近年では日本でも注目度が高まっており、多くの企業がこの時期に合わせてキャンペーンを展開しています。

Stripeでは、これらのセール期間にどれだけの決済がStripeを利用して処理されたかを紹介するイベントページを毎年公開しています。2024年に公開したページでは、売り上げ情報などを表示するデバイスを開発し、そのデバイスに表示されている数字を見ることができるようになっています。

![スクリーンショット 2024-11-29 21.10.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/f931960e-86e9-5268-94da-2ecb5b5a50f8.png)

https://bfcm.stripe.com/

## Stripe Checkoutではじめる割引キャンペーンや特別オファーの始め方

Stripe Checkoutを使用すると、簡単かつ迅速に特別オファーや割引キャンペーンを設定できます。以下に、主要な設定方法を紹介します。

### [基本] Stripe Checkoutで割引クーポンを利用する方法

まずStripe Checkoutを利用した注文フローで、クーポンの割引を利用できるようにしましょう。この設定方法はとてもシンプルで、Checkout Sessionを作成する際のリクエストパラメータに`allow_promotion_codes`の1行を追加するだけです。

```diff_javascript
const session = await stripe.checkout.sessions.create({
  mode: 'payment',
  success_url: 'https://example.com',
+  allow_promotion_codes: true,
  line_items: [
    {
      price: 'price_1PQPKoL8xlxrZ26gZAEn1EzU',
      quantity: 1,
    },
    {
      price: 'price_1PQPKsL8xlxrZ26g07kmnOd8',
      quantity: 1,
    },
  ],
});
```

この1行を追加するだけで、決済フォームにクーポンコードを入力するフィールドが追加されます。

![スクリーンショット 2024-11-29 21.31.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/80ca0741-90e9-64ea-6085-5b97d43d8de5.png)

あとはこのフィールドにユーザーが入力するクーポンコードを、キャンペーン内容に合わせて発行するだけです。

### 商品や販売期間などの条件をカスタマイズしたクーポンを発行する

割引オファーを行う最も簡単方法は、クーポンを発行することです。StripeではAPIやダッシュボードを使って簡単に割引クーポンを発行できます。この際、`redeem_by`を設定しておくことで、セール期間が終了してからクーポンを使うことができないようにしておきましょう。

```js
const coupon = await stripe.coupons.create({
  percent_off: 30,
  name: 'BFCM2024',
  redeem_by: 1733497140, // 2024/12/06 23:59
  duration: 'once', // 割引回数は1度に1回
});
```

もし「新発売の商品は割引対象から除外したい」のような割引対象に対する要望が社内である場合は、`applies_to`を利用して割引できる対象の商品IDを配列で指定しましょう。これによって対象外の商品を注文する際に、クーポンによる割引を提供しないようにできます。

```diff_javascript
const coupon = await stripe.coupons.create({
  percent_off: 30,
  name: 'BFCM2024',
  redeem_by: 1733497140, // 2024/12/06 23:59
  duration: 'once', // 割引回数は1度に1回
+  applies_to: {
+    products: ['prod_QGxFHcqTrLytT2', 'prod_QGxFoHEpIyxHHF'],
+  },
});
```

Checkout Sessionで対象外の商品が含まれている場合、エラーメッセージが表示されます。

![スクリーンショット 2024-11-29 21.24.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/e0578330-04ad-8f0f-3dfe-3bff7058f225.png)

またクーポンを提供するための割引コード（Promotion Code）についても、さまざまな条件設定が行えます。例えばSNS広告限定のクーポンコードを発行したい場合、次のようなコードを実行します。

```js
const promotionCode = await stripe.promotionCodes.create({
  active: true,
  coupon: '<クーポンのID>',
  code: 'BFCM2024SNS',
  max_redemptions: 100,
});
```

さらに「先着100名限定、5,000円以上の注文でのみ利用可能」のような条件を設定したい場合も、コードを発行するパラメータを調整するだけで実現できます。

```diff_javascript
const promotionCode = await stripe.promotionCodes.create({
  active: true,
  coupon: '<クーポンのID>',
  code: 'BFCM2024SNS',
+  max_redemptions: 100,
+  restrictions: {
+    minimum_amount: 5000,
+    minimum_amount_currency: 'jpy',
+  },
});
```

これらの機能を使いこなして、さまざまな媒体や販路・顧客層に対してプロモーション戦略を実行しましょう。

### 特定のクーポンコードを設定済みの状態にする方法

クーポンコードの発行によるキャンペーンも有効ですが、より全体的な割引オファーを行うことも可能です。全ユーザー・または特定のページを訪れたすべてのユーザーに対して割引を提供したい場合、「Checkout Session作成時のパラメータへ、クーポンコードを事前設定する」ことができます。この場合、`allow_promotion_codes`の代わりに`discounts`パラメータを利用し、対象となるクーポンのIDまたは割引コードを設定します。

```diff_javascript
const session = await stripe.checkout.sessions.create({
  mode: 'payment',
  success_url: 'https://example.com',
-  allow_promotion_codes: true,
  line_items: [
    {
      price: 'price_1PQPKoL8xlxrZ26gZAEn1EzU',
      quantity: 1,
    },
  ],
+  discounts: [
+    {
+      coupon: '<クーポンのID>',
+    },
+  ],
});

```

`discounts`を利用してCheckout Sessionを作成すると、顧客が決済ページにアクセスした時点ですでに割引が適用されている状態となります。これによって顧客に対して簡単に割引価格での商品注文を促すことができます。

![スクリーンショット 2024-11-29 21.38.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/90b7fc31-2e90-c6b0-8cf3-32dbab6a5246.png)

:::note warn
`allow_promotion_codes`と`discounts`を併用すると、次のエラーが発生します。どちらかのパラメータのみStripe APIへ送信するように実装内容を調整しましょう。

```json
{
  "error": {
    "message": "You may only specify one of these parameters: allow_promotion_codes, discounts.",
    "message_code": "multi_exclusive_parameters",
    "param": "allow_promotion_codes",
    "request_log_url": "https://dashboard.stripe.com/test/logs/req_xxxxx",
    "type": "invalid_request_error"
  }
}
```
:::

## まとめ

このように、Stripe Checkoutのクーポン機能とStripeの持つ強力なクーポン・割引コード機能を活用することで、とても簡単に顧客へさまざまな割引オファーを提示できます。セールに対応するための開発リソースや期間の確保が難しかった場合でも、クーポンを使ったマーケティング施策などであれば、迅速にアクションを起こすことができます。

ぜひ今年の年末商戦への参加を見送っていた方も、Stripeのもつ機能を活用した販促施作を今からでもご検討ください。

## 関連ドキュメント

https://docs.stripe.com/payments/checkout/discounts

https://docs.stripe.com/billing/subscriptions/coupons?locale=ja-JP

https://docs.stripe.com/api/coupons/create

## 関連記事

https://qiita.com/hideokamoto/items/2e5e00b68f83eb7fab8e

https://qiita.com/hideokamoto/items/ad19a5503c42de8770a1

https://qiita.com/hideokamoto/items/11f54da6da338f756056

https://qiita.com/hideokamoto/items/ab792ae45c51958f2212

https://qiita.com/hideokamoto/items/f10d6ebb4ff53502687a

https://qiita.com/hideokamoto/items/2dddc4898772f2cc19dc