はじめに:P-MAXは管理画面がブラックボックスで内訳が見えにくい
P-MAX(パフォーマンス最大化キャンペーン)を回しはじめて、こう思った方は多いのではないでしょうか。「数字は伸びている気がするけど、何が効いているのか全然わからない」と。
P-MAXは、検索・ディスプレイ・YouTube・Gmail・Discover・マップといったGoogleのほぼ全面に、機械学習が自動で配信先と入札を最適化してくれるキャンペーンです。手間が少なくて成果も出やすい一方で、管理画面で見られる内訳がかなり限定的なのが悩みどころです。
たとえば「どの検索語句で出たのか」「どのチャネルにいくら使ったのか」「アセットグループごとの費用対効果は」といった、運用判断に直結する情報がまとまった形では取り出しにくい。インサイトタブにヒントは出るものの、自分で自由に集計できる粒度ではありません。中小ECや個人事業主の規模だと、限られた予算をどこに寄せるかの判断材料がほしいのに、肝心の内訳が霧の向こう、という状態になりがちです。
この記事では、その霧を少しでも晴らすために、BigQueryのData Transfer Service(DTS)を使ってP-MAXのデータを取り出し、自分の手で集計する方法を紹介します。あわせて「BigQueryでも取れないものは取れない」という限界もはっきりさせておきます。ここを誤解すると、出てきた数字を過信してしまうからです。
BigQuery(Data Transfer Service)でP-MAXについて取れるデータと限界
まず前提として、Google広告のデータをBigQueryに自動連携する仕組みが「BigQuery Data Transfer Service(DTS)」です。設定すると、Google広告のレポートに相当するテーブル群が、毎日BigQueryのデータセットに書き出されていきます。
セットアップ自体の手順は別記事にまとめているので、まだ連携していない方はそちらを先に読んでみてください。
取れるもの
P-MAXに関して、DTS経由でおおむね取得できるのは次のような単位の実績です。
- キャンペーン単位の費用・表示回数・クリック・コンバージョン・コンバージョン値(日別)
- アセットグループ単位の実績(
ads_AssetGroup/ads_AssetGroupStats系のテーブル) - チャネル別の内訳にあたるデータ(
ads_CampaignAssetGroupStatsや、P-MAX関連の専用テーブル) - アセット単位のパフォーマンスラベル(Best / Good / Low といった評価)
これらを使えば、「日別にいくら使って、どれだけコンバージョンが出たか」「どのアセットグループが効率的か」を、管理画面より自由な切り口で集計できます。
DTSのテーブルは日付サフィックス付き(例: ads_CampaignStats_20260630)で日ごとに作られ、_* のワイルドカードでまとめて参照する形が基本です。テーブル内には _DATA_DATE(その行が表す日付)と _LATEST_DATE(取り込み済みの最新日)といったメタ列が付くので、期間でフィルタするときはこの _DATA_DATE を使います。過去分のデータは数日さかのぼって上書き更新されることがあるため、直近の数字を見るときは「まだ確定していないかもしれない」と意識しておくと安心です。
取れないもの・粒度の限界
一方で、P-MAXは構造的に取れない情報がいくつもあります。代表的なのは次のとおりです。
- 個別の検索語句(クエリ)単位の費用・コンバージョンは基本的に提供されません(検索カテゴリーのインサイトはあっても、語句ごとの完全な内訳ではありません)
- ディスプレイ/YouTubeなどチャネルごとの完全な費用配分は、提供範囲がバージョンによって変わります
- どのプレースメントに出たかの細かい内訳は限定的です
DTSで取得できるテーブルやカラムの細部は、Google広告APIのバージョンアップや仕様変更でしばしば変わります。「このカラムが必ずある」と思い込まず、実際に分析する前に公式ドキュメントと自分のデータセットのスキーマを確認してください。テーブル名・カラム名は本記事執筆時点の一例です。
つまりBigQueryを使っても、「管理画面に出ていない検索語句の内訳が魔法のように全部見える」わけではありません。取れる粒度の中で、管理画面よりは自由に集計できる——これがDTSの現実的な立ち位置です。
BigQueryでの分析SQL例
ここからは実際のクエリを見ていきます。テーブル名・カラム名はDTSのバージョンによって異なるので、ご自身の環境に合わせて読み替えてください(your_project.your_dataset の部分も置き換えます)。
日別の費用・コンバージョン推移
まずは一番シンプルな、P-MAXキャンペーンの日別推移です。費用やコンバージョン値はマイクロ単位(実際の金額の100万倍)で格納されていることが多いので、/ 1e6 で実額に直しています。
SELECT
c.campaign_name,
s._DATA_DATE AS date,
ROUND(SUM(s.metrics_cost_micros) / 1e6, 0) AS cost,
SUM(s.metrics_clicks) AS clicks,
SUM(s.metrics_conversions) AS conversions,
ROUND(SUM(s.metrics_conversions_value), 0) AS conv_value,
SAFE_DIVIDE(
SUM(s.metrics_conversions_value),
SUM(s.metrics_cost_micros) / 1e6
) AS roas
FROM `your_project.your_dataset.ads_CampaignStats_*` AS s
JOIN `your_project.your_dataset.ads_Campaign_*` AS c
ON s.campaign_id = c.campaign_id
AND s._DATA_DATE = c._DATA_DATE
WHERE c.campaign_advertising_channel_type = 'PERFORMANCE_MAX'
AND s._DATA_DATE BETWEEN '2026-06-01' AND '2026-06-30'
GROUP BY campaign_name, date
ORDER BY date;
metrics_conversions_value / cost で算出している roas は、あくまでGoogle広告が自己申告したコンバージョン値ベースのROASです。この点はあとで重要になります。
このクエリを Looker Studio やスプレッドシートにつなげば、日別の費用とコンバージョンの折れ線が描けます。P-MAXは学習期間中に数字が荒れやすいので、まずは日別推移を眺めて「いつから安定したか」「急に費用が跳ねた日はないか」を把握しておくと、後段のアセットグループ分析が解釈しやすくなります。
アセットグループ/チャネル別の費用・コンバージョン
次に、運用判断に直結する「アセットグループ別」の集計です。どのアセットグループに予算が偏っていて、どこが効率的かを見ます。
SELECT
ag.asset_group_name,
ROUND(SUM(ags.metrics_cost_micros) / 1e6, 0) AS cost,
SUM(ags.metrics_conversions) AS conversions,
ROUND(SUM(ags.metrics_conversions_value), 0) AS conv_value,
ROUND(
SAFE_DIVIDE(
SUM(ags.metrics_conversions_value),
SUM(ags.metrics_cost_micros) / 1e6
),
2
) AS roas
FROM `your_project.your_dataset.ads_AssetGroupStats_*` AS ags
JOIN `your_project.your_dataset.ads_AssetGroup_*` AS ag
ON ags.asset_group_id = ag.asset_group_id
AND ags._DATA_DATE = ag._DATA_DATE
WHERE ags._DATA_DATE BETWEEN '2026-06-01' AND '2026-06-30'
GROUP BY asset_group_name
ORDER BY cost DESC;
チャネル別の内訳を出したい場合は、ads_CampaignAssetGroupStats 系のテーブルにチャネル(検索・ディスプレイ・動画など)を区別するカラムが含まれていることがあります。あるかどうか、どのカラム名かは環境によって違うので、まず以下のように中身を覗いてから組み立てるのが確実です。
-- どんなカラムがあるか、まずは1日分だけ覗いてみる
SELECT *
FROM `your_project.your_dataset.ads_CampaignAssetGroupStats_*`
WHERE _DATA_DATE = '2026-06-30'
LIMIT 20;
P-MAXのチャネル別費用は、提供される場合でも「ディスプレイとYouTubeがまとめられている」など粒度に制約があることがあります。出てきた数字を「検索◯円・動画◯円」と断定する前に、そのカラムが何を表しているのかをスキーマで確認してください。
GA4の実売上と突合して実態ROASを見る
ここまでのROASは、すべてGoogle広告側が報告したコンバージョン値です。前述のとおり、媒体の自己申告には次のような偏りが入りがちです。
- ブランド名検索など「もともと買う気だった人」のコンバージョンも広告の成果として計上される
- 計測タグの設定次第で、送信される売上金額が実態とズレる
- Meta広告など他媒体と同じ購入を二重にカウントしていることがある
そこで、GA4側の実際の購入イベント(できれば購入金額付き)をBigQueryに取り込み、広告費と突合して「自分のデータに基づくROAS」を出すと、管理画面とは別の物差しが手に入ります。考え方は、utm_campaign などでGA4の購入を広告キャンペーンに紐づけ、GA4の実売上 ÷ DTSの広告費 で実態ROASを計算する、という流れです。
この結合の具体的なSQLや、なぜ管理画面ROASが過大評価になりやすいのかは、別記事で詳しく解説しています。P-MAXの数字を本気で評価したい方は、こちらとセットで読むのがおすすめです。
ポイントは、完璧なアトリビューションを目指すことではありません。管理画面のROASと、GA4実売上ベースのROASを並べて眺めるだけで、「この数字、ちょっと盛れてるかも」という違和感に気づけるようになる。それだけで予算配分の判断はかなり健全になります。
注意:取れない指標もある・新規/既存の判別など
最後に、BigQueryで分析を始める前に頭に入れておきたい限界をまとめておきます。
- 検索語句単位の費用は基本的に取れません。 P-MAXは検索カテゴリーのインサイトは出ても、語句ごとの完全な費用・コンバージョン内訳は提供されないのが通常です。「どのキーワードが効いたか」を語句単位で断定することはできません。
- 新規顧客と既存顧客の判別は、DTSのデータ単体では困難です。 新規顧客獲得の最適化機能を使っていても、BigQueryに流れてくる数値だけで一件ずつ新規/既存を切り分けるのは難しく、GA4やショップ側の顧客データとの突合が必要になります。
- チャネル別の費用配分は粒度に制約があります。 提供される場合でも完全な内訳とは限らず、バージョンによって変わります。
- 数値の単位(マイクロ単位かどうか)はテーブルごとに違うことがあります。 集計前に必ず1〜2行を実データで確認してください。
これらを知らずに集計すると、「取れていないだけ」なのに「効果がゼロ」と誤読してしまうことがあります。出てきた表の背後にある制約を意識することが、P-MAX分析では特に大事です。
まとめ
P-MAXは管理画面がブラックボックスになりがちですが、BigQueryのData Transfer Serviceを使えば、少なくとも次のことができるようになります。
- 日別・アセットグループ別・(取れる範囲で)チャネル別に、費用とコンバージョンを自由な切り口で集計する
- 管理画面ROASだけでなく、GA4の実売上と突合した実態ROASという別の物差しを持つ
- 「取れない指標がある」という前提を踏まえ、数字を過信せずに予算配分を判断する
完璧な内訳が見えるわけではありませんが、「霧の向こうが少しだけ見える」ようになるだけでも、P-MAXの運用判断はずいぶん変わります。まずはDTSの連携を済ませ、日別の推移を1本のSQLで出すところから始めてみてください。テーブル名やカラムの細部は変わりやすいので、必ず最新の公式ドキュメントとご自身のデータセットのスキーマを確認しながら進めるのが、遠回りに見えていちばんの近道です。