GA4のBigQueryをClaudeで分析し週次レポートを自動化する手順
GA4のBigQueryエクスポートをClaude Codeにつなぎ、SQLを書かずに週次のPV・コンバージョンレポートを作る手順です。cronとclaude -pで定例化するところまで扱います。
GA4のBigQueryエクスポートを持っているなら、Claude CodeにBigQuery MCPサーバーをつないで日本語で問い合わせるだけで、週次のPVやコンバージョンの集計が取れます。毎週の実行は、cronからclaude -pを呼ぶ形で自動化できます。
ただし、GA4のエクスポートには独特のスキーマがあり、そのまま自然言語で聞くと数字がずれる場面があります。この記事では接続、スキーマの教え方、週次の問い合わせ、定例化までを順に書きます。BigQuery接続そのものの手順はBigQueryをClaudeで自然言語のまま分析するにあるので、ここはGA4に固有の部分を中心にします。
GA4のデータをClaudeに渡す経路は2つある
GA4のデータをClaude Codeから読む方法は、大きく2つに分かれます。
| 経路 | 読む先 | 向く用途 |
|---|---|---|
| BigQuery MCPサーバー | 読む先エクスポート済みのイベント生データ | 向く用途独自の集計、期間比較、イベント単位の深掘り |
| Google Analytics MCPサーバー | 読む先Data API / Admin API | 向く用途プロパティ情報の確認、標準レポート、リアルタイム |
Google Analytics MCPサーバーは、Googleのリポジトリで公開されている実験的なローカルMCPサーバーです。提供されるツールは次のとおりです。
get_account_summaries/get_property_details/list_google_ads_linksrun_report/run_funnel_report/get_custom_dimensions_and_metricsrun_realtime_report
このサーバーが叩くのはAPIであって、BigQueryのエクスポートではありません。イベント単位の生データに対して自由な集計をしたいなら、BigQuery MCPサーバーの出番です。週次レポートの主役はこちらに置き、APIは「このプロパティのカスタムディメンションは何か」といった構成の確認に使う、という分担が組み立てやすい形です。
エクスポートの前提と制限を先に押さえる
自動化の前に、エクスポート側の仕様を確認します。数字がずれる原因の多くはここにあります。
| 項目 | 内容 |
|---|---|
| Daily export | 内容前日分の生データを1日1回エクスポート。時刻は保証されず、通常はプロパティのタイムゾーンで午後の中ごろ、遅れれば翌日 |
| Streaming export | 内容当日分を数分単位で出力。events_intraday_YYYYMMDDに入る。ベストエフォートで取りこぼしがあり得る |
| 標準プロパティの上限 | 内容Dailyは1日あたり100万イベントまで |
| 費用 | 内容BigQuery側のストレージと処理に課金。Streamingは1GBあたり0.05ドルが追加(1GBは約60万イベント) |
| 再エクスポート | 内容一度出したデータは再エクスポートできない |
週次レポートで特に効くのは、次の2点です。
- Dailyテーブルは後から更新される。
events_YYYYMMDDは、遅れて届くイベントを取り込むため、テーブル日付から2暦日と当日ぶん先まで更新され得ます。集計対象の最終日から数日置いて走らせる設計にすると、先週の数字が月曜と水曜で食い違う事態を減らせます。 - プロパティのタイムゾーンが日付の基準になる。タイムゾーンを変更するとエクスポートに不整合が出たり、Dailyのエクスポートが飛んだりする可能性があります。
Analytics 360のプロパティなら、Fresh Dailyという選択肢もあります。データは通常午前5時までに届き、その日のうちに更新が数回入ります。360のDailyやFresh Dailyでは、前日分の書き出しが終わったことを知らせる完了シグナルも送られます。標準プロパティでその前提を置けない場合は、実行時刻に余裕を持たせる設計が無難です。
なお、Streamingのevents_intraday_は当日の速報向けです。週次の確定値にはDailyのテーブルを使い、ユーザー帰属のデータはStreamingに頼らない、というのが公式の書き方に沿った使い分けです。
接続する
BigQuery MCPサーバーを追加する
BigQuery MCPサーバーは、Googleがリモートで提供するエンドポイントです。Claude Codeには、HTTPトランスポートで追加します。
claude mcp add --transport http bigquery https://bigquery.googleapis.com/mcpOAuthクライアントの発行やIAMロールの割り当てなど、事前準備の詳細はClaude BigQuery連携で扱っています。GA4のエクスポート先データセットに対しては、少なくとも次のロールが要ります。
- MCP Tool User(
roles/mcp.toolUser) - BigQuery Job User(
roles/bigquery.jobUser) - BigQuery Data Viewer(
roles/bigquery.dataViewer)
追加できたら、Claude Codeの中で/mcpを開き、bigqueryが接続済みになっているかを確認します。
任意: Google Analytics MCPサーバーも足す
APIの側も使いたい場合は、Googleのリポジトリが示すコマンドで登録します。Python 3.10以上とpipxが前提で、Application Default Credentialsにanalytics.readonlyスコープを含める必要があります。
claude mcp add analytics-mcp \
--scope user \
-e "GOOGLE_APPLICATION_CREDENTIALS=PATH_TO_CREDENTIALS_JSON" \
-e "GOOGLE_PROJECT_ID=YOUR_PROJECT_ID" \
-- pipx run analytics-mcp事前にGoogle Cloudプロジェクトで、Google Analytics Admin APIとGoogle Analytics Data APIを有効にします。claude mcp addのスコープや--envの扱いはClaude Code MCP設定ガイドが詳しいです。
GA4のスキーマをCLAUDE.mdに書いておく
GA4のイベントテーブルは、1行が1イベントで、パラメータがevent_paramsという繰り返しレコードに入っています。ページURLや売上額を取るにはUNNESTで展開してキーを指定する必要があり、Googleの基本クエリ集もこの形です。
日本語で「先週のPV数」と聞くだけでも、Claudeはテーブル情報を調べてクエリを組み立てられます。それでも毎回の実行でぶれないようにするには、集計の約束事をプロジェクトのCLAUDE.mdに固定しておくのが確実です。次はその一例です。
# GA4レポート作業ルール
- 対象データセット: `my-project.analytics_123456789`(自分の環境の名前に置き換える)
- テーブルは `events_*` を使い、日付は必ず `_TABLE_SUFFIX` で絞る
- 当日分の `events_intraday_*` は週次レポートに含めない
- PV は `event_name = 'page_view'` の件数
- ページURLは `event_params` の `key = 'page_location'` を UNNEST して取る
- ユーザー数は `COUNT(DISTINCT user_pseudo_id)`
- 売上は `event_name = 'purchase'` の `event_params` の `value` を合計する
- 集計期間は「直近の完全な月〜日の1週間」。最終日より3日以上前までを対象にする
- 実行するSQLは読み取り専用ツールだけを使うここでの要点は3つあります。日付の絞り込みにワイルドカードテーブルの_TABLE_SUFFIXを使うこと、パラメータはUNNESTで取ること、当日のintradayを混ぜないことです。最後の「3日以上前」は、前節のテーブル更新の仕様を踏まえた運用上の決めごとで、公式が示す数字ではありません。
レポートの体裁もCLAUDE.mdで固定する
数字の出し方と同じく、出力の形も毎週そろえておくと、前週のファイルと見比べやすくなります。集計ルールの下に、次のような出力形式を足します。
## レポートの形式
1. 冒頭に対象期間(開始日〜終了日)を書く
2. 日別のPV・ユーザー数・購入件数・売上を表にする
3. 前週比は増減の絶対値と%を併記する
4. 変化が大きい指標を3点まで、数字を添えて要約する
5. 集計に使ったテーブルの範囲(`_TABLE_SUFFIX`の値)を末尾に残す末尾に_TABLE_SUFFIXの範囲を残しておくと、後日「この数字はどの日付範囲か」と聞かれたときに、再実行なしで答えられます。
週次の問い合わせを組み立てる
ルールを置いたうえで、依頼の文面は自然言語のままにします。
先週(月〜日)のGA4データで、日別のPV数とユニークユーザー数、
purchaseイベントの件数と売上合計を出して。前の週との増減も並べて。Claudeが組み立てるクエリは、Googleの基本クエリ集にある形に近くなります。例えば購入イベントの合計値を取る部分は、おおよそ次のような形です(公式の例に沿った書き方の一例で、Claudeの実際の出力ではありません)。
SELECT
event_date,
COUNT(*) AS purchases,
SUM((SELECT COALESCE(value.int_value, value.float_value, value.double_value)
FROM UNNEST(event_params) WHERE key = 'value')) AS revenue
FROM `my-project.analytics_123456789.events_*`
WHERE event_name = 'purchase'
AND _TABLE_SUFFIX BETWEEN '20260914' AND '20260920'
GROUP BY event_date
ORDER BY event_date出てきた数字は、初回だけGA4の管理画面の値と突き合わせます。エクスポートは、管理画面のレポートと集計の仕組みが違うため、完全に一致する保証はありません。差分が出る理由はエクスポートのドキュメントに「GA画面との違い」として整理されています。ずれ幅の目安を一度つかんでおくと、定例運用でおかしな値を見つけやすくなります。
claude -pとcronで週次に回す
hooksは「定時起動」の仕組みではない
hooksはツール実行やセッション終了といったイベントに反応する仕組みで、曜日と時刻で起動する機能ではありません。週次の起動はOSのcron(macOSならlaunchd)に任せ、Claude Code側は非対話モードのclaude -pで1回分の作業を担当させます。
hooksが役立つのは、レポートを書き終えたあとの後処理です。生成したファイルの整形や通知は、PostToolUse hookで拾えます。
定例スクリプトの例
-pは、対話なしでプロンプトを実行して結果を標準出力に返します。実行できるツールは--allowedToolsで事前に許可します。MCPツールの許可はmcp__<サーバー名>__<ツール名>の形で書きます。BigQuery MCPサーバーのexecute_sql_readonlyは、読み取りだけを許可するツールです。書き込みが可能なexecute_sqlは許可に含めません。
#!/bin/bash
# weekly-ga4-report.sh
cd "$HOME/ga4-report" || exit 1 # CLAUDE.md と .mcp.json を置いたディレクトリ
claude -p "先週(月〜日)のGA4レポートを作って。日別PV、ユーザー数、
purchaseの件数と売上、前週比を表にして、気づいた変化を3点で要約して。" \
--allowedTools "mcp__bigquery__execute_sql_readonly,\
mcp__bigquery__get_table_info,mcp__bigquery__list_table_ids" \
--permission-prompts none \
--output-format json | jq -r '.result' \
> "reports/ga4-$(date +%Y%m%d).md"--permission-prompts noneは、スケジュール実行のように承認する人がいない場面のためのフラグで、v2.1.259以降で使えます。許可していない操作は拒否され、実行は続きます。cronへの登録は次の1行です。
0 15 * * 1 /bin/bash $HOME/ga4-report/weekly-ga4-report.sh月曜15時の実行は、日曜までの集計に対して1日程度しか空きません。前節のルールで「最終日から3日以上前」を対象にしているなら、先週の月〜日ではなく「先々週」を対象にするか、実行を水曜以降にずらす設計になります。どちらを選ぶかは、レポートを何曜日までに欲しいかで決まります。
-pの細かいオプションはClaude Code -pモードで整理しています。--bareはMCPサーバーの自動読み込みをスキップするため、この用途で付けるなら、接続設定を別途明示する必要があります。付けずに動かす場合は、プロジェクトの.mcp.jsonにあるサーバーが読み込まれる点に注意してください。
つまずきやすいところ
| 症状 | 原因と対処 |
|---|---|
| 結果が途中で切れる | 原因と対処BigQuery MCPのクエリ結果は最大3,000行。日別・ページ別のように行数が増える集計は、上位N件に絞るよう依頼する |
| クエリが途中で止まる | 原因と対処既定で処理時間は3分まで。長い期間をevents_*全体でなめず、_TABLE_SUFFIXで日付を絞る |
| 先週の数字が後から変わる | 原因と対処Dailyテーブルが2暦日ぶん後まで更新される。集計期間を締めるタイミングを遅らせる |
| 当日の数字が欲しい | 原因と対処events_intraday_を読むことになる。取りこぼしがあり得るため、確定値とは分けて扱う |
| 高額なクエリが心配 | 原因と対処課金はスキャン量に応じてBigQuery側にかかる。期間を絞る指示をCLAUDE.mdに書き、読み取り専用ツールだけを許可する |
| 無料のBigQuery sandboxで運用したい | 原因と対処sandboxにもエクスポートできるが、sandboxの上限を超えた分は課金される。標準プロパティのDailyは1日100万イベントが上限 |
課金と権限の詳細はClaude BigQuery連携にもまとめています。似た構成の週次レポートとしては、Cowork Amplitude自動化がプロダクト分析ツール側の例です。
まとめ
GA4のBigQueryエクスポートがあれば、Claude Codeに読み取り専用でBigQuery MCPをつなぎ、集計ルールをCLAUDE.mdに書いておくことで、週次レポートの叩き台が日本語の依頼だけで作れます。
定例化は、hooksではなくcronとclaude -pの組み合わせです。Dailyテーブルの更新期間と3,000行の結果上限を踏まえ、集計期間と実行曜日を決めておけば、翌週になって数字が食い違う事態を避けやすくなります。APIの側にはGoogle Analytics MCPサーバーがあるため、生データの集計はBigQuery、構成の確認はAPI、という使い分けもできます。