はじめに
LINE広告は、Yahoo!広告やGoogle広告と並んで中小ECでも使われる機会が増えてきましたが、計測のしづらさという点ではかなり手強い媒体です。理由のひとつは、LINE広告マネージャーが表示するコンバージョン数が、媒体側のアトリビューション(クリックスルー・ビュースルーを含む独自ロジック)に基づく自己申告値である点にあります。
自分が支援していた某アパレル系ECでも、LINE広告マネージャー上のコンバージョン数が月48件と表示されていたのに、GA4の実測では32件しか確認できない、というケースがありました。この差を無視してCPAを計算すると、本来のCPAより3割ほど安く見えてしまいます。「LINE広告は意外と安く回っている」と錯覚したまま予算を増やすと、後で利益が合わなくなる典型的なパターンです。
本記事では、LINE広告の費用データをBigQueryに取り込み、GA4の実コンバージョンと結合して、CPA・ROASを実態ベースで算出する手順を紹介します。媒体の数字とGA4の数字、どちらも見たうえで判断できる状態を作るのが狙いです。
なぜLINE広告は計測がズレやすいのか
具体的な手順に入る前に、ズレの主な発生源を整理しておきます。原因がわかっていると、後の数字の解釈がぶれにくくなります。
- アトリビューションの違い: LINE広告は媒体独自の計測期間・モデルでコンバージョンをカウントします。GA4のデフォルト(データドリブンや最終クリックなど)とは集計ロジックが異なるため、そもそも一致しないのが前提です。
- ビュースルーコンバージョン: 広告を見ただけ(クリックなし)で後日購入した分を媒体側がカウントすることがあります。GA4の流入ベースの集計とは噛み合いません。
- LINE内ブラウザ(アプリ内ブラウザ): LINEアプリ内で広告をタップすると、外部Safari/Chromeではなくアプリ内ブラウザで開くことが多く、Cookieやセッションの扱いが通常ブラウザと異なる場合があります。これがGA4側の取りこぼしにつながることがあります。
これらを完全にゼロにすることはできません。だからこそ、媒体の数字を鵜呑みにせず、GA4×BigQueryで「自社が確認できる実コンバージョン」を別途持っておくことに意味があります。
費用データの取り込み
CPA・ROASを出すには、コンバージョン(GA4側)と費用(LINE広告側)の両方が必要です。GA4のBigQueryエクスポートには広告費は含まれないため、LINE広告の費用データは別途取り込みます。取り込み方法は大きく2通りです。
手動(CSVエクスポート)
LINE広告マネージャーから日次・キャンペーン別のレポートをCSVでダウンロードし、BigQueryのテーブルにロードする方法です。月数回の分析であれば、まずはこれで十分です。最低限、以下の列があれば結合できます。
| 列 | 内容 | 用途 |
|---|---|---|
| date | 配信日 | 日付での結合・集計 |
| campaign_name | キャンペーン名 | UTMとの突き合わせ |
| spend | 消化金額(円) | CPA・ROASの分母 |
| impressions | 表示回数 | 参考指標 |
| clicks | クリック数 | CTR等の参考指標 |
API(自動連携)
頻度高く更新したい場合は、LINE広告のAPIで費用データを取得してBigQueryへ書き込む方法があります。Pythonなどでスクリプトを書き、日次でスケジュール実行する構成です。ただしAPIの利用には申請や認証情報が必要で、仕様も更新されるため、実装前に必ず最新の公式ドキュメントで取得できる項目・認証フロー・レート制限を確認してください。
ここで重要なのは、CSV・APIどちらの場合も、後でUTMと突き合わせられるように campaign_name の表記を揃えておくことです。表記揺れがあると結合で取りこぼします。費用テーブルは、以下のような構造を想定します。
-- LINE広告 費用テーブル(CSV or API でロードする想定)
-- project.dataset.line_ads_cost
CREATE TABLE IF NOT EXISTS `project.dataset.line_ads_cost` (
date DATE, -- 配信日
campaign_name STRING, -- キャンペーン名(UTMと揃える)
spend INT64, -- 消化金額(円)
impressions INT64, -- 表示回数
clicks INT64 -- クリック数
);
GA4の実コンバージョンと結合する
次に、GA4のBigQueryエクスポートから、LINE広告経由のコンバージョン(ここでは purchase)を抽出します。LINE広告の流入をGA4側で識別するには、遷移先URLにUTMパラメータを付与しておく必要があります。媒体側で設定する例は次のとおりです。
utm_source=line
&utm_medium=paid_social
&utm_campaign={campaign_name}
utm_campaign には費用テーブルの campaign_name と同じ値が入るように設定するのが結合の前提です。これを踏まえて、GA4からLINE広告経由の購入を日付・キャンペーン別に集計します。
-- GA4 から LINE広告経由の購入を抽出・集計
WITH line_purchases AS (
SELECT
PARSE_DATE('%Y%m%d', event_date) AS date,
collected_traffic_source.manual_campaign_name AS campaign_name,
user_pseudo_id,
(SELECT value.int_value FROM UNNEST(event_params)
WHERE key = 'ga_session_id') AS ga_session_id,
ecommerce.purchase_revenue AS revenue
FROM `project.analytics_XXXXXXXXX.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260601' AND '20260630'
AND event_name = 'purchase'
AND collected_traffic_source.manual_source = 'line'
AND collected_traffic_source.manual_medium = 'paid_social'
)
SELECT
date,
campaign_name,
COUNT(*) AS conversions,
SUM(revenue) AS revenue
FROM line_purchases
WHERE campaign_name IS NOT NULL
GROUP BY date, campaign_name;
collected_traffic_source.manual_source と manual_medium でLINE広告経由に絞り込み、collected_traffic_source.manual_campaign_name をキャンペーン名として取り出しています。これがGA4側の「自社で確認できる実コンバージョン」です。
collected_traffic_sourceまわりの列名はGA4のバージョンによって異なる場合があるので、実装前に必ず最新の公式ドキュメントで列名を確認してください。
CPA・ROASを集計するSQL
GA4のコンバージョン・売上テーブルと、LINE広告の費用テーブルを、日付とキャンペーン名で結合してCPAとROASを算出します。
-- 実コンバージョン × 費用 で CPA・ROAS を算出
WITH ga4 AS (
SELECT
PARSE_DATE('%Y%m%d', event_date) AS date,
collected_traffic_source.manual_campaign_name AS campaign_name,
COUNTIF(event_name = 'purchase') AS conversions,
SUM(IF(event_name = 'purchase', ecommerce.purchase_revenue, 0)) AS revenue
FROM `project.analytics_XXXXXXXXX.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260601' AND '20260630'
AND collected_traffic_source.manual_source = 'line'
AND collected_traffic_source.manual_medium = 'paid_social'
GROUP BY date, campaign_name
),
cost AS (
SELECT
date,
campaign_name,
SUM(spend) AS spend,
SUM(clicks) AS clicks
FROM `project.dataset.line_ads_cost`
WHERE date BETWEEN '2026-06-01' AND '2026-06-30'
GROUP BY date, campaign_name
)
SELECT
c.campaign_name,
SUM(c.spend) AS spend,
SUM(g.conversions) AS conversions,
SUM(g.revenue) AS revenue,
ROUND(SAFE_DIVIDE(SUM(c.spend), SUM(g.conversions)), 0) AS cpa,
ROUND(SAFE_DIVIDE(SUM(g.revenue), SUM(c.spend)), 2) AS roas
FROM cost c
LEFT JOIN ga4 g
ON c.date = g.date
AND c.campaign_name = g.campaign_name
GROUP BY c.campaign_name
ORDER BY spend DESC;
費用テーブルを軸(LEFT JOIN)にしているのは、コンバージョンがゼロだったキャンペーンも消化金額として漏れなく拾うためです。SAFE_DIVIDE を使っているのは、コンバージョン0件のキャンペーンでゼロ除算エラーを避けるためです。CPAが極端に高い、あるいはNULLになっている行は、費用は出ているのに成果が確認できていないキャンペーンなので、まず見直すべき対象になります。
某アパレル系ECの6月のデータでこの集計を回したところ、媒体管理画面ベースのCPAが約1,900円だったキャンペーンが、GA4実測ベースでは約2,850円でした。約1.5倍の差です。この数字を前提に予算配分を見直したところ、別キャンペーンへの振り分けで全体のCPAを下げる判断ができました。
計測の落とし穴
最後に、LINE広告ならではの注意点を挙げておきます。数字の差を「計測ミス」と決めつける前に、これらを確認しておくと解釈を誤りにくくなります。
- アプリ内ブラウザでの取りこぼし: 前述のとおり、LINEアプリ内ブラウザはCookieやセッションの扱いが通常ブラウザと異なる場合があります。GA4の数字が媒体より少なめに出る一因になりがちなので、「GA4が常に正しい」とも限らない点は念頭に置いてください。あくまで媒体・GA4の両方を突き合わせるのが目的です。
- UTMの未付与・表記揺れ: 遷移先URLにUTMが付いていない、あるいはキャンペーン名の表記が費用テーブルと揃っていないと、結合で取りこぼします。流入が極端に少ないキャンペーンは、まずUTM設定を疑ってください。
- アトリビューション期間の違い: 媒体とGA4で計測ウィンドウが異なるため、月末付近の購入は集計タイミングで前後にズレることがあります。月単位で締めて比較するのが無難です。
- 少額・短期間での過剰な判断: コンバージョン数が一桁のうちは、1件のズレでCPA・ROASが大きく振れます。ある程度の件数がたまるまでは、数字を見つつも断定は控えめにするのが安全です。
なお、UTM設計やキャンペーン別ROASの考え方は、Google広告×GA4×BigQueryでキーワード別の本当のROASを出す記事でも触れています。媒体をまたいでCPA・ROASを横断的に見たい場合は、クロスチャネルROASダッシュボードの記事もあわせて参考にしてください。
まとめ
LINE広告のCPA・ROASを正確に計測するうえで出発点になるのは、「媒体管理画面の数字は自己申告であり、GA4の実測とはズレて当たり前」という前提に立つことです。どちらが正しいかではなく、両方を並べて差の理由を理解したうえで判断するのが現実的です。
手順としては、費用データをCSVまたはAPIでBigQueryに取り込み、GA4の実コンバージョンとUTM・日付・キャンペーン名で結合し、SAFE_DIVIDE でCPA・ROASを算出する、という流れになります。とくにアプリ内ブラウザの挙動やUTMの表記揺れは見落としやすいので、数字が合わないときはまずこの2点を疑うのがおすすめです。
自分としては、LINE広告は計測の難しさゆえに敬遠されがちですが、GA4×BigQueryで実態をつかめれば、十分に予算判断の土俵に乗せられる媒体だと感じています。皆さんは、LINE広告の成果をどの数字を基準に評価していますか。