はじめに

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_sourcemanual_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広告の成果をどの数字を基準に評価していますか。