1店舗なら、GA4を開いて数字を見る。

10店舗なら、Spreadsheetへ貼り付けて何とかする。

では、1,000店舗を超えたらどうするか。

私は現在、1,000店舗を超える小売サイトのアクセスデータを、キャンペーン単位で定例集計しています。

必要なのは、店舗ごとのユーザー、セッション、PV。さらに流入をアプリ、Googleビジネスプロフィール、その他などへ分類し、最終的には店舗別に比較できる形へまとめることです。

GA4 Data APIやGASを使えば自動化できます。

でも、実際にやってみて一番難しかったのはAPIではありませんでした。

「毎月、同じ意味の数字を作る」ためのルールを固定すること。

大量データの集計では、コードより集計仕様の方が重要です。

元になるデータは、GA4だけではない

この集計では、GA4の数字だけ見ても完成しません。

大きく3種類のデータを組み合わせます。

店舗マスター

店舗IDと店舗名など、対象店舗の基準になるデータです。

施策対象リスト

今回どの店舗で、どの施策を実施しているかを確認します。

GA4データ

Data APIで、対象URL・期間・指標・流入元などを取得します。

この3つを照合して初めて、

「対象1,100店舗超について、施策期間中のアクセスを同じ定義で集計する」

ことができます。

APIから数字が取れた=集計完了、ではありません。

自動化する前に、集計仕様を文章にする

私はまず、コードを書く前に次を決めます。

  • 対象URLの規則
  • 除外URL
  • 対象期間
  • 店舗IDの取り方
  • 対象店舗の確定方法
  • users / sessions / viewsの定義
  • source / mediumの分類
  • 欠損時の扱い
  • (other)やデータ品質の確認方法

ここが曖昧なままGASを書くと、間違った数字を高速で作る仕組みができます。

自動化の前に、「この条件なら今月も来月も同じ数字になる」と説明できる状態にします。

最終表は、こんな形になる

実際の納品形式は案件に合わせますが、構造としてはたとえば次のようになります。

store_id store_name app users app sessions app views GBP users GBP sessions GBP views other users
0001 店舗A 120 145 180 32 38 45 18
0002 店舗B 98 110 150 25 28 35 12

クライアントが欲しいのはAPIレスポンスではありません。

店舗ごとに比較し、異常や傾向を確認できる形です。

だから、取得用の形と、読むための形を分けます。

Raw → Clean → Calc → Pivot → Final に分ける

定例集計のSpreadsheetは、役割ごとに分けています。

Raw

APIから取得した元データ。

原則、人が直接編集しません。

Clean

店舗ID、URL、source / mediumなどを揃えます。

Calc

業務上必要なカテゴリへ再分類したり、計算列を作ったりします。

Pivot

店舗×流入カテゴリのように、確認しやすい形へ変換します。

Final

提出用です。

この分離のメリットは、どこで数字が変わったか追えることです。

Finalの数字がおかしければ、Pivot、Calc、Clean、Rawと戻れます。

一枚のシートにすべての数式を詰め込むより、検証しやすくなります。

source / mediumを、そのまま提出しない

GA4から取れるsource / mediumは、分析には必要ですが、そのままでは業務上読みにくいことがあります。

たとえばレポートでは、

  • app
  • GBP
  • other

の3分類で十分でも、元データには複数のsource / mediumがあります。

そこで、

apps / chirashi → app
Googleビジネスプロフィール由来の条件 → GBP
それ以外 → other

のように、集計ルールを定義します。

重要なのは、分類そのものより、後から同じルールを再現できるように残すことです。

1,000店舗あると「1件のミス」が見えなくなる

少数店舗なら、数字を見て「この店だけゼロなのはおかしい」と気づけます。

1,000店舗を超えると、異常が埋もれます。

そこで、毎回いくつかの検算を入れます。

  • 対象店舗数はマスターと一致するか
  • 対象なのにデータ0の店舗は何件か
  • マスターにないstore_idが紛れていないか
  • 想定外のsource / mediumが増えていないか
  • 全体PVと店舗別集計の規模感が大きくズレていないか
  • (other)が出ていないか
  • サンプリングやデータ品質の注意表示はないか

自動化したから確認しないではなく、自動化したからこそ確認項目も固定するという考え方です。

「最大PV/分」を調べたとき、取得条件の違いも問題になった

別の分析では、施策期間中のアクセス集中を調べるため、1分単位の最大PVを確認しました。

単日条件では最大22PV/分。

複数日をまとめた取得では最大30PV/分という結果が出て、データ品質の状態も異なりました。

このとき大事だったのは、「22と30、どちらが本物?」と決めることではなく、

期間・粒度・取得条件に加え、サンプリングや(other)などデータ品質の状態を揃えて比較する必要があると確認したことです。

大量データでは、クエリ範囲や粒度によってサンプリング等の処理条件が変わり、表示結果に差が生じる場合があります。

条件変更は、コードではなく「仕様変更」として残す

実務では、途中で条件が変わります。

「この流入だけ対象にしたい」

「やっぱり元のルールへ戻したい」

「来月から対象URLが変わる」

普通にあります。

ここでスクリプトだけ修正すると、半年後に、

「なぜ8月だけ数字が違う?」

となります。

だから私は、

  • 変更日
  • 変更内容
  • 変更理由
  • 適用開始月

を履歴として残します。

集計ロジックはコードではなく、分析仕様の一部です。

ユーザー数の合計は、別途考える

店舗別ユーザーを足しても、サイト全体のユーザー数とは一致しません。

同じ人が複数店舗を見ていれば、店舗ごとに重複するからです。

つまり最終表を作るとき、

「各店舗UsersのSUM」

「対象店舗全体のUnique users」

は別の数字です。

このような指標の性質まで考えないと、きれいな表なのに意味が違うレポートができあがります。

自動化の価値は「時短」より「再現性」

Data APIやGASを使えば、もちろん作業時間は減ります。

でも、私が一番価値を感じているのはそこではありません。

先月はAさんがこの条件で集計。

今月はBさんが別のフィルタ。

来月は前月ファイルをコピーして一部だけ修正。

手作業だと、こういうズレが起こります。

仕組みにすると、

毎月、同じ条件で、同じ加工をして、同じ確認をする

状態を作れます。

これは時短より、比較可能性の問題です。

自動化して、人が「読む」時間を残す

最終的にやりたいのは、Spreadsheetを完成させることではありません。

なぜこの店舗だけ伸びたのか。

設置施策との関係はありそうか。

異常値ではないか。

前月と比較して何が変わったか。

そこを人が考えることです。

機械に任せたいのは、毎月同じルールで数字を作るところ。

人が時間を使いたいのは、その数字から次の判断をするところ

1,000店舗を超える集計を続ける中で、私の中ではこの分担がかなり明確になりました。

関連する知見

レポート自動化だけでなく、集計仕様・検算・判断できる形まで設計します。

継続マーケティング支援について