> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 割引

> プロモーションコードを作成して、コンバージョンを促進し、キャンペーンを実施し、一度限りおよびサブスクリプション購入においてお客様に割合割引を提供します。

<Frame>
  <img src="https://mintcdn.com/dodopayments/mOQO5ej_lx0yH9p-/images/discount-codes/discount-code-cover.png?fit=max&auto=format&n=mOQO5ej_lx0yH9p-&q=85&s=57f1a644801ddc5efc506b50541eaaba" alt="Discount codes overview cover" style={{ maxHeight: '500px', width: 'auto' }} width="1200" height="630" data-path="images/discount-codes/discount-code-cover.png" />
</Frame>

割引コードを使用すると、ターゲットを絞ったプロモーションやインセンティブを実施できます。割合ベースの割引を作成し、制限や有効期限を設定し、製品に限定し、チェックアウトでスムーズに適用します。

<CardGroup cols={2}>
  <Card title="Checkout Sessions" icon="cart-shopping" href="/developer-resources/checkout-session">
    ホストされたチェックアウト中に、`discount_codes`とUIコントロールを使用して、1つ以上のスタックコードを適用します。
  </Card>

  <Card title="Validate Discount" icon="code" href="/api-reference/discounts/validate-discount">
    割引がその ID で有効かどうかを確認します。
  </Card>

  <Card title="Get Discount by Code" icon="tag" href="/api-reference/discounts/get-discount-by-code">
    コード名（例: "SAVE20"）を使用して割引を検索し、検証します。
  </Card>

  <Card title="Create Discount (API)" icon="code" href="/api-reference/discounts/create-discount">
    プログラムで新しい割引コードを作成します。
  </Card>

  <Card title="List & Update Discounts" icon="code" href="/api-reference/discounts/list-discounts">
    既存の割引を閲覧および管理し、必要に応じて更新または削除します。
  </Card>

  <Card title="Plan Change Discounts" icon="arrows-rotate" href="/api-reference/subscriptions/change-plan">
    サブスクリプションプランをアップグレードまたはダウングレードする際に、割引コードを適用します。
  </Card>
</CardGroup>

## 割引コードとは？

割引コードは、チェックアウト時に注文合計を減少させるプロモーショントークンです。次のような場面で理想的です:

* **季節キャンペーン**: ブラックフライデー、製品発売、または周年記念
* **獲得オファー**: 初回購入インセンティブや紹介報酬
* **保持**: 既存顧客に対する再獲得またはロイヤルティ報酬
* **B2Bディール**: プライベートコードを通じた契約または交渉による価格設定

## 主な利点

* **柔軟な割引**: 割合ベースの割引
* **積み重ね可能なコード**: チェックアウト、支払い、またはサブスクリプションごとに最大20のコードを適用し、キャンペーンを組み合わせます（例: `WELCOME10` + `BLACKFRIDAY20`）専用のコードを作成せずに
* **ターゲット制御**: 製品およびサブスクリプションサイクルによる制限
* **キャンペーン管理**: 有効期限と使用制限
* **シームレスなチェックアウト**: UIフィールドとAPIサポートを通じたチェックアウトセッション

## 割引コードの作成

Dodo Paymentsダッシュボードで割引コードを作成し、ホストされたチェックアウトまたはAPI経由で適用します。

### ダッシュボード設定

* **割引名**（必須）：内部およびダッシュボード表示名
* **コード**（必須）：チェックアウト時に顧客が入力する文字列
* **タイプと金額**（必須）：割合値を設定する（現在は割合ベースの割引のみ対応）、または提供されたボタンを使用してランダムコードを生成する
* **有効期限**（オプション）：コードが無効になる日付
* **使用制限**（オプション）：すべての顧客にわたる最大合計利用回数
* **製品制限**（オプション）：選択された製品への適用を制限
* **サブスクリプションサイクル制限**（オプション）：割引が適用される請求サイクルの数
* **メタデータ**（オプション）：内部追跡や統合のためにカスタムキー–値のペアを添付

<Tip>
  サブスクリプションのイントロダクトリ価格にサイクル制限を使用します（例、"3か月で50％オフ"）。
</Tip>

## チェックアウトの体験

1. 購入者がチェックアウトフィールドにコードを入力します。
2. 適用可能な割引が適用され、合計金額が即座に更新されます。

<Info>
  Checkout Sessionsで、1つ以上のコードを事前適用するために`discount_codes`（配列）を渡し、入力フィールドを表示するために`feature_flags.allow_discount_code`を設定します。コードは配列の順序で適用され、最大20までです。
</Info>

## ディスカウントコードのスタッキング

