GA4 と BigQuery を連携
投稿日: 2025-07-01
カテゴリ: tech

GA4(Google アナリティクス 4)のデータを BigQuery に連携すると、標準レポートでは見えないイベント単位の生ログデータを SQL で自由に分析できるようになる。
手順1:GCP プロジェクト作成 & BigQuery API 有効化
- https://console.cloud.google.com/ にアクセス
- プロジェクトを新規作成
- 左上「ナビゲーションメニュー」 > 「APIとサービス」 > 「ライブラリ」
- 「BigQuery API」を検索 → 有効化
- 「この API を使用するには、認証情報が必要になる可能性があります。」とあるが、GA4 → BigQuery の連携だけなら、認証情報の追加は不要
- 今回は GA4 側が内部的にBigQuery API を使う
- 手動で API をプログラムから呼び出すわけではないため、認証情報(APIキーやOAuthクライアントなど)を自分で作成する必要はない

手順2:GA4 側で BigQuery にエクスポート設定
- https://analytics.google.com にログイン
- 対象の GA4 プロパティを開く
- 左下 ⚙「管理(Admin)」をクリック
- プロパティ設定 > サービス間のリンク設定 > [BigQuery へのリンク] を選択
- 「リンクを作成」 > プロジェクト選択
- 先ほど作成した GCP プロジェクトを選ぶ
- データのロケーションは基本「asia-northeast1(東京)」にしたほうがいい
- データが物理的に保管される地域のこと
- GA4のユーザーが日本中心なら、東京が最も高速・安定
- Cloud FunctionsやCloud Storageなども東京リージョンで統一できる
- BigQueryの利用料金はどのリージョンでも基本同じ(ストレージ・クエリ共に)
- BigQuery のデータセットロケーションは一度作ると変更不可
- ロケーションが違うと、データをまたいでクエリを実行することも基本できない
- エクスポート設定を選択
- エクスポートタイプ:
- 毎日(無料プランOK)
- ストリーミング(ベストエフォート)は有料らしいので今回は外す
- 5〜15分以内の遅延でイベントがBQに入る
- 生成されるのは events_intraday_YYYYMMDD テーブル(暫定データ)
- リアルタイム監視や即時アラート用に便利
- ユーザーデータ:
- 日別
- 1日に1回、前日の全イベントデータを BigQuery にまとめて送る方式
- データセットに events_YYYYMMDD というテーブルが1日ごとに生成されます
- エクスポートタイプ:
- 保存して完了

手順3:BigQuery 側で確認
- 翌日以降、analytics_<property_id> データセットが作成され、events_YYYYMMDD のテーブルが毎日1つずつ作成される
- GA4 のデータ構造は「イベントベース」なので、1ユーザーの1ページビューも1行ずつ保存されている
- セッション分析やユーザーごとの集計には、user_pseudo_id + session_id でグループ化するのが基本
- 各フィールドの説明は下記
フィールド名 | 種類 | 意味 |
---|---|---|
event_date | STRING | イベント発生日(例:20250629) |
event_timestamp | INTEGER | イベント発生時刻(UNIXマイクロ秒)→ TIMESTAMP_MICROS()で日時に変換 |
event_name | STRING | イベント名(例:page_view, click, scroll など) |
event_params | RECORD(REPEATED) | イベントに付随するパラメータ(URL、タイトルなど) |
event_previous_timestamp | INTEGER | 前回イベントのタイムスタンプ(セッション内) |
user_id | STRING | ログインユーザーID(User-ID を送っている場合) |
user_pseudo_id | STRING | 匿名ユーザーID(Cookie or deviceベース) |
user_properties | RECORD(REPEATED) | ユーザー属性(例:会員属性、ランクなど) |
geo | RECORD | 地理情報(国、都市など) |
geo.country | STRING | 国名(例:Japan) |
device | RECORD | デバイス情報 |
device.category | STRING | mobile, desktop, tabletなど |
traffic_source | RECORD | 流入元情報(セッション開始時点) |
traffic_source.source | STRING | 流入元(例:google, direct など) |
traffic_source.medium | STRING | メディア(例:organic, referral, (none) など) |
session_traffic_source_last_click | RECORD | セッション単位のラストクリック流入元(session_source等)GA4のv2形式で利用される場合あり |
platform | STRING | WEB, ANDROID, IOS など |
event_dimensions | RECORD | デバッグ用のメタ情報など(あまり使わない) |
items | RECORD(REPEATED) | イーコマース関連のアイテム情報(商品ID、金額など) |
ecommerce | RECORD | イーコマース関連(購入、カートなど)イベント詳細 |
ltv | RECORD | 生涯価値(GA4が保持するユーザーごとのLTV) |
stream_id | STRING | GA4のストリームID(プロパティ配下の区別) |
is_active_user | BOOLEAN | アクティブユーザーとしてカウントされるか |
batch_* 系 | INTEGER / STRING | バッチ挿入関連の内部管理項目(基本無視してOK) |
event_params の中身の例:
key | 意味 |
---|---|
page_location | URL(ページのURL) |
page_referrer | リファラー(前ページのURL) |
session_id または ga_session_id | セッション識別子 |
engagement_time_msec | 滞在時間(ミリ秒) |
link_url | クリック先リンクURL(アウトバウンドリンクなど) |
video_current_time | 動画の再生位置(秒)なども含まれることあり |
同時にユーザー単位のテーブル pseudonymous_users_YYYYMMDD もできている。
- events_YYYYMMDD はイベント単位(1行=1イベント)
- pseudonymous_users_YYYYMMDD はユーザー単位(1行=1ユーザー)

手順4:クエリを書いてチェック
直近30日の UU・セッション数・PV を出してみる。
WITH base_events AS (
SELECT
event_date,
user_pseudo_id,
-- セッションID(イベントパラメータから抽出)
(SELECT value.int_value FROM UNNEST(event_params)
WHERE key = "ga_session_id") AS session_id,
event_name
FROM
`your_project.your_dataset.events_*`
WHERE
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
)
SELECT
event_date,
COUNT(DISTINCT user_pseudo_id) AS unique_users,
COUNT(DISTINCT session_id) AS sessions,
COUNTIF(event_name = 'page_view') AS pageviews
FROM
base_events
GROUP BY
event_date
ORDER BY
event_date;
ちゃんと出た。クエリを保存しておく。
補足・注意点
項目 | 内容 |
---|---|
無料枠 | 毎月1TBまでクエリ実行無料、10GBの保存も無料枠あり |
ストリーミング | 有料 |
データ保持 | BigQuery側では無期限に保持可能(課金あり) |
GCPの料金 | 詳細は BigQuery 料金表 を参照 |