このガイドでは、Google Tag Manager(GTM)を使用して OneSignal Web SDK を読み込み、初期化する方法を説明します。その後、オプションで初期化後に External ID と OneSignal タグを設定できます。
前提条件
- HTTPS をサポートするサイト。
- サイトのコンテナに対して GTM で変更を公開できること。
- OneSignal の Web SDK セットアップ フローを サイトにコードを追加 まで完了していること。これにより以下が得られます:
セットアップ
1. OneSignal Web アプリをセットアップする
Web SDK セットアップ を サイトにコードを追加 まで進めます。ここで OneSignal App ID を取得します。
2. GTM 変数を作成する
タグ全体で参照する値の GTM 変数を作成します。これによりハードコーディングを避け、セットアップの保守が容易になります。
ONESIGNAL_APP_ID 変数を作成する
- GTM で、Variables > New に移動します。
- Constant を選択します。
ONESIGNAL_APP_ID という名前を付けます
- 値を OneSignal App ID に設定します。
- 保存
GTM のどこでも {{ ONESIGNAL_APP_ID }} を使用して App ID を参照できるようになりました。
ONESIGNAL_EXTERNAL_ID 変数を作成する(推奨)
ユーザーを外部識別子と関連付ける場合(たとえば、データベースまたは認証システムからのユーザー ID)、この変数を使用します。
サイトで値がどのように利用可能かに基づいて変数タイプを選択します。一般的なオプション:
- Data Layer Variable(推奨)
- First-Party Cookie
- DOM Variable(高度)
3. OneSignal init タグを作成する
- GTM で、Tags > New に移動します
- タグに名前を付けます:
OneSignal - Init
- Tag Type:Custom HTML
- 以下のコードを貼り付けます。
- Advanced Settings > Tag firing options で、Once per page に設定します。
- Triggering で、Initialization - All Pages を選択します。
<!--
OneSignal – Google Tag Manager を使用した Web SDK 初期化
このスニペット:
- OneSignal Web SDK を読み込みます
- App ID で OneSignal を初期化します
- サブスクリプションベル(notifyButton)を有効にします
ほとんどのサイトでそのまま動作します。
-->
<!-- 1. OneSignal Web SDK (v16) を読み込む -->
<!-- このスクリプトは OneSignal を利用可能にしたいすべてのページで読み込む必要があります -->
<script
src="https://cdn.onesignal.com/sdks/web/v16/OneSignalSDK.page.js"
defer>
</script>
<script>
// GTM dataLayer が存在することを確認
// ここでは「OneSignalInitialized」イベントをオプションでプッシュするためにのみ使用
window.dataLayer = window.dataLayer || [];
// OneSignalDeferred は SDK が完全に読み込まれた後に実行されるキュー
window.OneSignalDeferred = window.OneSignalDeferred || [];
// 2. SDK の準備ができたら OneSignal を初期化
window.OneSignalDeferred.push(function (OneSignal) {
OneSignal.init({
/*
必須
OneSignal App ID を GTM 変数として設定することを推奨します。
OneSignal ダッシュボードの以下で確認できます:
Settings > Keys & IDs
*/
appId: "{{ONESIGNAL_APP_ID}}",
/*
オプション – SERVICE WORKER がルートにない場合のみ必要
service worker が以下にホストされている場合:
/OneSignalSDKWorker.js
…serviceWorkerPath や serviceWorkerParam を設定すべきではありません。
service worker がサブディレクトリにホストされている場合のみ、
以下のオプションのコメントを解除して更新してください
(例:/push/onesignal/)。
*/
//serviceWorkerPath: "push/onesignal/OneSignalSDKWorker.js",
//serviceWorkerParam: { scope: "/push/onesignal/" },
/*
オプション
OneSignal サブスクリプションベル(notifyButton)を有効にします。
ユーザーが通知を購読または購読解除できるようにします。
その他のプロンプトオプションについては:https://documentation.onesignal.com/docs/en/permission-requests
*/
notifyButton: {
enable: true
}
})
.then(function () {
// OneSignal の初期化成功
console.log("[OneSignal] init success");
// 推奨:他のタグをトリガーするために GTM にイベントをプッシュ
window.dataLayer.push({
event: "OneSignalInitialized"
});
})
.catch(function (e) {
// 初期化失敗(無効な App ID、service worker の欠落など)
console.log("[OneSignal] init failed", e);
});
});
</script>
4. External ID とタグを設定する
External ID の設定はオプションですが、推奨されます。デバイス間でユーザーを識別し、バックエンドと同期できるようになります。
ONESIGNAL_EXTERNAL_ID を dataLayer にプッシュする
この例では、GTM が ONESIGNAL_EXTERNAL_ID 変数(ステップ 2 で作成)を介して読み取れるように、ユーザー ID を dataLayer にプッシュする方法を示します。
<script>
window.dataLayer = window.dataLayer || [];
// データベースまたは認証システムからユーザー ID を取得します。
// これが文字列値であることを確認してください。
var userId = "your_user_id_here";
dataLayer.push({
ONESIGNAL_EXTERNAL_ID: String(userId),
});
</script>
External ID を設定する GTM タグを作成する
タグの設定:
- タグ名:
OneSignal – Set External ID
- タグタイプ:Custom HTML
- Tag firing options:Once per page
- Trigger:
OneSignalInitialized のカスタムイベントトリガーを作成(上記の OneSignal - Init タグで設定)し、
- オプションでページ読み込み時にユーザー ID が利用可能であることがわかっている場合。
External ID を設定するために必要なメソッドは OneSignal.login(externalId) です。ここで externalId は文字列です。{{ONESIGNAL_EXTERNAL_ID}} が空(または GTM が “undefined” / “null” に置換した場合)、login 呼び出しはスキップされ、External ID は設定されません。これは一般的な GTM のタイミング問題です。
<script>
// OneSignalDeferred は OneSignal SDK の準備が整った後にこれが実行されることを保証します
window.OneSignalDeferred = window.OneSignalDeferred || [];
window.OneSignalDeferred.push(function (OneSignal) {
/*
Google Tag Manager から External ID を読み取ります。
これは GTM 変数(Data Layer Variable または Custom JS Variable)であるべきです。
*/
var externalId = "{{ONESIGNAL_EXTERNAL_ID}}";
console.log("[OneSignal] raw external ID from GTM:", externalId);
/*
基本的な検証:
- GTM は undefined/null を文字列として置換する可能性があります
- OneSignal.login は文字列を必要とします
*/
if (!externalId || externalId === "undefined" || externalId === "null") {
console.log("[OneSignal] External ID missing, skipping login");
return;
}
// External ID がクリーンな文字列であることを確認
externalId = String(externalId).trim();
console.log("[OneSignal] Calling OneSignal.login with External ID:", externalId);
/*
External ID を使用してユーザーを OneSignal にログインします。
これにより、現在のブラウザ/デバイスがこのユーザーにリンクされます。
*/
OneSignal.login(externalId)
.then(function () {
console.log("[OneSignal] External ID set successfully:", externalId);
})
.catch(function (e) {
console.log("[OneSignal] Failed to set External ID", e);
});
});
</script>
データタグを設定する
Web SDK を使用して OneSignal ユーザータグ を送信します。
タグの設定:
- 名前:
OneSignal - Add Tags
- Tag Type:Custom HTML
- Tag firing options:Once per page
- Trigger:
OneSignalInitialized、および
- タグデータが利用可能な条件(例:ログイン後、プロフィールページ、購入後)。
このコードを貼り付けて、サンプルのタグ TAG と VALUE を置き換えます。
<script>
window.OneSignalDeferred = window.OneSignalDeferred || [];
window.OneSignalDeferred.push(function (OneSignal) {
OneSignal.User.addTags({
TAG_1: "VALUE_1",
TAG_2: "VALUE_2",
});
});
</script>
ユーザーデータが利用可能な場合にのみタグを送信してください(例:ログイン後、プロフィールの読み込み後、または既知のコンバージョンイベント後)。
Consent Mode とプライバシーに関する考慮事項
サイトで Consent Mode / CMP を使用している場合、OneSignal をいつ読み込むかを決定します:
- 同意後のみ(EU / UK で一般的)、または
- 即座に(デフォルトで「機能的」ストレージが許可されている場所で一般的)。
GTM は、Consent Initialization トリガーとタグレベルの同意コントロールをサポートしており、ユーザーの同意に基づいてタグの動作を管理します。ただし、OneSignal は SDK がいつ読み込まれるかを制御するためのプライバシー同意メソッドも提供しています。
テスト
- GTM でプレビューモードを開きます。
- サイトを読み込んで確認します:
OneSignal - Init が一度発火します。
OneSignalInitialized が GTM イベントタイムラインに表示されます(イベントプッシュを保持した場合)。
- ウェブサイトに登録します。プロンプトの詳細については、Web パーミッションプロンプト を参照してください。
- OneSignal ダッシュボードで、Audience > Subscriptions に移動し確認します:
- オプトイン後にサブスクリプションが表示されること。
- External ID を設定した場合、External ID が表示されること。
- Messages > New Push からテストプッシュを送信します。
初期化が機能している場合、オプトイン後に OneSignal にサブスクリプションが表示されます。
トラブルシューティング
-
Init タグが発火するが、SDK が読み込まれない
- Content Security Policy(CSP)が
https://cdn.onesignal.com をブロックしていないか確認してください。
- 広告ブロッカー / スクリプトブロッカーを確認してください。
-
dataLayer エラー
dataLayer.push() 呼び出しの前に window.dataLayer = window.dataLayer || [] が設定されていることを確認してください。
-
重複プロンプト / 重複 SDK 読み込み
- サイトコード、CMS プラグイン、または別の GTM タグ経由で OneSignal を読み込んでいないことを確認してください。
-
Add Tags が実行されるが OneSignal に表示されない
- Trigger Group が
OneSignalInitialized を待っていることを確認してください。
- ユーザーアクショントリガーが実際に発火していることを確認してください。
- タグが有効なキー / 値のペアであり、プラン制限 内であることを確認してください。
次のステップ