チェックアウトセッション、支払い、サブスクリプションは、配列`discount_codes`（最大20エントリー）を通じて最大**20のスタックコード**を受け入れます。コードは配列順に適用され、最初の適格なコードが基準価格を最初に減らし、次のコードがすでに割引された価格を減らします。この割引の全セットは、レスポンスで`discount_ids`（支払い/サブスクリプション上）および`discounts`（位置および残りのサブスクリプションサイクルを含む、個別の割引詳細）に返されます。

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [{ product_id: 'prod_abc', quantity: 1 }],
  discount_codes: ['WELCOME10', 'BLACKFRIDAY20'], // applied in this order
  customer: { email: 'user@example.com' },
  return_url: 'https://yoursite.com/return'
});
```

<Info>
  単一の`discount_code`フィールドは**非推奨**ですが、後方互換性のために完全にサポートされています。既存の統合は変更なしで動作し続けます。同じリクエストで`discount_codes`と組み合わせることはできません。スタッキングとより豊かなレスポンス形状を活用するために、単一コードの場合でも、便利なときに`discount_codes`（配列形式）への移行をお勧めします。
</Info>

## API管理

<AccordionGroup>
  <Accordion title="Create discounts">
    タイプと量でディスカウントコードをプログラム的に作成します。

    <Card title="API Reference" icon="code" href="/api-reference/discounts/create-discount">
      ディスカウント作成APIを表示します。
    </Card>
  </Accordion>

  <Accordion title="List and retrieve">
    すべてのディスカウントをリストし、管理と監査のために詳細を取得します。

    <Card title="API Reference" icon="code" href="/api-reference/discounts/list-discounts">
      リストと取得APIを閲覧します。
    </Card>
  </Accordion>

  <Accordion title="Get discount by code">
    内部IDの代わりに、人間が読めるコード（例：「SAVE20」）を使用してディスカウントを検索します。

    <Card title="API Reference" icon="code" href="/api-reference/discounts/get-discount-by-code">
      コード名でディスカウントを取得します。
    </Card>
  </Accordion>

  <Accordion title="Update discounts">
    量、有効期限、制限などのディスカウント設定を変更します。

    <Card title="API Reference" icon="code" href="/api-reference/discounts/update-discount">
      ディスカウント詳細を更新する方法を学びます。
    </Card>
  </Accordion>

  <Accordion title="Validate discounts">
    適用する前にディスカウントが有効で適用可能かどうかを確認します。

    <Card title="API Reference" icon="code" href="/api-reference/discounts/validate-discount">
      ディスカウント使用の妥当性を確認します。
    </Card>
  </Accordion>

  <Accordion title="Delete discounts">
    不要になったディスカウントを無効にするか削除します。

    <Card title="API Reference" icon="code" href="/api-reference/discounts/delete-discount">
      ディスカウントを削除します。
    </Card>
  </Accordion>
</AccordionGroup>

## よくあるユースケース

* **イントロオファー**: 新製品のための期間限定のローンチプロモーション
* **大量またはB2B**: 特定の製品セットの契約ディスカウント
* **リテンション施策**: 離脱防止ワークフローの再獲得コード
* **季節キャンペーン**: 休日またはイベントベースのプロモーション

## インテグレーション例

### メタデータ付きでディスカウントを作成する

内部トラッキングのためにカスタムのキー–バリューペアを添付します。

```typescript theme={null}
const discount = await client.discounts.create({
  type: 'percentage',
  amount: 1500, // 15%
  code: 'SUMMER2025',
  metadata: {
    campaign: 'summer_promo',
    source: 'email_blast'
  }
});
```

<Tip>
  メタデータを使用してキャンペーン、ソース、または内部参照IDでディスカウントにタグを付け、後で使用を調整し、ROIを測定できます。
</Tip>

### チェックアウトセッションでディスカウントを適用する

事前適用されたスタックディスカウントを1つ以上適用し、コード入力UIを表示します。

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [
    { product_id: 'prod_abc', quantity: 1 }
  ],
  discount_codes: ['BLACKFRIDAY2024', 'NEWUSER5'], // stacked in array order
  customer: { email: 'user@example.com', name: 'Jane Doe' },
  return_url: 'https://yoursite.com/return'
});
```

### プラン変更時のディスカウント適用

顧客がサブスクリプションをアップグレードまたはダウングレードするときにプロモーション価格を提供します。

```typescript theme={null}
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_pro',
  quantity: 1,
  proration_billing_mode: 'prorated_immediately',
  discount_codes: ['UPGRADE20']
});
```

| `discount_codes` 値             | プラン変更時の挙動                                                         |
| ------------------------------ | ----------------------------------------------------------------- |
| `undefined` / `null`（提供されていない） | 新しい製品に適用できる場合、`preserve_on_plan_change=true`と共に既存のディスカウントが保持されます。 |
| `[]`（空の配列）                     | **すべての**既存のディスカウントがサブスクリプションから削除されます。                             |
| `['CODE_A', 'CODE_B', ...]`    | このスタックセットで既存のディスカウントを入れ替え、配列順に適用します。                              |

<Info>
  サブスクリプションのレスポンスで新しい`discounts`配列を介して適用されたすべてのディスカウントを読み取ります。各エントリーには`discount_id`、`position`、`cycles_remaining`（サブスクリプション用）、および元のコードが含まれます。
</Info>

### 事前適用せずにディスカウントエントリーを有効にする

顧客にコードを事前に渡さずにチェックアウトで入力させます。

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [
    { product_id: 'prod_abc', quantity: 1 }
  ],
  feature_flags: {
    allow_discount_code: true
  },
  return_url: 'https://yoursite.com/return'
});
```

## ベストプラクティス

* **明確に名前をつける**: キャンペーン名に合った認識しやすいコードを使用
* **時間を制限する**: 緊急性を促し、不正使用を防ぐために有効期限を追加
* **賢く範囲を設定する**: 特定の製品に限定し、利益率の漏れを防ぐ
* **早期に検証する**: チェックアウトを確定する前にコードの適用可能性を確認
* **影響を監視する**: キャンペーンごとの使用状況とコンバージョンを追跡

<Info>
  ディスカウントコードは取得と保持のための強力なレバーです。単純で分かりやすいオファーから始め、徹底的に検証し、パフォーマンスに基づいてイテレーションを行います。
</Info>
