概要:AppsFlyer Web SDK(ピクセルとも呼ばれます)をWebサイトに実装することで、ユーザーの訪問やイベントをAppsFlyerへ送信できるようになります。また、永続的なカスタマーユーザーID(CUID)を設定することで、複数プラットフォームにまたがるユーザージャーニーを統合できます。
概要
Web SDK を使用すると、訪問者がWebサイト上でどのように行動したかを記録し、その情報をAppsFlyerへ送信できます。これは40〜60KBのプラグインモジュールで、Webサイト上でのユーザー訪問やアクションをAppsFlyerプラットフォームへレポートします。
以下の手順に従って、インストールから検証、プライバシー制御まで、Web SDK の実装を完了してください。
- キーの取得:Web SDK ID(Web Dev Keyとも呼ばれます)を取得します。
- コードスニペットの選択:連携タイプとセキュリティ要件に合ったスニペットを選択します。
- Web SDKのデプロイ:ネイティブスニペット、Google Tag Manager、またはAdobe Launch Tag Managerを使用してSDKをデプロイします。
- SDKが機能していることを確認:ブラウザのデベロッパーツールでネットワークコールを確認し、SDKがリクエストを送信していることを検証します。
- イベントの設定・記録:ネイティブJavaScriptまたはGoogle Tag Managerを使用して、ページ読み込み時またはユーザー操作時にカスタムイベントを定義し、送信します。
- カスタマーユーザーIDの設定:永続的なCUIDを設定し、Web上のアクティビティを他のプラットフォームと統合します。
- プライバシー設定の管理:計測のオプトインまたはオプトアウトを管理し、セキュリティとデータフィルタリング(Content Security Policyおよびクエリパラメータの破棄)を設定します。
- Web SDK Cookieのリファレンス:Web SDKが設定または使用するCookieについて、目的、有効期間、スコープを確認します。
1. キーの取得
Web SDK ID(Web Dev Keyとも呼ばれます)を取得します。
- AppsFlyerで、上部メニューからMy Appsを開きます。
- Webアプリ(「website-」が頭に付与されたWebサイトドメイン)を選択します。
- 必要なWeb SDK IDをコピーします。
Smart Bannerのキーを取得します(必要な場合):
- AppsFlyer のサイドメニューから、Engage>Web-to-app>Smart Bannersを選択してください。
- 必要な Smart Bannerのキーをコピーしてください。
2. コードスニペットの選択
連携タイプとセキュリティ要件に合ったスニペットを選択します。利用できるオプションは2つあります。
- スタンダードWeb SDK:標準の連携方法です。
- アドバンスSDK検証:Web SDKにサプライチェーン保護を追加する、強化された連携方法です。CDNの侵害、DNSハイジャック、中間者攻撃に対するセキュリティをさらに高めるために使用します。
【重要】
スタンダードWeb SDKからアドバンスSDK検証へ移行する場合は、既存のスニペットを新しいものに置き換えてください。既存のスニペットに新しいスニペットを追加しないでください。
スタンダードWeb SDK
標準のWeb SDK連携を導入する場合は、このスニペットを使用します。SDKを読み込みたいすべてのページで、タグの上部付近に貼り付けてください。
Smart Bannersを使用しない場合
<script>
// Queue — buffers AF() calls until the SDK is ready
window.AppsFlyerSdkObject = "AF";
window.AF = window.AF || function() {
(window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
};
window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" } };
window.AF.plugins = {};
// Inject SDK
var o = document.createElement("script"),
p = document.getElementsByTagName("script")[0];
o.async = 1;
o.src = "https://websdk.appsflyersdk.com?" + "st=pba&af_id=WEB_DEV_KEY";
p.parentNode.insertBefore(o, p);
</script>Smart Bannersを使用する場合
<script>
// Queue — buffers AF() calls until the SDK is ready
window.AppsFlyerSdkObject = "AF";
window.AF = window.AF || function() {
(window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
};
window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" }, banners: { key: "YOUR_BANNER_KEY" } };
window.AF.plugins = {};
// Inject SDK
var o = document.createElement("script"),
p = document.getElementsByTagName("script")[0];
o.async = 1;
o.src = "https://websdk.appsflyersdk.com?" + "st=pba,banners&af_id=WEB_DEV_KEY";
p.parentNode.insertBefore(o, p);
AF('banners', 'showBanner');
</script>アドバンスSDK検証
アドバンスSDK検証は、Web SDKにサプライチェーン保護を追加する仕組みです。ユーザーのブラウザで実行されるコードが、AppsFlyerによって公開されたコードそのものであることを保証します。SDKのソースコード自体はスタンダード連携と同一であり、異なるのは配信および検証の仕組みのみです。
アドバンスSDK検証の特徴は以下の通りです:
- CDN改ざん、DNSハイジャック、中間者攻撃(MITM)に対する追加のセキュリティレイヤーを提供
- SDKの読み込み時間が約250ms増加
アドバンスSDK検証は任意機能です。スタンダードな連携も引き続き完全にサポートされており、サードパーティ分析ピクセルにおける一般的な実装方式となっています。アドバンスSDK検証はそれに対して更に追加の保護レイヤーを提供します。
Webサイトでnonceを使用したContent Security Policy(CSP)を適用している場合は、「プライバシー管理」セクション内の「Content Security Policy(CSP)」を参照し、このスニペットのnonce対応版を使用してください。
Smart Bannersを使用しない場合
<script>
// Queue — buffers AF() calls until the SDK is ready
window.AppsFlyerSdkObject = "AF";
window.AF = window.AF || function() {
(window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
};
window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" } };
window.AF.plugins = {};
// Manifest loader config
window.AF_LOADER_CONFIG = {
baseUrl: "https://websdk.appsflyersdk.com",
plugins: ["pba"]
};
// Inject manifest loader
var loaderScript = document.createElement("script");
loaderScript.src = "https://websdk.appsflyersdk.com/manifestLoader.v1.js";
loaderScript.integrity = "sha384-Uncl2YwvjFpFz0PwEfl3bL/0JsOQcDFEpwXHzcN0MBavn9vvFEx5pZxADTq8h+CV";
loaderScript.crossOrigin = "anonymous";
loaderScript.async = true;
document.head.appendChild(loaderScript);
</script>Smart Bannersを使用する場合
<script>
// Queue — buffers AF() calls until the SDK is ready
window.AppsFlyerSdkObject = "AF";
window.AF = window.AF || function() {
(window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
};
window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" }, banners: { key: "YOUR_BANNER_KEY" } };
window.AF.plugins = {};
// Manifest loader config
window.AF_LOADER_CONFIG = {
baseUrl: "https://websdk.appsflyersdk.com",
plugins: ["banners", "pba"]
};
// Inject manifest loader
var loaderScript = document.createElement("script");
loaderScript.src = "https://websdk.appsflyersdk.com/manifestLoader.v1.js";
loaderScript.integrity = "sha384-Uncl2YwvjFpFz0PwEfl3bL/0JsOQcDFEpwXHzcN0MBavn9vvFEx5pZxADTq8h+CV";
loaderScript.crossOrigin = "anonymous";
loaderScript.async = true;
document.head.appendChild(loaderScript);
</script>3. スニペットのデプロイ
手順2で選択したスニペットを、以下いずれかの方法でデプロイします。SDKがページごとに1回だけ読み込まれるよう設定してください。
選択肢 A:Webサイトに直接追加する
すべてのページで以下を実施します:
- 手順2のスニペット内にある
WEB_DEV_KEYを、ご利用のWeb SDK IDに置き換えます(必要に応じてYOUR_BANNER_KEYも置き換えます)。 - スニペットをWebサイトの
タグ上部付近に貼り付けます。
選択肢 B:Google Tag Manager(GTM)経由でデプロイする
SDKがページごとに1回のみ読み込まれるように設定し、GTMの優先度設定を利用して、ページ読み込み直後に実行されるようにしてください。
- Google Tag Managerを開きます。
- AppsFlyer Web SDK用の新しいタグを作成します。
- タグタイプで「Custom HTML」を選択します。
- タグ名をわかりやすい名前に設定します。
- 「Tag Configuration」に、手順2のスニペットを貼り付けます。
- 保存をクリックします。
- トリガーを追加する:
- すべてのページで実行する場合:
- [トリガーの追加] をクリックします。
- [すべてのページ] を選択してください。
- 保存をクリックします。
- タグ名を入力し、[保存]をクリックします。
- 特定ページのみで実行する場合:
- [タグを保存] をクリックします。
- GTMメイン画面で「トリガー」を選択し、「New(新規作成)」をクリックします。
- ペンのアイコンをクリックしてください。
- トリガータイプとして「ページビュー(Page View)」を選択します。
- [Some Page Views](一部ページビュー)を選択します。
- 必要に応じてページ条件とトリガー条件を設定します。
- 保存をクリックします。
- 作成したトリガーをAppsFlyer Web SDKタグに関連付ける
- GTMのメイン画面で「Tags」を選択します。
- 以前に作成したタグを選択してください。
- トリガーパネル内のペンアイコンをクリックします。
- 前に作成したページビュートリガーを選択してください。
- 保存をクリックします。
- すべてのページで実行する場合:
注意
GTMのCustom Templatesは、アドバンスSDK検証ではサポートされていません。これは、Custom Templatesのサンドボックス環境では、検証に必要な integrity 属性を設定できないためです。代わりに、Custom HTMLのタグタイプを使用してください。
選択肢 C:Adobe Launch Tag Manager経由でデプロイする
Adobe Experience Cloudでプロパティを作成する
- Adobe Experience Cloud > Launch へ移動してください。
- Adobe Experience Cloud Launch の下にある Go to Launch をクリックします 。
- [New Property](新しいプロパティ)をクリックします。
- プロパティに名前を付けてください。
- Platform の下にある、 Web を選択します。
- Webサイトのドメインを入力してください。
- 保存をクリックします。
Adobe Launchプロパティにスニペットを追加する
- My web property ページで、Rulesタブを選択します。
- ルールに名前を付けます。推奨名:Load web SDK
-
If セクションで、Eventsの下にある +Add をクリックしてください。
- Event Type にある Core - DOM Ready を選択します
- Keep Changes(変更を保存)をクリックします。
-
Then セクションで、Actions の下にある +Add をクリックしてください。
- アクションの種類でカスタムコードを選択します。
- 「JavaScript」>「エディタを開く」を選択し、手順2のスニペットを貼り付けます(ラッパー行は含めないでください)。
- [Keep Changes](変更を保存)をクリックして、コードエディターを閉じます。
- 保存をクリックします。
Adobe LaunchタグをWebサイトに追加する
- [My web property] ページで、[Environments] タブを選択します。
- 公開したい環境(developmentまたはproduction)の行を探します。
- 「Install」列の該当行にあるボックスアイコンをクリックします。
- 「Web Install Instructions」ダイアログで、スクリプトコードスニペットをコピーし、ダイアログを閉じます。
- コピーしたコードスニペットをWebサイトの <head> セクションに貼り付けます。
Adobe Launch環境を公開する
- [My web property] ページで、[Publishing] タブに移動します。
- [Development]セクションの、[Add New Library] をクリックします。
- ライブラリに名前を付けて、環境を選択します。
- Resource Changes の下にある Add a Resource をクリックしてください。
- Rules > Load web SDK > Latest > Select & Create a New Revision をクリックします。
- 保存をクリックします。
-
Developmentのセクションで実施する操作:
- 新しく作成したライブラリ横のアクションメニュー(3点アイコン)をクリックし、「Build for Development」を選択します。
- 再度アクションメニューをクリックし、「Submit for Approval」を選択します。
-
Submittedのセクションで実施する操作:
- アクションメニューをクリックし、「Build for Staging」を選択します。
- 再度アクションメニューをクリックし、「Approve for Publishing」を選択します。
-
Approvedのセクションで実施する操作:
- アクションメニューをクリックし、「Build & Publish to Production」を選択します。
2. SDKが正しく動作していることを確認する
インストール後、ブラウザのデベロッパーツールでネットワークリクエストを確認し、SDKが正常にリクエストを送信していることを検証してください。
SDKが正しく動作していることを確認するには、以下の手順を実施します:
- Webサイトを開いてください。
- デベロッパーコンソールを開きます。
- (A)「Network」タブを開きます。
- ページを再読み込みします。
- (B)
appsflyerでフィルタリングします。以下2種類のリクエストが表示される場合があります:-
SDK loader — リクエストURLが
https://websdk.appsflyersdk.comで始まります。これは、SDKスクリプトが正しく読み込まれていることを示します。 -
Event data — リクエストURLが
https://wa.appsflyer.com/eventsで始まります。これは、SDKがイベントデータをAppsFlyerへ送信していることを示します。
-
SDK loader — リクエストURLが
- (C)eventsメッセージ(
wa.appsflyer.comのコール)を選択します。 - 「Headers」タブで、(D)以下を確認します。
- Request URLが
https://wa.appsflyer.com/events?site-id=で始まっていること -
site_idクエリパラメータがWEB_SDK_KEYと一致していること - ステータスコードが 200 であること
- Request URLが
-
site_idが、AppsFlyer > 上部メニュー > My Apps に表示されているWEB_SDK_KEYと一致していることを確認します。 - SDKが1回だけ読み込まれていることを確認してください。SDKが複数回読み込まれると、正常に動作しなくなる可能性があります。
3. イベントの設定・記録
Web SDKの初期化後は、単なる訪問計測から、特定のユーザーアクションの計測へ移行できます。このセクションでは、購入や会員登録などのカスタムイベントを定義・記録する方法を、ネイティブJavaScriptまたはGoogle Tag Managerを用いて説明します。
イベントを設定する
イベントはWeb計測の基本要素であり、ビジネス上価値のある特定のユーザーアクションを表します。これらのユーザー行動を計測するには、各イベントのロジックとパラメータを定義し、収益情報やカスタムメタデータなどの適切なイベントパラメータをAppsFlyerプラットフォームへ送信する必要があります。
購入イベントと関連収益を含むイベント例
AF('pba', 'event', {eventType: 'EVENT', eventName: 'purchase', eventRevenue: 12, eventValue: {"key1": 123, "key2": "name"}});
Web SDKのイベントパラメータ一覧
| パラメーター名 | 必須 | 説明 |
|---|---|---|
eventType |
必須 | イベントタイプ。形式:String常に EVENT を設定してください。例: eventType: "EVENT"
|
eventName |
必須 | イベント名。形式:String例:Purchase, Subscription |
eventRevenue |
任意 | コンバージョンイベントに紐づく収益。形式:Float |
eventRevenueCurrency |
任意 | 収益通貨。3文字の ISO 4217 通貨コード。デフォルト:USD形式:String |
eventValue |
任意 | イベント内容を表すイベントパラメータの一覧。SKUや商品単価など、詳細なイベント情報を送信する際に使用します。形式:JSON例:{"sku": "ABC123", "color": "blue", "unit_price": 3.99, "currency": "USD"} (制限:文字数は1000文字まで。超過した場合は切り捨てられます。) |
ページ読み込み時にイベントを記録する
これは、Thank Youページや確認ページなど、リダイレクトで完了するコンバージョンを計測する際の一般的な実装方法です。
このトリガーは、ネイティブJavaScriptでwindowロードメソッドを追加する方法、またはGoogle Tag Managerでページビュートリガーを設定する方法のいずれかで実装できます。
注意
以下のコード例はあくまで参考例です。そのまま使用せず、必ずご利用サイトの構成に合わせて調整してください。
例:AF Web SDKを使用してイベントを記録する
この方法は、ニュースレター登録後のThank Youページなど、リダイレクトを伴うコンバージョン計測に適しています。
ユースケース:ユーザーがニュースレター登録を完了し、確認ページへリダイレクトされ、確認ページが表示されたタイミングでsubscriptionイベントを記録したい場合。
ネイティブページロードの例:
window.onload = function(){
AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category': 'holiday_promotion'}, eventName: 'subscription'});
}
動作概要:
- ページが必要なコンテンツを読み込みます。
- windowが完全に読み込まれると(
window.onload)、スクリプトが自動的にAF()メソッドを呼び出します。 - subscriptionイベントと関連メタデータ(categoryおよびlabel)が、AppsFlyerへ直接送信されます。
例:GTM経由でイベントを記録する
この方法では、「Thank You」ページが読み込まれたタイミングでタグを発火させることで、ニュースレター登録などの完了済みコンバージョンを記録します。
1. Thank Youページを設定する
以下のHTML構造ではGTMを読み込み、GTM経由でWeb SDKを読み込みます。また、関数やlocalStorageを使って、GTMで利用できるデータを用意する方法も示しています。
<html>
<head>
<script>
// Google Tag Manager loads the Web SDK
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXX');
</script>
<script>
function getResponseFromServer() {
return JSON.stringify({ action: 'subscribe', category: 'site actions', label: userEmail })
}
localStorage.setItem('data', JSON.stringify({ action: 'subscribe', category: 'site actions', label: 'user@email.com' }));
</script>
</head>
<body>
<h1>Thank You for Subscribing to Our Newsletter</h1>
</body>
</html>
2. GTMタグを設定する
- GTMで新しいタグを作成し、タグタイプとして「Custom HTML」を選択します。
- その際、わかりやすい名前を付けてください。(例:「AF Subscription Event」など)
-
HTMLのテキストエリアに、以下のスクリプトを貼り付けます。
AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category' : 'holiday_promotion'}, eventName: 'subscription'}); - 「Advanced Settings」>「Tag Sequencing」を展開し、メインのWeb SDK初期化タグの後に発火するよう設定されていることを確認してください。
- このタグが「Thank You」ページのPage Viewで発火するよう、トリガーを設定してください。
ユーザー操作時にイベントを記録する
ページを再読み込みせずに発生するアクション(ボタンクリック、ダウンロード、カート追加など)を計測する場合に使用します。
通常、このような操作は、ネイティブHTML要素にクリックリスナーを紐づける方法、またはGoogle Tag Managerの変数を使って特定の要素IDやCSSセレクタを識別・計測する方法で処理します。
注意
以下のコード例はあくまで参考例です。そのまま使用せず、必ずご利用サイトの構成に合わせて調整してください。
例:AF Web SDKを使用してイベントを記録する
このメソッドは、[チェックアウト]ボタンや[ダウンロード]ボタンのクリックなど、ユーザーがページ上で行う特定のアクションを追跡する場合に使用します。
ユースケース:ECサイトを運営しており、ユーザーがショッピングカート内のCheckoutボタンをクリックした瞬間に、checkoutイベントを取得したい場合。
ネイティブユーザー操作の例:
<html>
<head>
<script>
window.onload = function () {
document.getElementById('checkout').addEventListener('click', function () {
AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category' : 'holiday_promotion'}, eventName: 'checkout'});
});
}
</script>
</head>
<body>
<h1>Shopping Cart</h1>
<button id='checkout'>Checkout</button>
</body>
</html>
動作概要:
- ページが読み込まれると、スクリプトは
checkoutというIDを持つ要素にクリックイベントリスナーを設定します。 - ユーザーがボタンをクリックすると、コールバック関数が実行されます。
- この関数では、
localStorageなどから関連データを取得し、AF()メソッドに渡すことができます。 - その後、SDKがcheckoutイベントをAppsFlyerプラットフォームへ送信します。
例:GTM経由でイベントを記録する
この方法では、GTMの組み込み変数とトリガーを使用して、Checkoutボタンのクリックなどの特定アクションを取得します。
1. checkoutページの設定
<html>
<head>
<script>
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXX');
</script>
</head>
<body>
<h1>Shopping Cart</h1>
<button id='checkout'>Checkout</button>
</body>
</html>
2. GTM変数とトリガーの設定
- GTMで「Variables」>「Configure」をクリックし、Built-In Variablesリストで「Click Element」を有効にします。
- 新しいユーザー定義変数(タイプ:All Elements)を作成します。
- 新しいトリガーを作成します。
- トリガータイプ:Click - All Elements
- トリガーの発火ポイント:Some Clicks
- 条件:Click Elementが CSS Selector
#checkoutと一致した場合
3. インタラクションタグを作成する
- checkoutアクション用に、新しいCustom HTMLタグを作成します。
-
以下のインタラクションスクリプトを貼り付けます。
<script> AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category' : 'holiday_promotion'}, eventName: 'checkout'}); </script> - 前の手順で作成した「Checkout Click」トリガーを割り当てます。
イベント実装のベストプラクティス
データの正確性と正常な送信を担保するため、以下の技術要件を確認してください。
- 読み込み順序:イベント呼び出しが行われる前に、Web SDKの関数タグがページスコープ内で完全に読み込まれていることを確認してください。
-
データ形式:イベント値には特殊文字を含めないでください。たとえば、収益には通貨記号を含めず、数値で指定してください(
$10.50ではなく10.50を使用します)。 -
文字数制限:
event_valueの文字列は簡潔にしてください。4000文字を超える値は切り捨てられます。
4. カスタマーユーザーIDの設定
イベント計測の実装後は、setCustomerUserId を使用して永続的なユーザーIDを設定します。これにより、Web上のアクティビティを他のプラットフォーム(モバイル、PC、CTV)と紐づけ、プラットフォームをまたいだユーザージャーニーを統合的に把握できます。
重要なルール
-
一貫性:モバイルアプリ実装で使用しているCUIDと同じ値を使用してください(iOS、Android、Unityのモバイル向け
setCustomerUserIdを参照してください)。 - タイミング:CUIDは任意のタイミングで送信できます(例:ログイン後、サインアップ後など)が、CUIDを取得でき次第、できるだけ早い段階で設定してください。多くの場合、ユーザーがログインまたはサインアップによって識別されるまで待つ必要があります。
-
シンタックス:値は文字列として送信してください(引用符で囲みます)。例:
AF('pba', 'setCustomerUserId', '663274') - プライバシー:メールアドレスや電話番号など、個人を特定できる情報(PII)は含めないでください。
例:サインアップ後にCUIDを設定する(ネイティブ)
これらの例で提供されているコードは参照専用です。このコードをそのまま使用しないでください。このコードの使用方法が不明な場合は、Web開発者に相談してください。
前提条件:イベント送信前にWeb SDKがページ上で読み込まれていること。SDKを再度読み込まないでください。
ユーザーシナリオ:
- ユーザーがWebサイトでサインアップします。
- Webサイト側のコードがユーザー情報を取得し、サーバーへ送信します。
- サーバーがユーザーに対して一意のCUIDを生成します。
- サインアップ後のThank Youページで、新しいCUIDをサーバーに問い合わせます。
- サーバーからのレスポンスを使用し、Web SDKの
setCustomerUserId()メソッドでAppsFlyerのCUIDを設定します。
サインアップフォームの例
以下は、シンプルなサインアップフォームのコード例です。フォーム送信時にメールアドレスを localStorage に保存します。ユーザーがThank Youページに到達すると、そのメールアドレスがサーバーへ送信され、該当メールアドレスに対応する一意のCUIDを取得します。
<html>
<head>
<script>
!function(t,e,n,s,a,c,i,o,p){t.AppsFlyerSdkObject=a,t.AF=t.AF||function(){
(t.AF.q=t.AF.q||[]).push([Date.now()].concat(Array.prototype.slice.call(arguments)))},
t.AF.id=t.AF.id||i,t.AF.plugins={},o=e.createElement(n),p=e.getElementsByTagName(n)[0],o.async=1,
o.src="https://websdk.appsflyersdk.com?"+(c.length>0?"st="+c.split(",").sort().join(",")+"&":"")+(i.length>0?"af_id="+i:""),
p.parentNode.insertBefore(o,p)}(window,document,"script",0,"AF","pba",{pba: {webAppId: "WEB_DEV_KEY"}})
</script>
<script>
function storeUserEmail() {
var userEmail = document.getElementById('email').value;
localStorage.setItem('user_email', userEmail);
}
</script>
</head>
<body>
<h1>Sign Up</h1>
<form onsubmit="storeUserEmail()" action="/signup" method="post">
<div><label>Name</label><input type="text" name="name" id="name"></div>
<br/>
<div><label>Email</label><input type="email" name="email" id="email"></div>
<br/>
<input type="submit" id="submit">
</form>
</body>
</html>
Thank Youページの例
このコードではFetch APIを使用します。ユーザーが入力したメールアドレスをサーバーへ送信します。サインアップ時にサーバー側で一意のCUIDを持つユーザーが作成される前提で、メールアドレスをサーバーへ送信すると、一意のCUIDが返されます。サーバーから返された一意のCUIDが、setCustomerUserId メソッドに渡される値になります。
<html>
<head>
<script>
!function(t,e,n,s,a,c,i,o,p){t.AppsFlyerSdkObject=a,t.AF=t.AF||function(){
(t.AF.q=t.AF.q||[]).push([Date.now()].concat(Array.prototype.slice.call(arguments)))},
t.AF.id=t.AF.id||i,t.AF.plugins={},o=e.createElement(n),p=e.getElementsByTagName(n)[0],o.async=1,
o.src="https://websdk.appsflyersdk.com?"+(c.length>0?"st="+c.split(",").sort().join(",")+"&":"")+(i.length>0?"af_id="+i:""),
p.parentNode.insertBefore(o,p)}(window,document,"script",0,"AF","pba",{pba: {webAppId: "WEB_DEV_KEY"}})
</script>
<script>
window.onload = function () {
var userEmail = localStorage.getItem('user_email');
fetch('users/' + userEmail).then(function (res) {
res.text().then(function (id) {
console.log(id);
AF('pba', 'setCustomerUserId', id);
});
});
}
</script>
</head>
<body>
<h1>Thank You for Signing Up!</h1>
</body>
</html>
例:サインアップ後にCUIDを設定する(Google Tag Manager)
-
サインアップページを設定します。
以下のコード例は、シンプルなサインアップフォームです。フォーム送信時にメールアドレスを
localStorageに保存します。ユーザーがThank Youページに到達すると、そのメールアドレスがサーバーへ送信され、該当メールアドレスに対応する一意のCUIDを取得します。<html> <head> <script> (function (w, d, s, l, i) { w[l] = w[l] || []; w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' }); var f = d.getElementsByTagName(s)[0], j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); })(window, document, 'script', 'dataLayer', 'GTM-5VJ6C7R'); function storeUserEmail() { var userEmail = document.getElementById('email').value; localStorage.setItem('user_email', userEmail); } </script> </head> <body> <h1>Sign Up</h1> <form onsubmit="storeUserEmail()" action="/signup" method="post"> <div><label>Name</label><input type="text" name="name" id="name"></div> <br /> <div><label>Email</label><input type="email" name="email" id="email"></div> <br /> <input type="submit" id="submit"> </form> </body> </html> -
サインアップしたユーザー向けのThank Youページを設定します。以下のコードは、GTMトリガーを含むThank Youページの例です。サインアップフォームでユーザーが入力したメールアドレスをサーバーへ送信します。サインアップ時にサーバー側で一意のCUIDを持つユーザーが作成される前提で、メールアドレスをサーバーへ送信すると、一意のCUIDが返されます。サーバーから返された一意のCUIDは、
setCustomerUserId()メソッドを使用して送信されます。<script> window.onload = function () { var userEmail = localStorage.getItem('user_email'); fetch('users/' + userEmail).then(function (res) { res.text().then(function (id) { console.log(id); AF('pba', 'setCustomerUserId', id); }); }); } </script> -
Thank Youページの読み込み後にサブスクリプションをアトリビューションするため、新しいタグを追加します。
-
タグにわかりやすい名前を付け、タグタイプとして「Custom HTML」を選択します。
<script> var userEmail = localStorage.getItem('user_email'); fetch('users/' + userEmail).then(function (res) { res.text().then(function (id) { console.log(id); AF('pba', 'setCustomerUserId', id); }); }); </script> -
テキストエリア下部の「Advanced Settings」を展開し、続いて「Tag Sequencing」を開きます。タグの実行後にコンバージョンが発火するよう設定されていることを確認してください。
-
コンバージョンタグをいつ発火させるかを指定するため、コンバージョンタグにトリガーを設定します(以下の例では、「Thank you」ページの読み込み時に発火します)。
5. プライバシーの管理
イベント計測の実装後は、組織や地域の基準に準拠するため、特定のセキュリティ・プライバシー制御を適用する必要がある場合があります。
イベント送信をオプトイン/オプトアウトする
計測は以下2つの方法で制御できます。
SDKの初期状態設定(スニペット内)
Webページ初回読み込み時に、SDKがイベント送信を開始するか、明示的な指示があるまで待機するかを定義します。この設定はWebスニペット内で指定します。
- イベント送信を有効化:
{pba: {webAppId: "...", measurementStatus:true}} - イベント送信を無効化:
{pba: {webAppId: "...", measurementStatus:false}}
注意
measurementStatus が空、または NULL の場合、AppsFlyerは measurementStatus:true として扱います。
明示的な制御
明示的な制御は初期状態設定より優先され、永続的なファーストパーティCookieを使用します:
- Webサイトドメイン上に設定されます。
- Cookieの有効期限は、Web SDKまたはブラウザ設定に従います。
- 常にブラウザのCookie設定の影響を受けます。
コマンド
- イベント送信を開始する(オプトイン):
window.AF_SDK.PLUGINS.PBA.enableMeasurement() - イベント送信を停止する(オプトアウト):
window.AF_SDK.PLUGINS.PBA.disableMeasurement()
データを安全に管理・フィルタリングする
Webサイトで厳格なセキュリティ要件やデータプライバシー要件が求められる場合は、以下の仕組みを使用して、Web SDKが環境やデータとどのように連携するかを制御できます。
コンテンツ・セキュリティ・ポリシー(CSP)
WebサイトでCSPによるJavaScript保護を適用している場合、Web SDKはCSP設定および手順2で選択したスニペットに応じて、2種類の方法をサポートします。
-
CSPで self を使用する場合:
script-srcの許可リストにhttps://websdk.appsflyersdk.comを追加してください。これはスタンダードWeb SDKおよびアドバンスSDK検証の両方で利用できます。 -
CSPでnonceを使用する場合:ポリシーで
script-src 'nonce-...'を使用している場合は、以下のアドバンスSDK検証向けのnonce対応版スニペットを使用してください。これにより、検証プロセスで必要となる3つのscriptタグすべてにnonceが引き継がれます。{{CSP_NONCE}}を、サーバー側でリクエストごとに生成するnonce値へ置き換えてください。
以下の表は、nonce対応版スニペットと互換性のあるCSPポリシーを示しています。
| ポリシー | 動作可否 | 備考 |
|---|---|---|
script-src 'self' |
不可 | 外部CDNオリジンが許可されず、インラインスクリプトもブロックされます。 |
script-src 'self' https://websdk.appsflyersdk.com |
部分的 | ローダーおよびSDKは許可されますが、インライン設定スクリプトはブロックされます。 |
script-src 'nonce-...' https://websdk.appsflyersdk.com |
可能 | nonceによってインラインスクリプトとローダーが許可され、SDKタグにもnonceが引き継がれます。 |
script-src 'nonce-...' 'strict-dynamic' |
可能 (推奨) | nonceによってインラインスクリプトとローダーが許可され、strict-dynamic により動的に挿入されたSDKタグにも信頼が引き継がれます。許可リストへのCDNオリジン追加は不要です。 |
アドバンスSDK検証 + CSP nonce対応スニペット
Smart Bannersを使用しない場合
<script nonce="{{CSP_NONCE}}">
// Queue — buffers AF() calls until the SDK is ready
window.AppsFlyerSdkObject = "AF";
window.AF = window.AF || function() {
(window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
};
window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" } };
window.AF.plugins = {};
// Manifest loader config — nonce forwarded to the injected SDK <script> tag
window.AF_LOADER_CONFIG = {
baseUrl: "https://websdk.appsflyersdk.com",
plugins: ["pba"],
nonce: "{{CSP_NONCE}}"
};
// Inject manifest loader
var loaderScript = document.createElement("script");
loaderScript.src = "https://websdk.appsflyersdk.com/manifestLoader.v1.js";
loaderScript.integrity = "sha384-Uncl2YwvjFpFz0PwEfl3bL/0JsOQcDFEpwXHzcN0MBavn9vvFEx5pZxADTq8h+CV";
loaderScript.crossOrigin = "anonymous";
loaderScript.nonce = "{{CSP_NONCE}}";
loaderScript.async = true;
document.head.appendChild(loaderScript);
</script>Smart Bannersを使用する場合
<script nonce="{{CSP_NONCE}}">
// Queue — buffers AF() calls until the SDK is ready
window.AppsFlyerSdkObject = "AF";
window.AF = window.AF || function() {
(window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
};
window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" }, banners: { key: "YOUR_BANNER_KEY" } };
window.AF.plugins = {};
// Manifest loader config — nonce forwarded to the injected SDK <script> tag
window.AF_LOADER_CONFIG = {
baseUrl: "https://websdk.appsflyersdk.com",
plugins: ["banners", "pba"],
nonce: "{{CSP_NONCE}}"
};
// Inject manifest loader
var loaderScript = document.createElement("script");
loaderScript.src = "https://websdk.appsflyersdk.com/manifestLoader.v1.js";
loaderScript.integrity = "sha384-Uncl2YwvjFpFz0PwEfl3bL/0JsOQcDFEpwXHzcN0MBavn9vvFEx5pZxADTq8h+CV";
loaderScript.crossOrigin = "anonymous";
loaderScript.nonce = "{{CSP_NONCE}}";
loaderScript.async = true;
document.head.appendChild(loaderScript);
</script>クエリパラメータを破棄する
URLクエリパラメータに機密情報が含まれる場合、AppsFlyerに対してクエリパラメータ(URL、referrer、header_referer)を破棄するよう指示できます。
-
すべてのクエリパラメータを破棄する場合:
af_url=trueを追加 -
特定のパラメータのみを破棄する場合:
af_url_mask=paramを使用(複数のパラメータを指定する場合は;で区切る)
例:
- 元のURL:
param1=value1¶m2=value2¶m3=value3&af_url_mask=param2;param3 - 結果:
param1=value1&af_url_mask=param2;param3
Web SDK Cookieリファレンス
Web SDKは、以下のCookieを設定または使用します。
| Cookie名 | ドメイン | 有効期間 | 使用タイミング | 詳細 |
|---|---|---|---|---|
| afUserId | お客様のWebサイトのドメイン | 395日 | 非AMP(Accelerated Mobile Pages)環境 | Webページの読み込みおよびナビゲーションイベントにおいて、ユーザー識別に使用されます。 |
| AF_SYNC | お客様のWebサイトのドメイン | 1週間 | 非AMP(Accelerated Mobile Pages)環境 | 最終的なユーザー識別子が設定済みであることを示します。サイトの読み込み時間短縮に使用されます。 |
| af_id | appsflyer.com | 395日 | サードパーティCookieが許可されている非AMP環境 | アプリ起動およびナビゲーションイベントにおいて、ユーザー識別に使用されます。 |
| af_id | onelink.me | 395日 | サードパーティCookieが許可されている非AMP環境 | Link BannerやOneLink経由のエンゲージメント、またはその両方を、アプリ起動イベントへ紐づけます。 |
| amp-afUserid | AMP CDNまたはお客様のWebサイトのドメイン | 1年 | Accelerated Mobile Pages | |
| AF_DEFAULT_MEASUREMENT_STATUS | お客様のWebサイトのドメイン | 395日 | 非AMP(Accelerated Mobile Pages)環境 | 同意状態を保存します。ユーザーが同意するまでSDKの動作を停止します。デフォルトでは設定されません。同意管理(consent gating)を設定している場合のみ使用されます。 |