【必読】なぜ今、Aura ではなく LWR を選ぶべきなのか?

【LWR × GA4】クリック・フォーム・滞在時間も全部計測!イベントトラッキング完全実装ガイド【応用編】

この記事はバージョン Winter ’26 において執筆しています。
現在の動作と異なる場合がありますので、ご認識おきください。

「PV(ページビュー)の計測はできた。でも、もっと深いユーザーの行動を知りたい」
Webサイト運営者なら誰もがそう思うはずです。

前回の記事では、リアルタイムのアクティブユーザー数とページビュー (PV) 数が計測できるように設定しました。

Salesforce公式ドキュメントには、PV計測以外にも以下の4つの重要なトラッキング手法(Example 2〜5)が紹介されています。

  1. クリック計測 (Example 2): どのボタンが押されたか?
  2. フォーム計測 (Example 3): どのフォームに入力や送信が行われたか?
  3. 外部リンク計測 (Example 4): どのリンクからどの外部サイトへ遷移したか?
  4. 滞在時間計測 (Example 5): どのくらいの時間ページを見ていたか?

LWRサイトでは、標準コンポーネントやLWCに備わっている「CSSクラス」機能と、トラッキングコードを組み合わせることで、これらを驚くほど簡単に実装できます。

今回は、これら4つをまとめて実装し、サイト分析レベルを一気に引き上げる手順を解説します。

Step 1: まとめてコードを実装する

まずは「監視役」となるプログラムをヘッドマークアップに追加します。 4つの機能すべてを網羅したコードを作成しました。これをそのまま貼り付けるだけで準備完了です。

  1. ビルダーの [設定] > [詳細] > [ヘッドマークアップを編集] を開きます。
  2. 基礎編(PV計測)で追加したコードの下に、以下のコードを追記してください。
クリックしてコードを見る
<x-oasis-script>
    (function() {

        // 安全策: gtag関数を安全に呼び出すためのラッパー関数
        function safeGtag(command, action, params) {
            if (typeof window.gtag === 'function') {
                window.gtag(command, action, params);
            }
        }
    
        // 設定エリア:ここで監視するクラス名を定義します
        const CONFIG = {
            clickClass: 'track-click',       // Example 2: ボタン計測用
            formClass: 'track-form',         // Example 3: フォーム計測用
            outboundClass: 'track-outbound'  // Example 4: 外部リンク計測用
        };

        // -------------------------------------------------------
        // 1. クリック計測 (Example 2 and 4)
        // -------------------------------------------------------
        document.addEventListener('click', function(event) {
            // Shadow DOMの境界を越えて、クリックされた要素の完全な経路を取得
            var path = event.composedPath();
            
            // 判定用フラグの初期化
            var linkElement = null;       // Aタグが見つかったら格納
            var hasOutboundClass = false; // クラスが見つかったらtrue

            // 経路を奥の要素から親の要素へ順番に全てチェック
            for (var i = 0; i != path.length; i++) {
                var node = path[i];

                // windowやdocumentなど、タグではないノードはスキップ
                if (!node.tagName) continue;

                // ---------------------------------------------------
                // A. 特定ボタンのクリック (Example 2) - 最優先
                // ---------------------------------------------------
                // ボタン計測クラスがあれば即座に送信して終了
                if (node.classList.contains(CONFIG.clickClass)) {
                    safeGtag('event', 'click_button', {
                        'event_category': 'engagement',
                        'event_label': node.innerText || 'Button'
                    });
                    return; // ボタン計測完了。ここで処理を終える
                }

                // ---------------------------------------------------
                // B. 外部リンクのクリック (Example 4) - 情報収集
                // ---------------------------------------------------
                
                // 1. リンクタグ(Aタグ)を見つけた場合、記録する
                if (node.tagName === 'A') {
                    linkElement = node;
                }

                // 2. 計測用クラスを見つけた場合、記録する
                // (Aタグ自身、親、子、どこにあってもここで検知されます)
                if (node.classList.contains(CONFIG.outboundClass)) {
                    hasOutboundClass = true;
                }
            }

            // ループ終了後、判定を行う
            // 「リンクタグ」かつ「計測クラス」の両方が経路内に存在した場合に送信
            if (linkElement && hasOutboundClass) {
                safeGtag('event', 'click_outbound', {
                    'event_category': 'outbound',
                    'event_label': linkElement.href
                });
            }
        });

        // -------------------------------------------------------
        // 2. フォーム操作の計測 (Example 3)
        // -------------------------------------------------------
        document.addEventListener('change', function(event) {
            var target = event.target;
            var form = target.closest('form');
            
            if (form && form.classList.contains(CONFIG.formClass)) {
                safeGtag('event', 'form_interaction', {
                    'event_category': 'form',
                    'event_label': 'Input Changed: ' + target.name
                });
            }
        });

        // -------------------------------------------------------
        // 3. 滞在時間の計測 (Example 5)
        // -------------------------------------------------------
        var startTime = new Date().getTime();
        window.addEventListener('beforeunload', function() {
            var endTime = new Date().getTime();
            var timeSpent = Math.round((endTime - startTime) / 1000); // 秒単位

            safeGtag('event', 'visit_duration', {
                'event_category': 'engagement',
                'value': timeSpent,
                'event_label': document.title
            });
        });
    })();
