プロファイルの仕組み
アプリのすべてのユーザーには、購入履歴・イベント・サブスクリプションの状態を追跡するAdaptyプロファイルが割り当てられます。プロファイルがどのように作成・紐付けされるかを理解することで、インテグレーションのバグを防ぎ、データの断片化を避け、プロファイルセクションのデータを正しく解釈できます。
プロファイルの作成
Adaptyはユーザーがアプリを初めて起動したタイミングで、自動的にプロファイルを作成します。
Customer User IDがない場合、プロファイルは匿名になります。以下のタイミングで毎回新しい匿名プロファイルが作成されます:
- ユーザーがアプリを再インストールしたとき
- ユーザーがアプリからログアウトしたとき(アプリが
Adapty.logout()を呼び出したとき)
購入はアプリのインストールに紐付けられ、永続的なユーザー識別情報には紐付けられません。
Customer User IDがある場合、プロファイルは再インストールやデバイスをまたいで維持されます。Customer User IDを使うことで、次のことが可能になります:
- 再インストールや複数デバイスにまたがってユーザーを追跡できます。
- ProfilesセクションでCustomer User IDからユーザーを検索できます。
- サーバーサイドAPIでCustomer User IDを使用できます。
- AdaptyはCustomer User IDをすべてのインテグレーションに送信します。
Customer User IDを使用する場合のプロファイルの動作は、いつ設定するかによって異なります:
- SDKの初期化時:そのCustomer User IDを持つ既存のプロファイルを使用します(再訪ユーザーの場合)、または新しいプロファイルを作成します(初回ユーザーの場合)。
- SDK初期化後:初期化時に匿名プロファイルが作成されます。その後ユーザーを識別すると、AdaptyはCustomer User IDを匿名プロファイルに紐付けます(初回ユーザーの場合)、または既存のプロファイルに切り替えます(再訪ユーザーの場合)。
どちらのアプローチを使うか:
- アプリ起動時にCustomer User IDが利用可能な場合(例:前回のセッションから保存されている)— SDKの初期化時に
activate()へ渡します。 - ユーザーがアプリ起動後にサインインする場合— 認証後に
identify()を呼び出します。AdaptyはそのIDを現在のプロファイルに紐付けます(IDが新規の場合)、または既存のプロファイルに切り替えます(IDが既に存在する場合)。 - ログイン前に購入できる場合— ログイン後に
identify()を呼び出します。Customer User IDがAdaptyに既に存在する場合は、その後プロファイルを取得して現在のアクセスレベルを同期してください。
実装の詳細については、ユーザーの識別SDKガイドを参照してください。
以前にCustomer User IDなしでアプリを使用したことがある再訪ユーザーの場合、SDK初期化時に識別を開始しても、それらの匿名プロファイルは自動的にマージされません。そのようなユーザーの完全な履歴を維持するには、ログイン後にidentify()を使用してください。
親プロファイルと継承プロファイル
同じストア側のサブスクリプションが複数のAdaptyプロファイルに関連付けられている場合、Adaptyはそれらのプロファイルをチェーンとして扱います:1つの親プロファイルと、同じ購入からアクセスを共有する1つ以上の継承プロファイルです。
これは以下の場合に発生します:
- ユーザーアカウント間での有料アクセスの共有が有効で、別のプロファイルが購入したデバイスにユーザーがサインインしたとき。
- ユーザーが
customer_user_idなしでアプリを再インストールし、新しいプロファイルが前のインストールの購入を引き継いだとき。 - 異なる識別済みユーザーが同じデバイスで購入を復元したとき。
- アプリがApple Team IDを変更し、新しいアプリが旧Team IDで行われた購入を引き継いだとき。
親の決定方法。
親は最初に購入を記録したプロファイルです — プロファイルの作成順ではなく、Adaptyでの購入レシートの順序によって決定されます。例:アプリをインストールして購入せず、再インストールしてサブスクリプションを購入した場合、2番目のプロファイルが親になります(購入を行ったため)。最初のプロファイルは継承プロファイルとなり、共有によってアクセスを得ます。
イベントの分配方法:
- トランザクションイベント(購入、更新、キャンセル、請求の問題、グレース期間、返金):購入を行った親プロファイルにのみ表示されます。サブスクリプションの更新・変更はすべてこのプロファイルに表示され続けます。
access_level_updatedイベント:アクセスレベルの状態が変化するたびに、親プロファイルと継承プロファイルの両方に表示されます。これにより、紐付けられたすべてのプロファイルが現在のアクセス状態を把握できます。
親プロファイルには完全なトランザクション履歴が表示されます。継承プロファイルには、アクセスレベルの更新のみが表示され、Access levelセクションに親プロファイルへのリンクが表示されます。
複数のプロファイルにまたがる同一サブスクリプションの追跡。
各継承プロファイルは独自のprofile_idを持つため、profile_idはチェーン全体で一定ではありません。複数のプロファイルにまたがって同じサブスクリプションを特定するには(例:Webhookイベントの照合や、ダッシュボードのプロファイルと1人のユーザーの対応付け)、ストア側の識別子を使用してください。
| フィールド | 用途 |
|---|---|
store_original_transaction_id | プロファイルをまたいだサブスクリプションチェーンの識別。Appleのサブスクリプションごとに一意。 |
profiles_sharing_access_level(Webhookフィールド) | 共有が有効な場合に、そのサブスクリプションによって権限を付与されているすべてのプロファイル。 |
profile_id | クロスプロファイル追跡には不適切 — 各継承プロファイルが独自のIDを持つため。 |
プロファイルなしのトランザクション
Adaptyの一部のトランザクションはプロファイルに紐付けられていません — アナリティクスとエクスポートには表示されますが、プロファイルリストには表示されません。これは、Adapty SDKを通じてアプリに接続したことがないユーザーへのサーバー間(S2S)ストア通知が届いた場合に発生します。既知の発生源は以下の通りです:
- App Store S2S通知(返金イベントを含む)
- Google Play S2S通知
- StripeおよびPaddleのWebhookイベント
これらのトランザクションは:
- アナリティクスチャートに表示されます(全体の指標にカウントされます)
- エクスポートに表示されます(S3、GCS、BigQuery)—
profile_idはnullに設定されます - プロファイルリストには表示されません — 紐付けるプロファイルが存在しないため
アナリティクスやエクスポートで、プロファイルUIで見つけられるより多くのイベントが表示される場合、その差はおそらくこれらのプロファイルなしトランザクションによるものです。エクスポートで見つけるには、profile_id IS NULLの行でフィルタリングしてください。
ユーザーアカウント間での有料アクセスの共有
メイン記事: ユーザーアカウント間での有料アクセスの共有
アクセスレベルの共有ポリシーを設定するには、General設定ページで共有オプションを選択します。サンドボックス環境に対して別のポリシーを設定することもできます。
有効(デフォルト)
識別済みユーザー(Customer User ID を持つユーザー)は、デバイスが同じ Apple/Google ID でサインインしている場合、Adapty が提供する同じアクセスレベルを共有できます。これは、ユーザーがアプリを再インストールして別のメールアドレスでログインしても、以前の購入へのアクセスを維持できるため便利です。このオプションでは、複数の識別済みユーザーが同じアクセスレベルを共有できます。
アクセスレベルは共有されますが、過去および将来のすべてのトランザクションは、一貫したアナリティクスを維持し完全なトランザクション履歴(トライアル期間、サブスクリプション購入、更新など)を同じプロファイルに紐付けるために、元の Customer User ID のイベントとして記録されます。
新しいユーザーへのアクセス移転
識別済みユーザーは、別の Customer User ID でログインしたり、アプリを再インストールしたりしても、デバイスが同じ Apple/Google ID でサインインしている限り、Adapty が提供するアクセスレベルへのアクセスを維持できます。
前のオプションと異なり、Adapty は識別済みユーザー間で購入を移転します。これにより購入済みコンテンツへのアクセスは保証されますが、一度にアクセスできるのは 1 人のユーザーのみです。たとえば、UserA がサブスクリプションを購入し、UserB が同じデバイスでログインしてトランザクションを復元した場合、UserB がサブスクリプションへのアクセスを取得し、UserA からは取り消されます。
どちらかのユーザー(新しいユーザーまたは古いユーザー)が識別されていない場合でも、Adapty ではそれらのプロファイル間でアクセスレベルが共有されます。
アクセスレベルは移転されますが、過去および将来のすべてのトランザクションは、一貫したアナリティクスを維持し完全なトランザクション履歴(トライアル期間、サブスクリプション購入、更新など)を同じプロファイルに紐付けるために、元の Customer User ID のイベントとして記録されます。
新しいユーザーへのアクセス移転に切り替えた後、アクセスレベルはすぐにはプロファイル間で移転されません。特定のアクセスレベルの移転プロセスは、サブスクリプションの更新、復元、またはトランザクションの検証など、ストアからイベントを受信したときにのみトリガーされます。
無効
アクセスレベルを最初に取得した識別済みユーザープロファイルが、そのアクセスを永続的に保持します。ビジネスロジック上、購入を単一の Customer User ID に紐付ける必要がある場合に最適なオプションです。
なお、アクセスレベルは匿名ユーザー間では引き続き共有されます。
購入の「紐付け解除」は、オーナーのユーザープロファイルを削除することで行えます。削除後、アクセスレベルは匿名・識別済みを問わず最初にそれを要求したユーザープロファイルが利用できるようになります。
共有の無効化は新しいユーザーにのみ影響します。すでにユーザー間で共有されているサブスクリプションは、このオプションを無効にした後も引き続き共有されます。
Apple と Google は、Apple/Google ID を使って購入と関連付けるため、アプリ内課金をユーザー間で共有または移転することを要求しています。共有しない場合、その後の再インストール時に購入の復元ができない可能性があります。
共有を無効にすると、ログイン後にユーザーがアクセスを取り戻せなくなる場合があります。
共有の無効化は、購入前にユーザーが必ずログインする必要がある場合にのみ推奨します。そうでない場合、識別済みユーザーがサブスクリプションを購入後、別のアカウントにログインしてアクセスを永久に失う可能性があります。
どの設定を選べばよいですか?
| アプリの状況 | 推奨オプション |
|---|---|
| ログインシステムがなく、Adapty の匿名プロファイル ID のみを使用している。 | デフォルトのオプションを使用してください。3 つのオプションすべてで、匿名プロファイル ID 間ではアクセスレベルが常に共有されます。 |
| オプションのログインシステムがあり、アカウント作成前に購入できる。 | アカウントなしで購入したユーザーが後からトランザクションを復元できるよう、新しいユーザーへのアクセス移転を選択してください。 |
| 購入前にアカウント作成が必須だが、複数の Customer User ID への購入の紐付けを許可している。 | 一度にアクセスできる Customer User ID を 1 つに制限しながら、別の Customer User ID でログインしても有料アクセスを失わないよう、新しいユーザーへのアクセス移転を選択してください。 |
| 購入前にアカウント作成が必須で、購入を単一の Customer User ID に厳密に紐付けるルールがある。 | トランザクションがアカウント間で移転されないよう、無効を選択してください。 |
未来の日付のイベントタイムスタンプ(Apple/iOS)
この動作はApple App Storeに特有のものです。Google Playの通知システムはイベントを事前に送信しません。
プロファイルやインテグレーションのイベントタイムスタンプが未来の日付を示すことがあります。これはAppleが更新イベントを事前に送信するためです。
- 発生理由:Appleはサブスクリプションが期限切れになる前に自動更新されるようにしており、ユーザーのサービス中断を防ぐためです。詳細はAppleのデベロッパーフォーラムをご覧ください:Server Notifications for Subscriptions。
- 影響するイベントの種類:通常、サブスクリプションの更新とトライアルから有料への転換に適用されます。これらのイベントはAppleが事前に通知するため、未来のタイムスタンプを持つ場合があります。
- その他のイベントの種類:追加のアプリ内課金とサブスクリプションプランの変更は、事前に予測できないため、実際のタイムスタンプで記録されます。
- アナリティクスとイベントフィードへの影響:これらのイベントは、タイムスタンプが過ぎた後にのみAnalyticsとEvent Feedに表示されます。未来のタイムスタンプを持つイベントはどちらのセクションにも表示されません。
- インテグレーションへの影響:Adaptyはイベントを受信したらすぐにインテグレーションへ送信します。イベントが未来のタイムスタンプを持つ場合、Adaptyはその未来のタイムスタンプをそのままインテグレーションに送信します。
次のステップ
- プロファイルダッシュボードを使用してユーザーを検索・管理するには、プロファイルを参照してください。
- アプリでのユーザー識別を設定するには、ユーザーの識別SDKガイドを参照してください。
- アクセス共有ポリシーを設定するには、ユーザーアカウント間での有料アクセスの共有を参照してください。