GA4のレポートを開いて、チャネル別の流入内訳を眺める。Organic Search、Direct、Referral、Social...見慣れた並びの中に、「ChatGPT経由でどれくらい来ているか」を答えられる項目がない。存在しないわけではなく、Referralの中か、下手をすると(direct)の中に埋もれている(埋もれているものは、探しようがない)。
AI検索・AIアシスタント経由の流入が増えているという話は、この一年よく聞くようになった。では実際どれくらい増えているのか、自分のサイトの数字で即答できるだろうか(正直に言うと、できるなら、この記事はもう読まなくていい)。「増えている」を自分のGA4で確かめようとすると、そもそもそれを数える仕組みがデフォルトでは用意されていないことに気づく。この記事では、GA4のデフォルト設定がAIアシスタント経由の流入をどう取りこぼすか、リファラードメインでの識別、カスタムディメンションの設計と落とし穴、チャネルグルーピングの再設計という3段階で、実際に計測できる状態まで持っていく手順を整理する。
この記事で学べること
- GA4のデフォルト設定で、AIアシスタント経由の流入がなぜ埋もれるのか
- リファラードメインをもとに「これはAIアシスタント経由だ」と判定するロジックの作り方
- GA4のカスタムディメンションを設計するときに踏みがちな、コードは合っているのにレポートに値が出ない落とし穴
- チャネルグルーピングをカスタマイズして、AI経由の流入を独立した軸として可視化する方法
前提条件
- 自分のサイトにGA4(
gtag.jsまたはgtag()を呼べる仕組み)が既に入っている - GA4管理画面の「管理」メニューにアクセスできる権限がある
- ChatGPT、Perplexity、GeminiのようなAIアシスタント・AI検索からの流入を、他のチャネルと区別して見たい
なぜAIアシスタント経由の流入は正しく計測されないのか
GA4は流入元をsession_source / session_mediumという2つのディメンションから自動判定し、その組み合わせを「デフォルトチャネルグループ」というルールセットに当てはめて、Organic Search・Referral・Directなどに振り分けている。この振り分けルールが作られた時点でAIアシスタント経由の流入は想定されていなかったため、結果として次の2パターンのどちらかに吸収される。
- Referralに吸収される:
chat.openai.comやperplexity.aiのようなドメインからリンクを踏んで訪問すると、document.referrerにそのドメインが入り、GA4はこれを一般的な外部サイトからのReferralとして扱う。他の被リンクサイトからの流入と見分けがつかない。 (direct)に吸収される: AIアシスタントのアプリ内ブラウザや、一部のネイティブ実装ではリファラーヘッダー自体が送られないことがある。この場合session_sourceにはリファラー由来の値もUTMも入らないため、GA4はこれを「直接アクセス」と区別できず(direct)/(none)として計上する。(not set)と混同しやすいが、(not set)はUTMやリファラーが単に無かったことの結果ではなく、コンセントモードの設定不備や参照元除外リストの誤設定など、計測基盤側の不具合を示すシグナルとして扱うのが正確で、リファラーなしの通常の帰結ではない。
(direct)が「他のどのチャネルにも当てはまらない流入の受け皿」になってしまう問題自体は、AI流入に限った話ではない。ダークソーシャルや一部のネイティブアプリ内ブラウザからの流入も同じ理由でここに紛れ込む、以前からよく知られた集計上の限界だ。AIアシスタント経由の流入がこの構造の中に紛れ込むのは、いわば予測できたことだった。
まとめると、AIアシスタント経由の流入を見るには、GA4に「これはAI経由だ」と教えるための追加の識別ロジックと、その結果を保持するためのディメンションを自分で用意する必要がある。
実装1: リファラードメインでAIアシスタント経由を判定する
まずやることは、document.referrerのホスト名を、あらかじめ用意したAIアシスタントのドメイン一覧と照合する処理だ。判定できたら、そのサービス名をイベントパラメータとしてgtag()に乗せる。
const AI_REFERRER_DOMAINS: Record<string, string> = {
'chatgpt.com': 'chatgpt',
'chat.openai.com': 'chatgpt',
'perplexity.ai': 'perplexity',
'www.perplexity.ai': 'perplexity',
'gemini.google.com': 'gemini',
'copilot.microsoft.com': 'copilot',
};
function detectAIReferrerSource(): string | undefined {
if (typeof document === 'undefined' || !document.referrer) return undefined;
try {
const hostname = new URL(document.referrer).hostname;
return AI_REFERRER_DOMAINS[hostname];
} catch {
return undefined;
}
}
const aiSource = detectAIReferrerSource();
if (aiSource) {
gtag('event', 'page_view', { ai_referrer_source: aiSource });
}
ドメイン一覧は今後も増減する前提で持つ。AIに実装を頼むときは「ハードコードした配列」ではなく「設定として差し替えやすい形」を指示すると、新しいAIサービスが増えるたびにコードを書き直さずに済む(この手の一覧は放っておくと大体半年で陳腐化する)。AIアシスタント側がリファラーを送らないケースではこの判定ロジックごと機能しないので、次の章で扱うチャネルグルーピングの再設計と合わせて、検出できる範囲の限界として理解しておく必要がある。
実装2: カスタムディメンションをGA4に登録する(ここでハマる)
このサイトのGA4計測は、一度に作られたわけではなく、段階的に拡張されてきた。問い合わせフォームの離脱段をfunnel_stepで可視化する変更、ブログ記事からソリューションページへの送客経路をreferrer_blogという形で追跡できるようにした変更、そのreferrer_blogがクライアントサイドルーティングではdocument.referrerが更新されず欠落してしまう問題をsessionStorageで補った修正、と3段階の積み重ねがあって今の計測がある(実装の詳細は割愛するが、SPA遷移とreferrerの相性についてはこのブログの別記事で詳しく扱っている)。今回のAIアシスタント経由の流入判定も、この上に乗る追加レイヤーという位置づけになる。
ai_referrer_sourceというイベントパラメータをコード側で送り始めても、それだけではGA4のレポートにもData APIにも値は出てこない。GA4は、イベントパラメータを「カスタムディメンション」としてGA4管理画面(管理 → カスタム定義 → カスタムディメンション)に登録して初めて、そのパラメータを軸に集計・フィルタできるようにする仕組みになっている。
このサイトでも似た問題を過去に踏んでいる。CTAのA/Bテストでab_variantというイベントパラメータをコード側から送り始めたものの、GA4管理画面側でカスタムディメンションとして登録されておらず、GA4のレポートに値が出ないという状態がしばらく続いた。GA4 Data APIでcustomEvent:ab_variantを指定すると400エラー(Field customEvent:ab_variant is not a valid dimension)が返ってくるところまで確認して、ようやく「コードの問題ではなく、GA4側の登録待ちだった」と判明した。コードを何度読み返しても間違いが見つからないとき、疑うべきは自分の実装ではなく設定画面側、ということがある(そのぶん精神は削られる)。コードは合っているのにレポートに何も出ない、という状態に遭遇したら、まずここを疑うといい。
登録の手順自体はシンプルだ。
- GA4管理画面 → 管理 → カスタム定義 → カスタムディメンション → 作成
- ディメンション名:
ai_referrer_source(任意の名前でよいが、コード側のパラメータ名と対応が分かる名前にする) - 範囲: イベント
- イベントパラメータ:
ai_referrer_source(コードで送っているキー名と一致させる)
GA4はカスタムディメンション登録後、レポートに値が出始めるまで最大24〜48時間ほどのタイムラグがあるとされている。丸1日以上(その間、何度コードを疑って何度読み返すことになるか)。「コードをデプロイしたのに今日のデータに値が出ない」だけで実装ミスと判断せず、登録の反映待ちである可能性も併せて確認したほうがいい。
実装3: チャネルグルーピングを再設計してAIアシスタントを可視化する
カスタムディメンションが使えるようになったら、次はそれをレポート上の「チャネル」として扱えるようにする。GA4の管理画面(管理 → データ設定 → チャネルグループ)では、デフォルトのOrganic Search/Referral/Directに加えて、独自のカスタムチャネルグループを定義できる。ここでai_referrer_sourceが値を持っている訪問を「Generative AI」のような独立したチャネルとしてまとめておくと、探索レポートやコンバージョンレポートで他のチャネルと横並びに比較できるようになる。
この「送信元と送信手段の組み合わせを、GA4のチャネル定義と整合させる」という考え方自体は、このサイトでは以前から使っている。SNSやクロスポスト記事からの流入にutm_source / utm_mediumを付与する運用ルールを作った際にも、「utm_source/utm_mediumの組み合わせがGA4のデフォルトチャネルグループと適切にマッピングされることを確認する」というチェック項目を運用ルールに入れていた。AIアシスタント経由の流入も、扱いとしては同じで、GA4が最初から知らない流入元を、後から意味のあるチャネルとして定義し直す作業になる。
| リファラードメイン | 判定するサービス | チャネル名の例 |
|---|---|---|
| chatgpt.com / chat.openai.com | chatgpt | Generative AI |
| perplexity.ai | perplexity | Generative AI |
| gemini.google.com | gemini | Generative AI |
| copilot.microsoft.com | copilot | Generative AI |
| (referrerなし) | 判定不可 | 既存の(direct)区分のまま |
最後の行がポイントで、リファラーヘッダーが送られてこないケースはこの仕組みでは救えない。「AIアシスタント経由の流入を漏れなく捕捉できる」わけではなく、「リファラーが取得できる範囲で、既存のReferral/直帰の中に埋もれていたものを可視化する」というのがこの実装の実際のスコープになる(全部見えるようになったと思ったら、それはたぶん錯覚だ)。
動作確認
自分のサイトでも、実際のAIアシスタントからの訪問を待たずに、この一連の実装がまず動くかどうかを確認できる(ChatGPTが来てくれるのを指をくわえて待つ必要はない)。GA4のgtag()はpage_referrerパラメータで参照元を上書きできる仕組みを標準で持っているので、これを使ってブラウザのコンソールから直接テストする。
- 対象サイトを開いた状態でブラウザのDevToolsコンソールを開く
- 次のようにリファラーを上書きしたイベントを手動で送信する
gtag('event', 'page_view', {
page_referrer: 'https://chatgpt.com/',
});
- GA4管理画面の「管理 → DebugView」(または該当プロパティのリアルタイムレポート)を開き、送信したイベントが表示されることを確認する
session_sourceがchatgpt.comとして記録されていること、実装1で追加したai_referrer_sourceがchatgptとして付与されていることを確認する- 実装2のカスタムディメンション登録が完了していれば、DebugViewのイベント詳細で
ai_referrer_sourceパラメータの値がそのまま見える。ここで値が見えない場合は、登録がまだ反映されていないか、パラメータ名がコードと管理画面で食い違っている
DebugViewは登録直後のデータでも即時に反映されるため、「実装したはいいが、実際のAI経由の訪問が来るまで動作確認できない」という状態を避けられる。
注意点・Tips
- リファラーが送られないケースは仕組みの限界として割り切る: AIアシスタントのアプリ内ブラウザや一部のクライアントは、そもそもリファラーヘッダーを送らないことがある。この場合は
(direct)のまま残り、この記事の実装では判定できない。「取りこぼしがある前提の計測」として扱うのが実態に近い。 - ドメイン一覧は定期的に見直す: AIアシスタント・AI検索サービスは新規参入や仕様変更が続く領域なので、リファラードメインの一覧は一度作って終わりにせず、月次程度で見直す運用を組み込んでおくとよい。
- カスタムディメンションの登録忘れは再現性の低いバグに見える: コード側の実装ミスとGA4管理画面の登録漏れは、どちらも「値が出ない」という同じ症状として現れる。切り分けるには、GA4 Data APIで該当パラメータをディメンション指定してリクエストし、
400エラーが返るかどうかを見るのが早い。
まとめ
AIアシスタント経由の流入は、GA4のデフォルト設定では「見えない」のではなく「他のチャネルに紛れて見分けがつかない」状態になっている。リファラードメインでの判定、カスタムディメンションの登録、チャネルグルーピングの再設計という3段階を踏むことで、埋もれていた流入を独立した軸として取り出せる。
同じ構造の問題は、GA4に限らずどの分析基盤でも起こりうる。新しい流入経路や新しいユーザー行動が生まれたとき、それを計測する仕組みが後追いで追いつくまでには必ずタイムラグがある。自分のプロダクトでも、「このイベント、コードは送っているはずなのにレポートに出ない」という状況に出会ったら、実装のバグを疑う前に、まず計測基盤側の登録・設定が追いついているかを確認してみる価値がある(自分を責める前に、管理画面を疑う癖をつけておいて損はない)。