</x-oasis-script>

Step 2: 計測したい場所に「CSSクラス」を付ける

コードを埋め込んだだけでは、まだ計測は始まりません。 「どのボタンを計測するか?」をシステムに教えてあげる必要があります。

ここで使うのが、Step 1のコード内で定義した以下のクラス名です。

  • track-click: クリック計測用
  • track-outbound: 外部リンク計測用
  • track-form: フォーム計測用

これらを、標準コンポーネントやLWCに付与していきます。

1. 標準コンポーネントの場合(ノーコード)

ビルダーで配置した「ボタン」「HTML エティター」「フォーム」内の要素を計測する場合です。

  1. 計測したいコンポーネントをクリックして選択します。
  2. プロパティパネルの [スタイル] タブ(または [高度] タブ)を開きます。
  3. [CSS クラス] の入力欄に track-click などのクラス名を入力します。
  4. これで設定完了です。
  • クリック計測
  • 外部リンク計測
  • フォーム計測

2. LWC(カスタムコンポーネント)の場合

開発者が作成するLWCコンポーネントを計測する場合、HTMLテンプレート内で直接クラスを記述します。

A. ボタンクリックを計測したい場合 (Example 2)

<button> タグや <lightning-button> コンポーネントにクラスを追加します。

<template>
    <button class="track-click slds-button slds-button_brand" onclick={handleClick}>
        資料請求はこちら
    </button>

    <lightning-button 
        label="お問い合わせ" 
        class="track-click" 
        onclick={handleContact}>
    </lightning-button>
</template>

B. フォームを計測したい場合 (Example 3)

フォーム全体を囲むラッパー要素(divform)にクラスを付与することで、その内部の変更をまとめて検知できます。

<template>
    <div class="track-form">
        <lightning-input label="お名前" name="username"></lightning-input>
        <lightning-input label="メールアドレス" name="email"></lightning-input>
        <lightning-button label="送信" type="submit"></lightning-button>
    </div>
</template>

C. 外部リンクを計測したい場合 (Example 4)

外部サイトへ遷移する <a> タグにクラスを付与します。 lightning-button などで window.open を使う場合ではなく、HTML標準の <a> タグを使用するケースで有効です。

<template>
    <p>詳細については公式サイトをご覧ください。</p>
    
    <a href="https://www.salesforce.com" target="_blank" class="track-outbound">
        Salesforce.comへ移動
    </a>
</template>
DXforce Point for Developers

x-oasis-script 内のイベントリスナーは、Shadow DOMの境界を越えてイベントをキャッチできる仕組み(composed: true なイベントや、特権スクリプトの仕様)を利用しています。そのため、LWC内部の要素にクラスを付けるだけで、外部のスクリプトからクリックを検知可能です。

滞在時間を計測したい場合 (Example 5)

これだけは特別です。設定不要です。
Step 1のコードが入っていれば、すべてのページで自動的に滞在時間が計測され、ページ移動時や離脱時にデータが送信されます。

Step 3: Google Analytics でデータを確認する

設定が完了したら、必ずサイトを [公開] してから動作確認を行います。

確認手順

  1. 公開サイトにアクセスし、設定したボタンをクリックしたり、フォームに入力したりします。
  2. Google Analyticsの管理画面を開きます。
  3. [レポート] > [リアルタイムの概要] をクリックします。
  4. ページ下部の 「イベント数(イベント名)」 カードを確認します。

滞在時間は以下のように確認します。

  1. Google Analyticsの管理画面を開きます。
  2. [レポート] > [ビジネス目標] > [ウェブ / アプリのトラフィックの分析] > [ページとスクリーン] をクリックします。

期待される表示

正しく設定できていれば、以下のイベント名がリストに表示されます。

  • click_button > event_label : ボタンをクリックした時
  • click_outbound > event_label: 外部リンクをクリックした時
  • form_start > page_title : フォームを送信した時
  • ボタンクリック
  • 外部リンククリック
  • フォーム送信

まとめ

LWRサイトでの高度な分析は、決して難しいものではありません。

  1. ヘッドマークアップに「統合コード」を入れる。
  2. 標準コンポーネント設定、またはLWCのHTMLで「CSSクラス」を付与する。

この2ステップだけで、Salesforce公式が推奨するすべてのトラッキングパターンを網羅できます。ぜひ実装して、ユーザーの動きを解像度高く分析してみてください。

参考URL

Examples: Use Google Analytics in LWR Sites

DXforceの管理人

福島 瑛二

2013年にJavaエンジニアとしてのキャリアをスタート。2019年にSalesforceと出会い、Salesforceエンジニアの道へ。

デザインや UI/UX の観点からもシステムを捉え、ユーザーにとって心地よい体験を実装することにやりがいを感じています。

CRM(顧客データ)や Data Cloud と連携した高度なサイトを目に見える形で表現できる Experience Cloud に大きな可能性を見出しており、バックエンドのデータ構造とフロントエンドの表現力を極めることがこれからの Salesforce エンジニアに求められるスキルだと確信しています。

Trailblazer: efukushima

福島 瑛二をフォローする

読者の声

タイトルとURLをコピーしました