---
title: "Stripeとの初期連携"
description: "StripeをAdaptyと連携して、サブスクリプション決済をシームレスに処理しましょう。"
---

Adaptyは、[Stripe](https://stripe.com/)を通じたウェブ決済・サブスクリプションを追跡することで、web2appのサブスクリプションフローをサポートしています。

この連携は、ウェブ起点の購入（Stripe Checkout、ホスト型決済ページ、またはカスタムウェブフロー）に対応しており、モバイルアプリのアクセスやアナリティクスと同期します。

以下のようなシナリオで役立ちます：

- ウェブで購入した後にアプリをインストールしてログインしたユーザーに、有料機能へのアクセスを自動的に付与する
- コホート、予測、その他のアナリティクスツールを含む、すべてのサブスクリプションアナリティクスをAdapty ダッシュボード一か所で管理する

ウェブ購入はアプリにとってますます一般的になりつつありますが、Apple App Storeがアプリ内課金以外のシステムを許可しているのはアメリカ国内のデジタルコンテンツに限られています。他の国でウェブサブスクリプションをアプリ内で宣伝しないようにしてください。違反するとアプリが審査で却下されたり、BANされる可能性があります。

以下の手順でStripe連携を設定します。

:::important
この連携は、Stripeのウェブ購入の追跡と同期を目的としています。アプリからウェブチェックアウトにユーザーを誘導する場合は、[ウェブペイウォール](web-paywall)をご覧ください。
:::

## 1\. StripeをAdaptyに接続する \{#1-connect-stripe-to-adapty\}

この連携は主に、AdaptyがWebhook経由でStripeからサブスクリプションデータを取得することで機能します。そのため、APIキーを提供し、AdaptyのWebhook URLをStripeに設定することで、AdaptyアカウントとStripeアカウントを接続する必要があります。Webhookのセットアップをできるだけラクにするために、StripeにAdatyアプリをインストールしてください：

:::note
以下の手順はStripeのProductionモードとTestモードで共通ですが、それぞれ異なるAPIキーを使用する必要があります。
:::

0. テストモードとライブモードのどちらでStripeを接続するかを決めます。最初にテストモードで設定する場合は、後でライブモードでも同じ手順を繰り返す必要があります。

1. [Stripe App Marketplace](https://marketplace.stripe.com/apps/adapty)にアクセスしてAdatyアプリをインストールします。サンドボックスモードではアプリのインストールに対応していないため、本番環境またはテストモードでのみ実行できます。

      <img src="/assets/shared/img/stripe1.png"/>

2. アプリに必要な権限を付与します。これにより、Adaptyがサブスクリプションデータと履歴にアクセスできるようになります。その後、**Continue to app settings** をクリックして続行します。

権限ポップアップの下部で、ライブモードまたはテストモードのどちらでアプリをインストールするかを選択できます。

      <img src="/assets/shared/img/stripe2.png"/>

3. ポップアップで新しい制限付きキーを生成します。メール、Touch ID、またはセキュリティキーを使って本人確認が必要です。キーを生成した後は再度確認できないため、パスワードマネージャーや秘密管理ストアに安全に保存してください。

      <img src="/assets/shared/img/stripe4.png"/>

4. ポップアップから生成されたキーをコピーし、Adaptyの[App Settings → Stripe](https://app.adapty.io/settings/stripe)に移動します。モードに合わせて **Stripe App Restricted API Key** セクションにキーを貼り付けます。テストモードとライブモードでは異なるキーを生成する必要があることに注意してください。

      <img src="/assets/shared/img/Stripe3.png"/>

以上で完了です！次は、Stripeでプロダクトを作成してAdaptyに追加しましょう。

<Details>

<summary>非推奨のインストールフロー</summary>

1. Stripeの[Developers → API Keys](https://dashboard.stripe.com/apikeys)に移動します：

  <img src="/assets/shared/img/6549602-CleanShot_2023-12-06_at_17.29.122x.webp"
  style={{
    border: 'none', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

2. **Secret key** タイトルの横にある **Reveal live (test) key button** をクリックしてキーをコピーし、Adaptyの[App Settings → Stripe](https://app.adapty.io/settings/stripe)に移動します。ここにキーを貼り付けます：

  <img src="/assets/shared/img/2989508-CleanShot_2023-12-07_at_14.59.122x.webp"
  style={{
    border: 'none', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

3. 次に、AdaptyのStripe設定ページ下部からWebhook URLをコピーします。Stripeの[**Developers** → **Webhooks**](https://dashboard.stripe.com/webhooks)に移動し、**Add endpoint** ボタンをクリックします：

  <img src="/assets/shared/img/e7149f5-CleanShot_2023-12-07_at_17.31.392x.webp"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

4. AdaptyのWebhook URLを **Endpoint URL** フィールドに貼り付けます。次にWebhookの **Version** フィールドで **Latest API version** を選択します。その後、以下のイベントを選択します：

   - charge.refunded
   - customer.subscription.created
   - customer.subscription.deleted
   - customer.subscription.paused
   - customer.subscription.resumed
   - customer.subscription.updated
   - invoice.created
   - invoice.updated
   - payment_intent.succeeded

  <img src="/assets/shared/img/cbc5404-CleanShot_2023-12-07_at_17.36.232x.webp"
  style={{
    border: 'none', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

5. "Add endpoint" を押し、"Signing secret" の下にある "Reveal" を押します。これはAdapty側でWebhookデータを復号するために使用されるキーです。表示後にコピーしてください：

  <img src="/assets/shared/img/0460cbb-CleanShot_2023-12-07_at_17.52.582x.webp"
  style={{
    border: 'none', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

6. 最後に、このキーをAdaptyの App Settings → Stripe の "Stripe Webhook Secret" に貼り付けます：

  <img src="/assets/shared/img/055db20-CleanShot_2023-12-07_at_14.56.212x.webp"
  style={{
    border: 'none', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

</Details>

## 2\. Stripeでプロダクトを作成する \{#2-create-products-on-stripe\}

:::note
テストモードで設定している場合は、この手順を続ける前にStripeもTestモードに切り替えてください。
:::

Stripeの[Product catalog](https://dashboard.stripe.com/products?active=true)にアクセスし、販売したいプロダクトと料金プランを作成します。Stripeでは1つのプロダクトに複数の料金プランを設定できるため、プロダクトを追加作成しなくてもオファーを柔軟に調整できます。

  <img src="/assets/shared/img/b202e2e-CleanShot_2023-12-06_at_15.06.262x.webp"
  style={{
    border: 'none', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

:::warning
現時点でAdaptyがサポートしているのは、**Flat rate**（例：$9.99/月）または **Package pricing**（例：$9.99/10ユニット）のみです。これらはアプリストアと同様の動作をします。**Tiered pricing**、**Usage-based fee**、**Customer chooses price** のオプションはサポートされていません。
:::

## 3\. StripeプロダクトをAdatyに追加する \{#3-add-stripe-products-to-adapty\}

:::warning

プロダクトは必須です！Adapty ダッシュボードでStripeプロダクトを作成してください。Adaptyはこれらのプロダクトに紐づいたトランザクションのイベントのみ追跡します。このステップをスキップすると、トランザクションイベントが作成されません。

:::

AdaptyではStripeをApp StoreやGoogle Playと同様に扱います。つまり、デジタルプロダクトを販売する別のストアとして設定します。設定方法も同様で、StripeプロダクトのIDを（`product_id`と`price_id`を）AdaptyのProductsセクションに追加するだけです：

  <img src="/assets/shared/img/stripe-add-product.webp"
  style={{
    border: 'none', /* border width and color */
    width: '500px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

StripeのプロダクトIDは `prod_...`、価格IDは `price_...` の形式になっています。Stripeの[Product Catalog](https://dashboard.stripe.com/products?active=true)でプロダクトを開けば、簡単に確認できます：

  <img src="/assets/shared/img/14a72d7-CleanShot_2023-12-06_at_17.32.512x.webp"
  style={{
    border: 'none', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

必要なプロダクトをすべて追加したら、次はStripeに購入者のユーザーIDを伝える設定をしましょう。これにより、AdaptyがStripeからの情報を正しく取り込めるようになります。

## 4\. ウェブ購入にユーザーIDを付加する \{#4-enrich-purchases-made-on-the-web-with-your-user-id\}

Adaptyは、アクセスレベルの付与・更新において、Stripeからのwebhookを唯一の情報源として利用しています。ただし、この連携を正しく機能させるためには、Stripe連携時にお客様側から追加情報を提供する必要があります。

プラットフォーム（ウェブまたはモバイル）を横断して一貫したアクセスレベルを維持するには、AdaptyがWebhookから認識できる単一のユーザーIDに依存する必要があります。これはユーザーのメールアドレス、電話番号、または利用している認証システムのその他のIDが使えます。

ユーザーを識別するためにどのIDを使用するかを決めてください。次に、Stripeで決済を初期化しているコード部分にアクセスし、そのユーザーIDを[Stripe Subscription](https://docs.stripe.com/api/subscriptions/object#subscription_object-metadata)（`sub_...`）または[Checkout Session](https://docs.stripe.com/api/checkout/sessions/create#create_checkout_session-metadata)オブジェクト（`ses_...`）の`metadata`に`customer_user_id`として以下のように追加してください：

```json showLineNumbers title="Stripe Metadata contents"
{'customer_user_id': "YOUR_USER_ID"}
```

コードに必要な変更はこれだけです。これにより、AdaptyはStripeから受け取ったすべてのWebhookを解析し、この`metadata`を抽出して、サブスクリプションを正しくユーザーに紐付けます。

:::warning
ユーザーIDは必須です

これがなければ、ユーザーを特定してモバイル側でアクセスレベルを付与する方法がありません。

`metadata`に`customer_user_id`を指定しない場合は、AdaptyがStripeの他の情報からIDを探すよう設定できます：StripeのCustomerオブジェクトの`email`、またはStripeのSessionの`client_reference_id`のいずれかです。

プロファイル作成の挙動の設定方法については[こちら](stripe#profile-creation-behavior)をご覧ください。
:::

:::note
StripeのCustomerも必須です

Checkout Sessionsを使用している場合は、`customer_creation`を`always`に設定して[Stripe Customerを作成する](https://docs.stripe.com/api/checkout/sessions/create#create_checkout_session-customer_creation)ようにしてください。
:::

## 5\. モバイルユーザーへのアクセス付与 \{#5-provide-access-to-users-on-the-mobile\}

ウェブから来たモバイルユーザーが有料機能にアクセスできるようにするには、前のステップで提供したのと同じ`customer_user_id`を使って`Adapty.activate()`または`Adapty.identify()`を呼び出すだけです（詳細は<InlineTooltip tooltip="ユーザーの識別">[iOS](identifying-users)、[Android](android-identifying-users)、[React Native](react-native-identifying-users)、[Flutter](flutter-identifying-users)、[Unity](unity-identifying-users)</InlineTooltip>をご覧ください）。

## 6\. 連携をテストする \{#6-test-your-integration\}

サンドボックスと本番環境の両方で上記の手順を完了したことを確認してください。StripeのTestモードで行ったトランザクションは、AdaptyではSandboxとして扱われます。

:::info
以上で完了です！

ユーザーはウェブで購入を完了し、アプリで有料機能にアクセスできるようになります。また、すべてのサブスクリプションアナリティクスを1か所で確認できます。
:::

## プロファイル作成の挙動 \{#profile-creation-behavior\}

Adaptyは購入をモバイルで利用可能にするために、[顧客プロファイル](profiles-crm)に紐付ける必要があります。そのため、デフォルトではStripeからWebhookを受信した際にプロファイルを作成します。Adaptyで顧客ユーザーIDとして使用するものを選択できます：

1. **デフォルトかつ推奨：** [上記のステップ4](stripe#4-enrich-purchases-made-on-the-web-with-your-user-id)でmetadataに指定した`customer_user_id`
2. StripeのCustomerオブジェクトの`email`（[Stripeのドキュメント](https://docs.stripe.com/api/customers/object#customer_object-email)を参照）
3. StripeのSessionオブジェクトの`client_reference_id`（[Stripeのドキュメント](https://docs.stripe.com/api/checkout/sessions/create#create_checkout_session-client_reference_id)を参照）

使用するIDは[App Settings → Stripe](https://app.adapty.io/settings/stripe)で設定できます。

:::warning
**注意：** 特定のStripeトランザクションに指定したIDが含まれていない場合、プロファイルは一切作成されません。このトランザクションは、何らかのプロファイルに紐付けられるまで匿名のままになります（例えば、後から[S2S validate](api-adapty/operations/validateStripePurchase)を使ってこのトランザクションを手動で通知した場合など）。

アナリティクスには表示されますが、プロファイルのカウントに依存するセクション（LTV、コホート、コンバージョンなど）には反映されず、イベントフィードでも確認できません。
:::

プロファイルをまったく作成しないという4つ目の選択肢もありますが、上記のアナリティクス制限があるため推奨しません。

## 現在の制限事項 \{#current-limitations\}

### アップグレード、ダウングレード、日割り計算 \{#upgrading-downgrading-and-proration\}

サブスクリプションのアップグレードやダウングレードを行うと、日割り計算による請求が発生することがあります。Adaptyはこれらの請求を収益計算に含めません。Stripeダッシュボードからこれらのオプションを手動で無効にするか、Stripe APIで`proration_behaviour`属性の値を`none`に設定して無効にすることをお勧めします。

### キャンセル \{#cancellations\}

Stripeにはサブスクリプションのキャンセルオプションが2つあります：

1. 即時キャンセル：日割り計算の有無にかかわらず、サブスクリプションが即座にキャンセルされます
2. 期間終了時のキャンセル：現在の請求期間の終了時にキャンセルされます（アプリストアのアプリ内サブスクリプションと同様）。

Adaptyはどちらのオプションにも対応していますが、即時キャンセルの場合、収益計算で日割り計算オプションは考慮されません。

### 請求の問題とグレース期間 \{#billing-issues-and-grace-period\}

顧客の支払いに問題が発生すると、Adaptyは請求問題イベントを生成し、アクセスが取り消されます。Stripeのグレース期間はまだサポートしていませんが、将来のリリースで対応予定です。

### 返金 \{#refunds\}

Adaptyが追跡するのは全額返金のみです。日割り計算による返金や部分返金は現在サポートしていません。

### トランザクションIDの一意性 \{#transaction-id-uniqueness\}

Adaptyは`store_transaction_id`と`store_original_transaction_id`を使用してプロファイルとトランザクションを照合します。これらはテスト環境と本番環境の間で**一意である必要があります**。

#### なぜ重要なのか \{#why-this-matters\}

同じトランザクションIDが両方の環境に存在すると、Adaptyはそれらを1つのトランザクションとして扱い、以下の問題が発生します：
- 本番環境の購入がテスト環境のアクセスレベルとプロダクトIDを引き継ぐ
- APIレスポンスでプロダクトIDと環境の情報が誤って表示される
- プロファイルの紐付けとサブスクリプションイベントが正しく機能しない

#### 一意性を確保する方法 \{#how-to-ensure-uniqueness\}

StripeのインボイスIDはテスト環境とライブ環境で重複する可能性があります。環境をまたいだIDの衝突を防ぐには、以下のいずれかの方法を選択してください。

#### オプション1：環境プレフィックス付きのアカウントレベルの採番 \{#option-1-account-level-numbering-with-environment-prefixes\}

各環境に対して個別にプレフィックスを設定します：

1. Stripeダッシュボードでテストモードに切り替えます。
2. [Settings → Billing → Invoices](https://dashboard.stripe.com/settings/account/?support_details=true)に移動します。
3. **Invoice numbering** を **Sequentially across your account** に設定します。
4. **Invoice prefix** を TEST-（またはテスト環境固有の任意のプレフィックス）に設定します。
5. ライブモードに切り替えて、手順2〜4を繰り返します。プレフィックスには LIVE-（またはライブ環境固有の任意のプレフィックス）を使用します。

#### オプション2：顧客レベルの採番 \{#option-2-customer-level-numbering\}

[**Stripe settings** -> **Billing** -> **Invoices** タブ](https://dashboard.stripe.com/settings/account/?support_details=true)の **Invoice numbering** を **Sequentially for each customer (customer-level)** に設定します。

上記の設定を行っても、インボイスを削除するとStripeが同じ顧客の新しいインボイスに同じIDを再利用する場合があります。インボイスはできるだけ削除しないようにすることをお勧めします。

### Stripe CheckoutまたはPayment Linksを使った買い切り購入 \{#one-time-purchases-via-stripe-checkout-or-payment-links\}

AdaptyがStripe Checkout（`mode=payment`）またはPayment Linksを通じた買い切り（非サブスクリプション）購入を追跡するのは、Stripeがその購入に対してインボイスを生成した場合のみです。デフォルトでは、Stripeは買い切りのCheckout購入に対してインボイスを作成しません。この場合、`payment_intent.succeeded`はインボイスデータなしで到達するため、Adaptyがトランザクションを記録するには不十分です。

Adaptyで買い切りCheckout購入を追跡するには、セッション作成時に[インボイスの作成を有効にして](https://docs.stripe.com/payments/checkout/receipts?payment-ui=stripe-hosted#paid-invoices-hosted)ください。これにより、Stripeがインボイスを生成し、関連する`invoice.created`および`invoice.updated`イベントを送信します。Adaptyはこれらのイベントを処理してトランザクションを記録します。

## Stripeデータをさらに活用する \{#get-more-from-your-stripe-data\}
Stripeと連携すると、Adaptyはすぐにインサイトを提供できる状態になります。Stripeデータを最大限に活用するには、追加のAdapty連携を設定してStripeのイベントを転送しましょう。これにより、すべてのサブスクリプションアナリティクスをAdapty ダッシュボード一か所に集約できます。

:::tip
アナリティクスをさらに強化するために、Stripeのmetadataに`variation_id`を含めると、購入を特定のペイウォールインスタンスに紐付けることができます。これは、特定のペイウォールの表示がコンバージョンにつながったかどうかを追跡したい場合など、自社製ウェブペイウォールの実装時に特に有用です。

`variation_id`は、Stripe Subscription（`sub_...`）とCheckout Session（`ses_...`）オブジェクトのmetadataからのみ読み取られます：

```json showLineNumbers title="Stripe Metadata with variation_id"
{
  'customer_user_id': "YOUR_USER_ID",
  'variation_id': "YOUR_VARIATION_ID"
}
```
:::

Stripeイベントの転送・分析に使用できる連携：
- [Amplitude](amplitude/)
- [Webhook](webhook)
- [Firebase](firebase-and-google-analytics)
- [Mixpanel](mixpanel)
- [Posthog](posthog)

### サポートしているStripeイベント \{#supported-stripe-events\}
Adaptyは以下のStripeイベントをサポートしています：
- charge.refunded
- customer.subscription.created
- customer.subscription.deleted
- customer.subscription.paused
- customer.subscription.resumed
- customer.subscription.updated
- invoice.created
- invoice.updated
- payment_intent.succeeded