GTMでスクロール率をGA4に計測する設定|50/75/90%とCTA実践ログ
# GTMでスクロール率をGA4に送る設定方法|50%・75%・90%計測とCTAクリックまで
GTMでスクロール率をGA4に送る設定をしておくと、記事が50%・75%・90%のどこまで読まれているかを確認できます。私は記事改善の判断に使うため、GTMでスクロール率・CTAクリック・LP到達・登録完了をGA4イベントとして送る設定を行いました。この記事では、GTMでスクロール計測を設定し、GA4で確認するまでの流れを実践ログとして整理します。
なぜスクロール率をGA4で計測する必要があるのか
記事を改善しようとしたとき、「なんとなく弱そう」という感覚でリライトしていませんか?
私もそうでした。ブログの記事数が100本を超えたタイミングで、改善に取り組もうとしたのですが、どの記事をどう直せばいいかの判断基準がありませんでした。正直なところ、数字を見ても「で、どこを直せばいいの?」となって途方に暮れていました。
アクセス数だけ見ていても、「その記事で読者がどこまで読んでいるか」は分かりません。直帰率だけでも不十分で、「冒頭で離脱しているのか」「中盤まで読んでいるのか」「最後まで読んだのにCTAを踏んでいないのか」を区別できないと、修正の方向性が絞れないからです。
そこで計測するのが、スクロール率です。
- scroll_50:記事の50%まで読まれたかどうか
- scroll_75:75%まで読まれたかどうか
- scroll_90:90%まで読まれたかどうか
この3点を取ることで、「冒頭離脱なのか」「中盤離脱なのか」「読了後に行動しないのか」を分類できます。GA4のデフォルト計測だけでは取れない粒度のデータです。
判断基準:
- スクロール率の計測設定がない → GTMで設定してから改善判断に入る
- GA4のデフォルトのみで分析している → scroll_50/75/90のカスタムイベントを追加する
ただし、このままだと計測データを使ってどの記事をどう直すかは判断できません。
なぜなら、スクロール率・直帰率・CTA率を組み合わせた修正タイプの判断基準が、まだ整理されていないからです。
→ 判断軸の整理はこちら
GTMでScroll Depthトリガーを設定する
GTMでスクロール計測を設定するには、どこから手をつければよいのでしょうか?
まずGTMの「トリガー」から新規作成を行います。トリガータイプは「スクロール距離」を選びます。
scroll_50のトリガー設定
項目 | 設定値
--- | ---
トリガー名 | Scroll Depth 50% - All Pages
トリガーのタイプ | スクロール距離
縦方向スクロール距離 | オン
割合 | 50
発生場所 | すべてのページscroll_75のトリガー設定
項目 | 設定値
--- | ---
トリガー名 | Scroll Depth 75% - All Pages
割合 | 75
その他 | scroll_50と同じscroll_90のトリガー設定
項目 | 設定値
--- | ---
トリガー名 | Scroll Depth 90% - All Pages
割合 | 90
その他 | scroll_50と同じ3本のトリガーを作成したら、次はGA4にイベントを送信するタグを作成します。
確認ポイント:
- 「すべてのページ」で発火させると管理画面もカウントされる → 記事パスに絞りたい場合は条件に
Page Path 正規表現 ^/[^/]+/$を追加する - トリガーが3本揃っているか確認する → 1本でも欠けるとデータに穴が開く
GA4イベントタグを作成してスクロールデータを送信する
トリガーができたら、GA4へイベントを送るタグを作成します。どうやってGA4と紐づければよいのでしょうか?
GTMの「タグ」から新規作成を行います。タグのタイプは「Googleアナリティクス: GA4イベント」を選びます。
scroll_50タグの設定
項目 | 設定値
--- | ---
タグ名 | GA4 Event - scroll_50
タグのタイプ | Googleアナリティクス: GA4イベント
測定ID | {{GA4測定ID}}(定数変数として設定済みのもの)
イベント名 | scroll_50
イベントパラメータ | なし
トリガー | Scroll Depth 50% - All Pagesscroll_75・scroll_90も同様に作成し、イベント名をそれぞれ scroll_75、scroll_90 にします。
ここで重要なのは、イベント名をカスタム名にすることです。GA4のデフォルトイベント名 scroll と区別するために、scroll_50 のような独自名にしておくと、Python・n8nでのデータ取得時に混在しません。
測定IDは直接入力せず、GTMの「変数」で定数として G-XXXXXXXX の形式で登録しておくことをおすすめします。後でIDを変更する場合に1か所の変更で済むからです。
設定時の注意点:
- イベント名を
scrollにしている → GA4デフォルトと混在するためscroll_50形式に変更する - 測定IDを直接入力している → 定数変数化して管理を一元化する
CTAクリック・LP到達・登録完了も計測する
スクロール率だけでは不完全です。「最後まで読んだのにCTAを踏んでいない」という状況を把握するには、CTAクリックとLP到達・登録完了も計測する必要があります。どのように設定すればよいのでしょうか?
CTAクリックの設定
まずGTMの「変数」→「設定」から組み込み変数の Click URL・Click Classes にチェックを入れます。
次にトリガーを作成します。
項目 | 設定値
--- | ---
トリガー名 | 記事下CTAクリック
トリガーのタイプ | リンクのみのクリック
条件 | Click Classes 含む swell-block-button__linkタグを作成します。
項目 | 設定値
--- | ---
タグ名 | GA4 Event - article_bottom_cta_click
イベント名 | cta_click
イベントパラメータ | cta_id: article_bottom / page_path: {{Page Path}} / link_url: {{Click URL}}
トリガー | 記事下CTAクリックcta_id パラメータを渡すことで、GA4 APIでデータを取得するときに article_bottom か top かを区別できます。
LP到達と登録完了の設定
LP(無料PDFのランディングページ)に到達したときのイベントも設定します。
LP到達タグ:
項目 | 設定値
--- | ---
タグ名 | 無料PDFのLP到達
イベント名 | view_0pdf
トリガー | ページビュー / Page URL 含む /lp/ebook-0pdf/登録完了タグ:
項目 | 設定値
--- | ---
タグ名 | GA4 Event - pdf_register_complete
イベント名 | pdf_register_complete
トリガー | ページビュー / Page URL 含む /thanks-free-pdf/登録完了ページへの到達数 ÷ LP到達数 = LP登録CVR として計算できます。これでファネル全体が可視化されます。
確認ポイント:
- CTAクリックが計測できていない → click_classesが正しいか確認する(Chromeの検証ツールで要素のclassを確認)
- 登録完了ページが存在しない → Contact Form 7などで登録後のリダイレクト先を作成する
GTMをプレビューしてGA4リアルタイムで確認する
設定が終わったら、正しく動いているか確認します。どうやって確認すればよいのでしょうか?
GTM右上の「プレビュー」をクリックし、対象サイトのURLを入力して接続します。
実際に記事ページをスクロールすると、Tag Assistantパネルの「Tags Fired」タブに各タグが表示されます。50%スクロール時に GA4 Event - scroll_50 が表示されれば正常です。
並行してGA4の管理画面 → 「レポート」→「リアルタイム」を開いておくと、scroll_50 イベントがリアルタイムで流れてくるのが確認できます。
プレビューで確認できたら「送信」→バージョン名を入力→「公開」で完了です。
確認ポイント:
- Tags Firedに表示されない → トリガーの条件とページのclass/URLが一致しているか確認する
- GA4リアルタイムに表示されない → 測定IDが正しいか・GA4タグが正常に動作しているか確認する
- プレビュー中に確認できた → そのまま公開してOK(本番データは翌日以降から溜まり始める)
計測データをPython・n8nにつなげる次のステップ
GTMの設定が完了したら、次はこのデータをどう活用するかです。計測できても使わなければ意味がないと思いませんか?
私は fetch_metrics_json.py というPythonスクリプトでGA4 APIからデータを取得し、performance_cache.json に保存する設計にしています。
スクリプト内では以下のGA4イベントを取得しています。
※以下は全体コードではなく、GA4 APIでscroll_50/75/90を取得している処理の抜粋です。
# スクロールイベントをイベント名で個別取得
for event_name, key in [
("scroll_50", "ga4_scroll_50"),
("scroll_75", "ga4_scroll_75"),
("scroll_90", "ga4_scroll_90"),
]:
# pagePath と eventName で絞って eventCount を取得
sc_req = RunReportRequest(
property=f"properties/{GA4_PROPERTY_ID}",
dimensions=[Dimension(name="pagePath")],
metrics=[Metric(name="eventCount")],
...
)取得したデータはn8nのワークフローで読み込まれ、直帰率・スクロール率・CTA率をもとにリライト優先度を自動判定します。
performance_cache.json
└── articles[].ga4_scroll_50 → 50%スクロール率
└── articles[].ga4_scroll_75 → 75%スクロール率
└── articles[].ga4_scroll_90 → 90%スクロール率
└── articles[].ga4_cta_click_rate → CTAクリック率
└── funnel_summary.lp_cvr → LP登録CVRこの構造があると、n8nの「リライト優先度判定」ノードで機械的に修正タイプを判定できます。
データ取得時の注意点:
- GA4 APIのサービスアカウントキーがない → Google Cloud ConsoleでAPIを有効化してキーを取得する
- データが0件で返ってくる → GTM公開から3〜5日待つ(データ蓄積に時間がかかる)
- イベント名がGA4管理画面に表示されない → GTMプレビューで発火確認 → 24〜48時間待つ
この後どうなったか
GTMを公開したのは2026年5月です。現時点ではまだ設定から数日しか経っておらず、GA4にデータが溜まり始めている段階です。scroll_50・scroll_75・scroll_90のイベントはGA4のリアルタイムで確認できており、計測自体は正常に動いています。
CTA率・LP到達数についても数値が入り始めていますが、判断に使えるほどの量にはまだなっていません。3〜4週間後にperformance_cache.jsonを確認して、実際にリライト判断に使えるかを検証する予定です。その記録は別の記事でまとめます。
まとめ
GTMでスクロール率・CTAクリック・LP到達・登録完了を計測する設定は、以下の順番で進めました。
- GTMでScroll Depthトリガーを3本作成(50/75/90%)
- GA4イベントタグを3本作成してトリガーと紐づける
- CTAクリックトリガーとタグを作成(cta_idパラメータ付き)
- LP到達・登録完了のページビュートリガーとタグを作成
- GTMプレビューで動作確認 → 公開
設定直後はデータが0件ですが、3〜5日後から数値が溜まり始めます。最初の週はデータを眺めながら待つ時間になりますが、設計が整っていれば焦る必要はありません。
今日できる一歩: GTMを開いて、スクロールトリガーが1本でも作成できているか確認してください。まだ何もない場合は、まず Scroll Depth 50% - All Pages のトリガーを1本作るところから始めてみてください。
GTMとGA4で計測できるようになっても、その数字をどうリライト判断に使うかは別の設計が必要です。
ただし、このままだと計測したデータをどの記事のどこに使うかは判断できません。
直帰率・スクロール率・CTA率から修正タイプを判定する考え方は、bizinets.bizで整理しています。
→ リライトすべき記事の見分け方を読む
bizinets.biz
記事を読んで「もっと知りたい」と思ったあなたへ
bizinets.biz では、ビジネスの仕組みづくりを体系的に学べるコンテンツを用意しています。まずは一度、覗いてみてください。
bizinets.biz へ行く →