【ITニュース解説】Shopify to GA4 without GTM: native events plus a server-side Measurement Protocol fallback
2026年09月26日に「Dev.to」が公開したITニュース「Shopify to GA4 without GTM: native events plus a server-side Measurement Protocol fallback」について初心者にもわかりやすく解説しています。
ITニュース概要
ShopifyとGA4の連携はGTMなしで実現でき、商品閲覧や購入などのイベントを簡単に送れる。しかし、ブラウザ側の要因でデータ損失があるため、サーバーサイドのMeasurement Protocolを導入し正確な購入数を計測することが重要だ。これにより、より信頼性の高い分析が可能になる。
ITニュース解説
Shopifyストアを運営する際、Google Analytics 4 (GA4) の設定にはGoogle Tag Manager (GTM) を使うのが一般的だが、必ずしも必要ではない。Shopifyの「Google & YouTube販売チャネル」を連携するだけで、GA4のECサイト向けイベントをネイティブに送信できる。この設定は非常に簡単で、数分で完了する。
このネイティブ連携によって、GA4にはユーザーの行動に関する様々なイベントが自動的に記録される。例えば、ページが表示された際には「page_view」、特定の商品ページを閲覧した際には「view_item」、商品をカートに追加した際には「add_to_cart」、カートページを閲覧した際には「view_cart」、購入手続きを開始した際には「begin_checkout」、配送情報や支払い情報を入力した際にはそれぞれ「add_shipping_info」「add_payment_info」といったイベントが送信される。そして、注文が完了し支払いが行われると、「purchase」イベントが売上、税金、送料などの詳細情報とともにGA4に送られる。これによって、商品の閲覧から購入までの完全な購入ファネルのデータを追跡できる。
しかし、このネイティブ連携だけでは得られない情報も存在する。例えば、注文ごとの利益や原価、決済手数料、純利益といった詳細な財務データはGA4では追跡できない。また、広告クリックによる正確なコンバージョンアトリビューションもGA4の役割ではなく、Google広告の拡張コンバージョンなどの別の仕組みが必要になる。さらに、複数回の購入にわたる顧客生涯価値(LTV)を追跡するには、GA4のユーザーID実装やCRMとの連携が別途必要となる。
GA4とShopifyを連携させる手順は次の通りである。まず、GA4プロパティを作成する必要がある。これはanalytics.google.comから「管理」→「作成」→「プロパティ」と進み、ストアのタイムゾーンと通貨を正確に設定する。通貨が一致しないと、後で収益データが誤って表示される可能性があるため注意が必要である。次に、プロパティ内で「データストリーム」から「ウェブ」ストリームを追加し、ストアのURLを入力して「測定ID」(G-から始まるID)をコピーする。この際、「拡張計測機能」が有効になっていることを確認する。これにより、スクロールや外部リンククリックなどの基本的なユーザー行動が自動的に計測される。
次に、Shopify管理画面に移動し、「販売チャネル」から「Google & YouTube」を選択してインストールする。重要なのは、GA4プロパティを所有するGoogleアカウントと同じアカウントでShopifyのチャネルを連携することである。異なるアカウントで連携すると、GA4プロパティが表示されず、接続できない場合がある。正しく接続が完了すると、GA4プロパティの測定IDの横に「接続済み」と表示される。
連携後、データが正しく収集されているかを確認する。GA4の「リアルタイムレポート」を開き、別のタブで自身のストアを操作してみると、30秒以内にアクティブユーザーとして表示され、アクセスしているページのパスが確認できるはずである。また、100%割引コードなどを使ってテスト注文を行い、GA4のリアルタイムレポートで30〜60秒以内に「purchase」イベントが記録されるかを確認する。さらに詳細なイベントのパラメータを確認したい場合は、GA4の「管理」→「DebugView」を開き、ストアのURLに「?gtm_debug=x」を付けてアクセスすると、ほぼリアルタイムでイベントとその詳細なパラメータが確認できる。
初期設定として、いくつかのGA4の設定変更を推奨する。まず、「データ設定」→「データ保持」で、イベントデータの保持期間をデフォルトの2ヶ月から最長である14ヶ月に変更する。これにより、前年比のデータ比較が可能になる。この設定は遡って適用されないため、早期に行うべきである。次に、「データ設定」→「データ収集」で「Googleシグナル」を有効にすると、ログインしているGoogleユーザーからの集計データに基づいて、クロスデバイスレポートやユーザー属性レポートが利用できるようになる。また、「プロパティ設定」→「プロダクトリンク」→「Search Console」でGoogle Search Consoleを連携すると、検索クエリデータがGA4レポートに取り込まれる。最後に、「イベント」画面で「purchase」イベントを「キーイベントとしてマーク」すると、Google広告にインポートしてコンバージョンとして利用できるようになる。
ここからが、本来のエンジニアリング的な課題である。Shopifyのネイティブ連携によるイベントは、顧客のブラウザからGA4に送信される。しかし、SafariのITP(Intelligent Tracking Prevention)、各種広告ブロッカー、iOSの追跡制限といったプライバシー保護機能によって、購入イベントの一部がGA4に到達しない問題が発生する。Shopifyでは注文が記録されているのに、GA4ではその購入イベントが計測されないという「ずれ」が生じるのである。
このブラウザ側のイベント損失を解決するのが「サーバーサイドレイヤー」、具体的にはGA4の「Measurement Protocol」の活用である。Measurement Protocolは、サーバーから直接GA4の収集エンドポイントにHTTPS POSTリクエストを送信する仕組みで、ブラウザの状態やクッキー、広告ブロッカーの影響を受けない。
サーバーサイドでの購入イベント送信のアーキテクチャは、Shopifyの「orders/paid」ウェブフックをトリガーとして利用する。このウェブフックが発火すると、Make.com(n8n、AWS Lambda、Cloudflare Workerなどの自動化ツールでも可能)のようなツールを介して、GA4のMeasurement Protocolエンドポイントにデータが送信される。
この設定には、GA4の「管理」→「データストリーム」→該当のストリーム→「Measurement Protocol API secrets」で生成するAPIシークレットが必要になる。このシークレットは一度しか表示されないため、コピーして保管しておく。
POSTリクエストの具体的な構造は、エンドポイントが「https://www.google-analytics.com/mp/collect?measurement_id=G-XXXXXXXXXX&api_secret=YOUR_API_SECRET」となり、Content-Typeは「application/json」である。ペイロード(送信するデータ本体)はJSON形式で、顧客ID (client_id)、イベント名 (purchase)、トランザクションID (transaction_id)、購入金額 (value)、通貨 (currency)、税金 (tax)、送料 (shipping)、そして購入された各アイテムの詳細(商品ID、商品名、数量、価格)が含まれる。
ここで重要な注意点が二つある。一つは、value、tax、shipping、quantity、priceといった数値データは、JSONペイロード内で引用符で囲まずに数値として送信しなければならないことである。引用符で囲んで送信すると、GA4はリクエスト自体は2xxの成功ステータスで受け取るものの、イベントをサイレントに破棄し、検証エラーも返さないため、データが正しく記録されない。開発中は、collectの前に/debug/mp/を付けたデバッグエンドポイント(例: https://www.google-analytics.com/debug/mp/collect)を使用すると、検証エラーメッセージが返され、問題の特定に役立つ。
もう一つの注意点はclient_idである。この値は、GA4がユーザーのセッションを識別し、イベントを紐付けるために使用される。Shopifyの顧客IDをclient_idとして使用すると、サーバーサイドで送信された購入イベントは、ユーザーがブラウザで起こしたこれまでの行動(商品閲覧やカート追加など)のセッションとは紐付かない。その結果、GA4のアトリビューションレポートでは、その購入が「直接アクセス」として扱われる場合がある。もし、ブラウザ側の行動とサーバーサイドの購入イベントを同じセッションに紐付けたい場合は、チェックアウト時にユーザーのブラウザから取得できる「_ga」クッキーの値をclient_idとしてサーバー側に渡す必要がある。正確な購入数と収益数だけを重視するのであれば、Shopifyの顧客IDを使用しても問題はない。
両方のレイヤー(ネイティブとサーバーサイド)が同じ注文に対して購入イベントを送信すると、GA4では重複したイベントが記録される可能性がある。GA4にはMetaのCAPIのようにtransaction_idによる重複排除機能がないためである。実際にはブラウザ側のイベント損失が多いため、多くのストアではわずかな過剰計上は許容される。しかし、これが許容できない場合は、ShopifyのGoogle & YouTubeチャネルからの購入イベント送信を無効にし、購入イベントは完全にサーバーサイドで処理し、ネイティブ連携は上部のファネルイベント(閲覧、カート追加など)のみに限定するというクリーンな方法も考えられる。テスト注文を行い、リアルタイムレポートでサーバーサイドからの購入イベントが正しく記録されるかを確認することが重要である。
オプションとして、GA4とGoogle広告を連携させることもできる。GA4の管理画面からGoogle広告アカウントをリンクし、パーソナライズド広告を有効にすると、リマーケティングオーディエンスが利用可能になる。その後、Google広告側で「目標」→「コンバージョン」→「インポート」からGA4プロパティの「購入キーイベント」をインポートすると、Google広告キャンペーンがGA4の購入データに基づいて最適化されるようになる。サーバーサイド連携により、この購入データはブラウザ側のみのデータよりも正確で完全なものとなる。
データが収集された後、実際に有用なGA4レポートがいくつかある。「集客」→「トラフィック獲得」レポートでは、各チャネルからのセッション数と購入数を比較し、どのチャネルが実際にコンバージョンに貢献しているかを把握できる。「エンゲージメント」→「ページとスクリーン」レポートでは、閲覧数が多いにもかかわらずカート追加率が低い商品ページを見つけることができ、商品ページの最適化のヒントになる。「収益化」→「チェックアウトジャーニー」レポートでは、決済ステップでの離脱が多い場合は操作性や信頼性の問題、住所入力での離脱が多い場合はUXの問題など、チェックアウトプロセスにおける問題点を特定できる。「探索」→「ファネル探索」レポートでは、商品閲覧から購入までのファネル(例: view_item → add_to_cart → begin_checkout → purchase)を構築し、各ステップの移行率を前月などと比較することで、問題が発生しているステップを特定できる。
導入から1週間程度経過したら、データの健全性をチェックすることが推奨される。GA4のセッション数はShopifyのストア訪問者数と大まかに一致するはずである。購入数とShopifyの注文数との間に多少のずれは予想されるが、サーバーサイドレイヤー導入後の改善度合いは、導入前の自身のベースラインと比較して評価すべきである。トラフィックのiOSユーザーや広告ブロッカー使用率によってずれの大きさは異なるため、他社の平均値と比較するのではなく、自身の改善を見るのが重要である。平均セッション時間が全体的に30秒を下回る場合は、ボットによるアクセスやフィルタ設定の誤りの可能性が高く、サイトが悪いとは限らない。また、エンゲージメントセッション(10秒以上の滞在、コンバージョン達成、または2ページ以上の閲覧があったセッション)は、従来のバウンス率に相当する指標として活用できる。
もしサーバーサイドレイヤー導入後も購入数が不足していると感じる場合は、APIシークレットが正しいか、Measurement IDが本番環境のデータストリームを指しているか、JSONペイロードの実行履歴にサイレントな失敗がないかなどを順に確認すべきである。ShopifyのウェブフックはMeasurement Protocolだけでなく、Meta CAPIやGoogle拡張コンバージョン、さらには損益計算書への連携など、複数のシステムに同時にデータを送ることも可能である。