アプリでサブスクリプション (定額課金など) を提供しているのであれば、AppsFlyer上でその申込 (課金) と更新を計測することが可能です。これにより、関連する収益指標、コンバージョンイベント、ROAS(広告費回収率)、ROIなどが更新されます。その結果、管理画面とレポートには、時間の経過とともにユーザーがもたらした完全な価値が反映されます。
サブスクリプションイベントの記録方法
次の表から、サブスクリプションイベントの記録方法を選択します。
項目 | サーバー間 | アプリ内イベント |
---|---|---|
アプリへの依存度 |
イベントはサーバーから送信され、アプリ起動には依存しません。 |
イベントはアプリから送信されるため、アプリが起動されている必要があります。 |
実装について |
|
|
データ精度 |
|
|
サブスクリプションユーザーの識別 |
サブスクリプションが更新された実際のユーザーを識別するために、データを相互参照する必要あり。 |
|
サーバー間 (S2S) サブスクリプションイベント
サーバー間(S2S)イベント計測を実装するには開発バックエンドにてロジックを設計する必要があります。そのバックエンドロジックがサブスクリプション (新規/更新) を管理し、必要に応じてそのイベントをAppsFlyerへ送信します。
サブスクリプション通知をサーバー間イベントでAppsFlyerに送信する
デフォルトでは、AppsFlyerはアプリストアからサブスクリプションの購入や更新の通知を受け取りません。このセクションでは、各アプリストアとのサーバー接続を設定し、サーバー間(S2S) イベントとしてAppsFlyerにサブスクリプション情報を送信する方法についてご説明します。
Androidでのサブスクリプションは、アプリまたはサーバーレベルで管理できます。アプリレベルでは、コミュニケーションはGoogle Play Billing Libraryを介して行われます。サーバーレベルでは、Google Play Developer APIを介して行われます。推奨されるサブスクリプションの管理方法は、Google Play Developer APIを介す方法です。この記事では、この方法について説明します。
ステップ1:サブスクリプションに関する通知を受信するためのサーバーエンドポイントを設定する
Google Cloudからサブスクリプションに関する通知を受信するためのサーバーエンドポイントを作成します。次に、リアルタイムディベロッパー通知を有効にします。
- サブスクリプションのステータス更新に使用するサーバー上のURLエンドポイントを決定します。例:https://myserver/subscription-notifications
- Google Cloud Platform (GCP) プロジェクトで、Cloud Pub/Subを設定します。
- Androidアプリのリアルタイムディベロッパー通知を有効にします。
ステップ2:リアルタイムのサブスクリプション通知を処理する
通知を受信するサーバーエンドポイントを設定したら、これらの通知を処理するためのロジックを記述します。デフォルトでは、Googleは subscriptionId
と purchaseToken
と一緒に Pub/Sub を通じて通知を送信します。この通知メッセージには、実際のサブスクリプションについての関連情報が含まれていません。購入トークンを取得し、Google Play Developer API の purchases.subscriptions にリクエストを送信する必要があります。
サブスクリプションの通知には次の内容が含まれています:
{
"version": string,
"packageName": string,
"eventTimeMillis": 1578509686,
"subscriptionNotification": SubscriptionNotification,
"testNotification": AppsFlyerTest
}
サブスクリプション通知には、SubscriptionNotification
というオブジェクトがあります。これには以下が含まれています。
{
"version": 1.0,
"notificationType": 4,
"purchaseToken": 0f43308f-bf3f-4fa1-8aef-d515c941334b,
"subscriptionId": 123456789
}
purchaseToken
は、Google Play Developer API の purchases.subscriptions がサブスクリプションに関するデータを取得するために必要なトークンです。
subscriptionId
は、データベースに格納する値で、これはAppsFlyer IDと紐づけるべきIDです。
ステップ3:データベース上でサブスクリプションをAppsFlyer IDとGAIDと紐づける
サブスクリプションに関するデータを受信したら、サブスクリプションIDとAppsFlyer ID、そしてGAIDと紐づける必要があります。AppsFlyer IDはサーバーを介してイベントをAppsFlyerに送信する上で必須のパラメーターです。サーバー間イベントを送る際に、GAIDを含めることを強く推奨しています。そうすることで、AppsFlyerはイベントポストバックをSRN(セルフレポーティングネットワーク)側に送ることができます。また、これによりAppsFlyerのオーディエンス機能を使用することもできるようになります。AppsFlyer IDとGAIDは、次のいずれかの方法で取得できます。
Androidのサブスクリプション計測フロー
サブスクリプション計測フローについては、次のフローチャートを参照してください。
- サブスクリプションステータスの変更に関する通知を受信。
- サブスクリプションをAppsFlyer IDとGAIDに紐づける。
- サブスクリプションに関するイベントをAppsFlyerに送信。
Apple はこのサービスを Server-to-Server notifications と呼んでいます。このサービスは、自動更新できるサブスクリプションのためにデザインされました。Apple Storeはリアルタイムでサブスクリプションステータス変更の通知を送信します。これらの通知とそのデータを使用して、サブスクリプションに関するイベントをAppsFlyerに送信できます。
ステップ1:サブスクリプションに関する通知を受信するためのサーバーエンドポイントを設定する
POSTリクエストを受信するサーバーエンドポイントを設定します。エンドポイントは次のように設定してください。
- サーバー上でApp Transport Security (ATS) をサポートします。通知を送信する前に、App Storeは ATSプロトコルを使用してサーバーと安全なネットワーク接続を確立する必要があります。詳細は、安全でないネットワーク接続の防止をご覧ください。
- サブスクリプションのステータス更新に使用するサーバー上のURLエンドポイントを決定します。例:https://myserver/subscription-notifications
- App Store Connectにて、アプリのサブスクリプションステータスURLを設定します。ガイドについては、Enable status notifications for auto-renewable subscriptions (自動更新サブスクリプションのステータス通知を有効化する) を参照してください。
ステップ2:サーバーエンドポイントをアプリに接続する
エンドポイントが設定できたら、App Store ConnectのSubscription Status URL 項目に、サーバーURLを入力します。
ステップ3:通知を受信し、データベース上でAppsFlye IDとIDFAに紐づける
これで、Appleからサブスクリプションについての通知を受信する準備ができました。次のサンプル通知を参照してください:
{
"latest_receipt": "ewoXXXXX",
"latest_receipt_info": {
"original_purchase_date_pst": "2019-07-29 21:13:18 America/Los_Angeles",
"quantity": "1",
"unique_vendor_identifier": "XXX",
"original_purchase_date_ms": "1564459998000",
"expires_date_formatted": "2019-08-06 04:13:17 Etc/GMT",
"is_in_intro_offer_period": "false",
"purchase_date_ms": "1564459997000",
"expires_date_formatted_pst": "2019-08-05 21:13:17 America/Los_Angeles",
"is_trial_period": "true",
"item_id": "1452171111",
"unique_identifier": "00000",
"original_transaction_id": "0000000",
"expires_date": "00000000",
"app_item_id": "0000000",
"transaction_id": "00000000",
"bvrs": "00000",
"web_order_line_item_id": "00000000",
"version_external_identifier": "000000",
"bid": "com.XXX",
"product_id": "XXXXX",
"purchase_date": "2019-07-30 04:13:17 Etc/GMT",
"purchase_date_pst": "2019-07-29 21:13:17 America/Los_Angeles",
"original_purchase_date": "2019-07-30 04:13:18 Etc/GMT"
},
"environment": "PROD",
"auto_renew_status": "true",
"password": "*****",
"auto_renew_product_id": "com.XXXX",
"notification_type": "INITIAL_BUY"
}
重要:
Appleのステータス更新通知からのデータには価格情報が含まれないため、開発バックエンド側でロジックを設計し、Appleからの通知サブスクリプションと課金額を一致させる必要があります。
このデータを使用して、AppsFlyerにサブスクリプションイベントに関するデータを送信します。そのためには、サブスクリプションをAppsFlyer IDとIDFAに紐づける必要があります。サーバー間イベントを送る際に、IDFAを含めることを強く推奨しています。そうすることで、AppsFlyerはイベントポストバックをSRN(セルフレポーティングネットワーク)側に送ることができます。また、これによりAppsFlyerのオーディエンス機能を使用することもできるようになります。
AppsFlyer IDとIDFAは、次のいずれかの方法で取得できます。
iOSサブスクリプション計測フロー
サブスクリプション計測フローについては、次のフローチャートを参照してください。
- サブスクリプションステータスの変更に関する通知を受信。
- サブスクリプションをAppsFlyer IDとIDFAに紐づける。
- サブスクリプションに関するイベントをAppsFlyerに送信。
AppsFlyerにイベントを送信する
この時点で、サブスクリプションステータス変更(購入、更新、キャンセル)について通知を受け取り、それをAppsFlyer IDに紐づけました。ここで、次のことを確認してください。
- サーバーがイベントに関する必要なデータを取得していること。これらのデータには、以下が含まれます:収益、サブスクリプションタイプ、サブスクリプションID (Appleからのデータでいう item_id)、AppsFlyer ID、更新時刻。推奨されるマッピング(以下のコードスニペットを参照):
- af_revenue: revenue
- af_content_type: subscription type
- af_content_id: subscription ID (Appleからのデータでいう item_id)
- renewal: true/false (サブスクリプションステータス変更に応じて)
- eventTime: サーバーに通知が届いた時刻
- イベントタイプ(購入、更新、キャンセル)に基づいて、サーバーはAppsFlyerに、すべての関連データと一緒にサブスクリプションとしてイベントを送信します。
フォーマットとイベント送信
サブスクリプションイベントのリクエスト例:
HTTP POST https://api2.appsflyer.com/inappevent/<APP_ID>
HTTP/1.1
headers:
{
authentication: '<YOUR_DEV_KEY>',
Host: 'api2.appsflyer.com',
Accept: 'application/json',
'Content-Type': 'application/json'
}
body:
{
"appsflyer_id":"<APPS_FLYER_ID>",
"customer_user_id":"123456",
"eventName":"af_subscribe",
"eventValue":"{\"af_revenue\":\"200\",\"af_content_id\":\"092\", \"af_content_type\": \"123\", \"renewal\":\"true\"}",
"eventCurrency":"USD",
"ip":"1.0.0.0",
"eventTime":"2018-07-09 4:17:00.000",
"af_events_api" :"true"
}
フォーマットとAppsFlyerへのイベント送信方法の詳細については、サーバ間(S2S)イベントの送信をご参照ください。
アプリ内サブスクリプションイベント
サブスクリプション特有の機能を有効化させるために、アプリにてサブスクリプションのステータス確認をしばしば行う必要があります。まさにこの仕組みをAppsFlyerでのサブスクリプションイベント計測に使用し、一旦アプリがサブスクリプションの申込(課金)、更新を認識すればイベントの送信が可能です。
警告
仕様上、もしもユーザーが既にサブスクリプションに申し込んでいるのにアプリを1ヶ月以上起動しなかった場合、その申し込みはイベントとして計測されなくなります。例えば、ユーザーがアプリを起動せずにWeb上でサブスクリプションに申し込んだ場合、申し込み後1ヶ月以上ユーザーがアプリを起動しなければ、そのイベントは計測されません。
アプリ内のサブスクリプションステータスの確認
サーバーと通信するか、サブスクリプションに関するデータをプッシュ通知で受け取ることで、アプリはサブスクリプションのステータスを確認することができます。
サブスクリプションのステータスをアプリ内で確認するよう設定するには、以下2つの方法があります。
- アプリ側でサブスクリプションのステータスと関連データ(有効か無効か、購読タイプ、有効期限など)を確認する。
- アプリ側で、サブスクリプションの申込み/更新に関するPush通知を受け取る。
ヒント
Android アプリ:Androidのreal-time developer notificationsを使用することで、更新状況をリアルタイムにアプリ側で受け取れます。
iOS アプリ: AppleのStore kitがpayment queue and transaction observersを提供しており、サブスクリプションの申込みと更新を確認可能です。詳細については、Appleのfinalizing transactionsに関するドキュメントを参照してください。
注意
"Receipt Validation"は、iOSアプリでのサブスクリプションの計測はサポートしていません。
サブスクリプション関連のアプリ内イベントの送信
アプリ側でサブスクリプションに関するデータを取得した際には、以下手順を実行する必要があります。
- アプリ側でそのサブスクリプションイベントが新規申込みか更新を確認。
- アプリ側で関連するデータ(課金額、content_id,、新規申込み or 更新、など)を取得。
- SDKを使用して、そのサブスクリプションイベントをAppsFlyerへ送信。
サブスクリプションイベントの例
パラメータ名 | タイプ | 値の例 | 説明 |
---|---|---|---|
af_revenue | Float | 200 | サブスクリプションに関連する収益 |
af_currency | string | USD, GBP | 通貨単位 |
af_content_id | string | 092, monthly_subscription | サブスクリプションのプラン名/コード名など |
更新 | boolean | true, false | サブスクリプションが新規購入または更新された時 |
イベントコード例
以下のコードスニペットは、SDKを使用したイベントの設定・送信方法を示しています。
Map<String, Object> eventValue = new HashMap<String, Object>();
eventValue.put(AFInAppEventParameterName.REVENUE, 200);
eventValue.put(AFInAppEventParameterName.CURRENCY, "USD");
eventValue.put(AFInAppEventParameterName.CONTENT_ID, "092");
eventValue.put("renewal", true);
AppsFlyerLib.getInstance().trackEvent(getApplicationContext(), AFInAppEventType.SUBSCRIBE, eventValue);
[[AppsFlyerTracker sharedTracker] trackEvent:(AFEventSubscribe) withValues: @{
AFEventParamRevenue: @200,
AFEventParamCurrency: @"USD",
AFEventParamContentId: @"092",
@"renewal": @TRUE
}];
AppsFlyerTracker.shared().trackEvent(AFEventSubscribe,withValues: [
AFEventParamRevenue: 200,
AFEventParamCurrency: "USD",
AFEventParamContentId: "092",
"renewal": true
]);
Dictionary<string, string> SubscriptionEvent = new Dictionary<string, string>();
SubscriptionEvent.Add("af_revenue", "200");
SubscriptionEvent.Add("af_currency", "USD");
SubscriptionEvent.Add("af_content_id", "092");
SubscriptionEvent.Add("renewal", "true");
AppsFlyer.trackRichEvent("af_subscribe", SubscriptionEvent);
注意
各サブスクリプションのイベントを個々のユーザーに結びつけることを強くお勧めします。そのためには、顧客ユーザーIDが設定されていることを確認してください。顧客ユーザーIDを設定することで、AppsFlyer上で表示されているデータと御社側の顧客を一致させることが可能です。顧客ユーザーIDを設定することで、サブスクリプション関連のイベントも含む全てのイベントが、顧客ユーザーIDと一緒に送信されるようになります。