ECのKPIツリーは「数字の一覧」ではない
ECのKPIツリーとは、売上や粗利のような最上位指標を、現場が動かせる要因まで計算式で分解したものです。ダッシュボードに指標を並べるだけでは、 売上が下がった理由も、次に何を直すべきかも決まりません。
たとえば売上が前月を下回ったとき、「集客が減った」「購入率が落ちた」「注文単価が下がった」を 同じ階層で切り分けられれば、広告、サイト改善、商品企画のどこに手を入れるかが決まります。 KPIツリーの目的は、数字を網羅することではなく、結果指標と打ち手の因果仮説を接続することです。
この記事ではツリーの作り方に集中します。経営会議で優先する指標そのものを選びたい場合は、EC/D2Cで最初に見るKPIの絞り方を先に参照してください。
最上位を売上と粗利のどちらに置くか
最初に決めるのはツールではなく、経営上の問いです。成長量を管理したいなら売上、 値引き・返品・原価を含めて稼ぐ力を管理したいなら粗利を最上位に置きます。 実務では、売上ツリーと粗利ツリーを並べて持つと、成長と採算を混同せずに済みます。
| 最上位指標 | 答えたい問い | 主な分解先 | 注意点 |
|---|---|---|---|
| 純売上 | どの顧客・商品・導線が成長を作ったか | 注文数、平均注文額、セッション、CVR | 税・送料を含む「総売上」と定義を混ぜない |
| 粗利 | 売上のうち、商品原価を引いて何が残ったか | 純売上、売上原価、商品・顧客別の粗利率 | 商品原価の未登録・過去原価の上書きに注意する |
| 貢献利益 | 広告や配送など変動費まで引いて何が残ったか | 粗利、広告費、決済手数料、変動配送費 | 会計上の粗利と社内管理指標を別名で管理する |
Shopify公式の定義では、純売上は商品売上から値引きと返品を差し引いた値で、 粗利は純売上から売上原価を差し引いた値です。税・送料・追加手数料を含むTotal salesとは別物です。 自社の会計基準に合わせる場合も、まずシステム標準の定義との差分を書き残します。
売上を分解するKPIツリーと計算式
ECの売上は、次の2方向から分解すると原因を探しやすくなります。
分解A:購買行動から見る
純売上 = 注文数 × 平均注文額(AOV)
注文数 = セッション数 × 購入率(CVR)
AOV = 商品売上(値引き後・返品前)÷ 注文数この分解はサイト改善と相性がよく、売上変化を「流入量」「購入率」「注文単価」に切り分けられます。 ただし、GA4のセッションとShopifyの注文は計測主体・タイムゾーン・同意状況が異なるため、 掛け算が完全一致することを目的にしません。行動の方向性はGA4、受注金額はShopifyを基準にし、 差分の許容方法を決めます。
分解B:顧客構成から見る
純売上 = 新規顧客売上 + 既存顧客売上
新規顧客売上 = 新規購入者数 × 新規AOV
既存顧客売上 = リピート購入者数 × リピート頻度 × リピートAOVこの分解は獲得と継続の責任を分けるのに向きます。「売上は伸びたが、新規広告への依存が強まった」 「購入者数は横ばいだが、既存顧客の頻度が上がった」といった構造が見えます。 新規・既存の判定は注文時点までの購入履歴で行い、顧客マスタの現在値だけで過去を再判定しないようにします。
ツリーの末端は、担当者が動かせる指標にする
- セッション数:チャネル別流入、広告クリック、自然検索流入
- CVR:商品詳細閲覧率、カート投入率、決済開始率、購入完了率
- AOV:購入点数、商品単価、セット率、値引き率
- リピート:2回目購入率、購入間隔、休眠復帰率
「ブランド力」のように直接観測できない概念は、ツリーの末端に置きません。 指名検索、自然流入、新規顧客アンケートなど、観測可能な代理指標へ落とします。
粗利を分解するKPIツリーと計算式
売上ツリーだけでは、値引きや低粗利商品の販売で「伸びているように見える」状態を検知できません。 粗利側では、売上の質を分解します。
純売上 = 総商品売上 - 値引き - 返品
粗利 = 純売上 - 売上原価(COGS)
粗利率 = 粗利 ÷ 純売上
管理上の貢献利益 = 粗利 - 広告費 - 決済手数料 - 変動配送費 - その他変動費貢献利益は会社ごとの管理指標です。倉庫費、送料無料負担、ポイント、返品処理費など、 どこまでを変動費に含めるかを合意し、会計上の粗利と同じ名前で呼ばないようにします。
粗利低下を切り分ける順番
- 純売上が落ちたのか、粗利率が落ちたのかを分ける
- 粗利率なら、商品構成・値引き率・返品率・原価のどれが動いたかを見る
- 商品構成なら、カテゴリ・SKU・新規/既存顧客・販売チャネルへ降りる
- 最後に施策、在庫、価格、広告配分の変更履歴と突き合わせる
原価が商品マスタの現在値しかない場合、過去の粗利が原価更新のたびに変わることがあります。 注文明細に販売時点原価を保持するか、原価履歴を有効期間付きで管理すると再現性が上がります。
指標辞書を先に作る
KPIツリーを図だけで終わらせないために、各ノードを指標辞書へ登録します。 同じ「売上」でも、税・送料・キャンセル・返品を含めるかで数字は変わります。
| 項目 | 記入例 | 決める理由 |
|---|---|---|
| 指標名・説明 | 純売上:値引き・返品後の商品売上 | 会議で同じ言葉を使う |
| 式 | 総商品売上 - 値引き - 返品 | BIとSQLの実装を一致させる |
| 粒度 | 注文明細 × 売上/返品発生日 | 集計重複を防ぐ |
| 除外条件 | テスト注文、取消、社内購入 | 担当者ごとの暗黙ルールをなくす |
| データ源 | Shopify注文・返金・注文明細 | 正本を明確にする |
| オーナー | EC事業責任者 | 定義変更の承認者を決める |
| 更新・確定時点 | 日次更新、月次は締め後に確定 | 速報値と確定値を区別する |
指標辞書と物理データを接続する考え方は、統合オントロジーの設計で詳しく解説しています。
Shopify・GA4・広告データの実装例
ツリーは1枚でも、データの正本は役割ごとに分けます。受注と返金はShopify、サイト行動はGA4、 広告費は各広告媒体または会計側を使い、DWHで日付・通貨・チャネル名を揃えます。
最小のデータモデル
- order_lines:注文ID、顧客ID、SKU、数量、商品売上、値引き、販売時原価
- refund_lines:返金ID、元注文ID、SKU、返金額、返金処理日
- customers:顧客ID、初回注文日時、獲得チャネル
- ga4_funnel_daily:日付、チャネル、セッション、商品閲覧、カート、購入イベント
- ad_spend_daily:日付、媒体、キャンペーン、費用、クリック
日次KPIマートのSQL例
次は考え方を示す簡略例です。実際には返金の計上日、税、通貨、キャンセル状態を自社定義に合わせます。
with order_daily as (
select
order_date as date,
sum(gross_item_sales) as gross_sales,
sum(discount_amount) as discounts,
sum(return_amount) as returns,
sum(cost_of_goods_sold) as cogs,
count(distinct order_id) as orders
from analytics.order_line_finance
where is_test_order = false
group by 1
),
funnel_daily as (
select date, sum(sessions) as sessions
from analytics.ga4_funnel_daily
group by 1
)
select
o.date,
o.gross_sales - o.discounts - o.returns as net_sales,
(o.gross_sales - o.discounts - o.returns) - o.cogs as gross_profit,
safe_divide(o.gross_sales - o.discounts, o.orders) as aov,
safe_divide(o.orders, f.sessions) as observed_session_cvr
from order_daily o
left join funnel_daily f using (date)実装前に固定する4つの境界
- 日付:注文日と返金日をどちらの期間に計上するか
- タイムゾーン:Shopifyストア、GA4プロパティ、DWHの基準を揃える
- 通貨:ストア通貨・決済通貨・レポート通貨の換算時点を決める
- 識別子:Shopify注文ID・顧客ID・商品variant IDを分析キーとして保持する
具体的な連携方式はShopifyとBigQueryの連携方法とGA4をBigQueryに入れた後の実務を参照してください。
会議でKPIツリーを使う運用
KPIツリーは作成時より、定例会議での使い方が重要です。会議では全ノードを順に読むのではなく、 上から差分を見て、異常がある枝だけを降ります。
会議前
- 前週・前月・計画との差分を同じ条件で計算する
- データ遅延、原価未登録、返金未反映を品質フラグとして表示する
- 価格改定、キャンペーン、在庫切れなどの変更履歴を添える
会議中
- 最上位の差分を確認する
- 差分への寄与が大きい枝を特定する
- 事実と仮説を分けて記録する
- 次回までの打ち手、担当者、確認指標を1つに絞る
会議後
実行した施策とKPIの変化を紐付けます。ツリーの枝で説明できない変化が続くなら、 新しい指標を無条件に足すのではなく、式・粒度・データ品質・因果仮説の順に見直します。
よくある失敗と修正方法
- 足し算と掛け算が混在している — 注文数×AOVと、新規売上+既存売上は別の切り口です。枝を交差させず、並列のビューに分けます。
- GA4の購入金額を会計上の売上として使う — 行動計測には欠損や同意の影響があります。受注金額の正本はコマース・会計データに置きます。
- 返品を注文日に遡及するか返金日に計上するか決めていない — 速報と月次確定でルールが変わらないよう、指標辞書に日付基準を書きます。
- 末端が担当者の行動につながらない — 「顧客満足」を置いて終わらず、返品理由、再購入、問い合わせ分類など観測可能な指標へ落とします。
- 全指標を毎週レビューする — 上位の異常から枝を降り、意思決定に必要な範囲だけを見ます。
作成チェックリスト
- 最上位指標が、今期の経営判断と一致している
- 親子が式で接続され、単位が一致している
- 各末端に担当部署と具体的な打ち手がある
- 指標辞書に式、粒度、除外条件、正本、オーナーがある
- ShopifyとGA4の差分を異常ではなく計測境界として説明できる
- 原価未登録、返金遅延、テスト注文を検知できる
- 会議で「どの枝を見て、何を決めたか」を残せる
参考にした公式一次情報
- Shopify Help Center: Finance reports — 総商品売上、値引き、返品、純売上、総売上の定義
- Shopify Help Center: Profit reports — 商品原価、粗利、粗利率を扱う際の前提
- Shopify Help Center: Analytics data points reference — Shopify Analyticsの指標・ディメンション定義
- Google for Developers: Measure ecommerce — 商品閲覧、カート、決済、購入、返金イベントの実装仕様
- Google for Developers: Set up a purchase event — purchaseイベントのtransaction_id、value、currency、itemsの設定例
まとめ
- KPIツリーは指標一覧ではなく、結果を打ち手まで式で分解する設計図
- 売上は「セッション×CVR×AOV」と「新規+既存」の2方向で見る
- 粗利は純売上、原価、商品構成、値引き、返品まで分解する
- 指標辞書で式、粒度、除外条件、正本、オーナーを固定する
- 会議では上位から異常のある枝だけを降り、担当と打ち手を決める
