mcpField
C
customer-lifetime-value

customer-lifetime-value

github.com/finsilabsデータ・データベース6089 回インストール1 週間前に更新
リポジトリ

customer-lifetime-value について

顧客生涯価値を測定し、EC の意思決定に活用するためのスキルです。店舗運営者向けに、各プラットフォームの分析、予測スコアリング、顧客セグメント、維持施策を案内し、ヘッドレスストア向けの独自モデルも扱います。

主な機能

  1. 01過去・予測 CLV のガイダンス
  2. 02プラットフォーム別の分析手順
  3. 03CLV に基づく顧客セグメント
  4. 04離脱リスク顧客への復帰フロー
  5. 05独自のパラメトリック・BG/NBD モデル

活用シーン

  1. 01CLV を基に顧客獲得 CAC の上限を設定
  2. 02数値基準で VIP 顧客層を定義
  3. 03離脱リスクの高い優良顧客にアプローチ
  4. 04ロイヤルティ・維持施策の ROI を測定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill customer-lifetime-value

インストール後、Claude Code で/customer-lifetime-valueを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

tile.json
evals/bg-nbd-probabilistic-clv-model-with-life/
criteria.json
task.md
evals/parametric-clv-and-churn-probability-cal/
criteria.json
task.md
evals/retention-automation-and-clv-based-tier-/
criteria.json
task.md

詳細

顧客生涯価値

概要

顧客生涯価値(CLV)は、顧客がストアと取引を続ける期間にわたって期待される純収益の合計を示します。これにより、新規顧客獲得への支出、顧客維持への投資、顧客ランクの管理について、より適切な判断ができます。ほとんどのプラットフォームでは、過去の CLV(現時点までの累計支出)を標準機能で計算できます。予測 CLV や解約リスクのスコアリングには、専用の分析アプリ(Klaviyo、Metorik、Triple Whale)を使用するか、顧客数が 10k+ のストアではカスタムモデルを構築してください。

このスキルを使う場面

  • 期待されるリターンに基づいて、顧客獲得チャネルの CAC 目標を設定するとき
  • 定量的な基準が必要な VIP ランクプログラムを構築するとき
  • 解約する可能性が高い顧客を予測し、呼び戻しの自動化を実行するとき
  • 顧客維持プログラム(ロイヤルティポイント、VIP 特典)の ROI を計算するとき
  • 過去の支出だけでなく、予測される将来価値に基づいて顧客をセグメント化するとき

基本手順

ステップ 1:プラットフォームを特定し、適切な CLV ツールを選択する
プラットフォーム過去の CLV予測 CLV
Shopify組み込み機能:Admin → Analytics → Customers(顧客の生涯支出を表示)予測スコアリングには Triple Whale、Lifetimely、または Klaviyo
WooCommerceMetorik または WooCommerce Analytics → Customers レポート解約予測には Metorik Pro、CLV ベースのフローには Klaviyo 連携
BigCommerce組み込みの顧客分析機能。コホート分析には Google Analytics 4予測 CLV には Klaviyo または Metorik
Custom / Headless注文データベースに対して SQL クエリを作成過去のデータに対して、パラメトリックモデルまたは BG/NBD モデルを構築

ステップ 2:過去の CLV にアクセスして追跡する

過去の CLV は、顧客から得たすべての収益の合計です。各プラットフォームでは標準機能で確認できます。

Shopify
  1. Admin → Analytics → Reports → Customers over time に移動します。コホート別の顧客数、注文数、収益が表示されます
  2. Admin → Customers → [Customer] に移動します。各顧客プロフィールには、支出合計、注文数、最終注文日が表示されます
  3. 一括エクスポートするには、Customers → Export に移動します。CSV には顧客ごとの Total Spent と Number of Orders が含まれます

より高度な CLV レポート:

  • App Store から Lifetimely をインストールします。コホートベースの LTV カーブ、顧客獲得チャネル別の投資回収期間、予測される将来の支出を確認できます
  • Triple Whale をインストールします。顧客獲得元別の CLV、コホート分析、アトリビューションモデリングが含まれます
WooCommerce
  1. WooCommerce → Analytics → Customers に移動します。顧客ごとの生涯価値、注文数、平均注文額が表示されます
  2. Lifetime value の降順で並べ替えると、上位の顧客を確認できます
  3. 日付範囲で絞り込むと、特定の顧客獲得コホートの CLV を確認できます

より詳細な分析には Metorik:

  • Metorik をインストールします(WooCommerce REST API 経由で接続します)
  • Metorik の顧客ダッシュボードには、CLV の分布、コホート維持率が表示され、解約リスクの高い顧客が自動的に通知されます
  • Metorik Pro では、解約確率のスコアリングと、呼び戻しメールを自動送信するトリガーが追加されます
BigCommerce
  1. 顧客の支出概要を確認するには、Analytics → Customers に移動します
  2. 個別の顧客プロフィールには、注文数の合計と生涯支出が表示されます
  3. コホート分析を行うには、Google Analytics 4 を接続し、User Lifetime レポートを使用します

ステップ 3:CLV ベースの顧客セグメントを設定する

CLV を測定できるようになったら、価値ランクごとに異なるメッセージを届けられるよう、セグメントを作成します。

Shopify + Klaviyo
  1. Klaviyo で Lists & Segments → Create Segment に移動します
  2. 「VIP Customers」セグメントを作成します:Customer → Predicted CLV is greater than $500(Klaviyo は Shopify ストアの予測 CLV を自動で計算します)
  3. 「At Risk - High Value」セグメントを作成します:Customer → Predicted CLV > $200 AND Last order date is more than 90 days ago
  4. これらのセグメントを、ターゲットを絞ったメールフローのオーディエンスとして使用します

Klaviyo の予測分析(有料プランで利用可能):

  • Klaviyo では、プロフィールごとに Predicted CLV、Churn Risk、Predicted Next Order Date が表示されます
  • Analytics → Predictive Analytics または個々の顧客プロフィールで確認できます
  • カスタムコードを使わずに、これらの予測をセグメントフィルターとして使用できます
WooCommerce + Klaviyo
  1. WordPress.org から Klaviyo for WooCommerce をインストールします
  2. Klaviyo が顧客の購入履歴を自動で同期します
  3. 前述と同じ CLV ベースのセグメントを作成します

ステップ 4:CLV と解約リスクに基づいてリテンションを自動化する

セグメントを定義したら、各層に対応する自動フローを作成します。

価値が高く、解約リスクのある顧客向けの呼び戻しフロー:

Klaviyo(すべてのプラットフォーム):

  1. Flows → Create Flow → Win-Back に移動します
  2. トリガーを設定します:「At Risk - High Value」セグメントに顧客が入る
  3. シーケンスを設定します:
    • 0 日目:パーソナライズされたメール — 購入履歴に基づく商品レコメンデーションを添えた「お会いできず寂しく思っています」
    • 7 日目:少額の特典(送料無料または 10% 割引)を案内するメール
    • 14 日目:「創業者」またはカスタマーサクセスチームからの最後のメール
  4. 顧客が購入した場合はフローを停止します(フローフィルターに「このフローの開始以降、注文が 0 回」を追加します)

VIP 層の認定:

  1. VIP セグメント(CLV > $500 または注文 5 回以上)を作成します
  2. 顧客がセグメントに入ったら、限定特典を案内するパーソナライズされた「VIP になりました」メールを送信します
  3. Shopify では、Shopify Flow(Plus)またはタグ付けアプリを使って、顧客に vip タグを自動で付けます。このタグを使い、ストアフロントに VIP 専用コンテンツを表示します

カスタム/ヘッドレス

独自の CLV 計算を構築するストア向け:

// lib/clv.ts

// Simple parametric CLV prediction — practical for most stores
export function calculatePredictedCLV(inputs: {
  avgOrderValue: number;
  avgOrderFrequencyPerYear: number;
  avgCustomerLifespanYears: number;
  grossMarginRate: number;
}): number {
  const { avgOrderValue, avgOrderFrequencyPerYear, avgCustomerLifespanYears, grossMarginRate } = inputs;
  return avgOrderValue * avgOrderFrequencyPerYear * avgCustomerLifespanYears * grossMarginRate;
}

// Per-customer prediction from their actual order history
export async function predictCustomerCLV(customerId: string, projectionYears = 2): Promise<number> {
  const orders = await db.orders.findMany({
    where: { customerId, status: { notIn: ['cancelled', 'refunded'] } },
    orderBy: { createdAt: 'asc' },
  });
  if (orders.length < 2) return 0;  // Not enough history

  const dates = orders.map(o => o.createdAt.getTime());
  const tenureDays = (dates[dates.length - 1] - dates[0]) / 86400000;
  const avgIntervalDays = tenureDays / (orders.length - 1);
  const purchasesPerYear = 365 / avgIntervalDays;
  const aov = orders.reduce((sum, o) => sum + o.subtotalCents / 100, 0) / orders.length;

  // Reduce projection for customers who haven't ordered recently
  const daysSinceLast = (Date.now() - dates[dates.length - 1]) / 86400000;
  const effectiveYears = daysSinceLast < 90 ? projectionYears : projectionYears * 0.5;

  return aov * purchasesPerYear * effectiveYears * 0.50;  // 50% gross margin
}

// Churn probability based on recency vs. typical purchase cadence
export async function calculateChurnProbability(customerId: string): Promise<number> {
  const orders = await db.orders.findMany({
    where: { customerId, status: { notIn: ['cancelled', 'refunded'] } },
    orderBy: { createdAt: 'desc' },
  });

  if (orders.length === 0) return 0.95;
  if (orders.length === 1) return 0.65;

  const daysSinceLast = (Date.now() - orders[0].createdAt.getTime()) / 86400000;
  const avgInterval = orders.slice(0, -1).reduce((sum, o, i) =>
    sum + (o.createdAt.getTime() - orders[i + 1].createdAt.getTime()) / 86400000, 0) / (orders.length - 1);

  // Sigmoid: churn probability rises as recency exceeds 2× typical interval
  const recencyRatio = daysSinceLast / avgInterval;
  return Math.min(0.99, Math.max(0.01, 1 / (1 + Math.exp(-2 * (recencyRatio - 2)))));
}

// Nightly job: update CLV scores and trigger win-back automation
export async function runChurnPreventionNightly() {
  const activeCustomers = await db.customers.findMany({ where: { orderCount: { gte: 2 } } });

  for (const customer of activeCustomers) {
    const [churnProbability, predictedCLV] = await Promise.all([
      calculateChurnProbability(customer.id),
      predictCustomerCLV(customer.id),
    ]);

    await db.customers.update({ where: { id: customer.id }, data: { churnProbability, predictedCLV } });

    // High-value, high-churn-risk: trigger win-back
    if (churnProbability > 0.70 && predictedCLV > 200) {
      const alreadyTriggered = await db.winBackTriggers.findFirst({
        where: { customerId: customer.id, createdAt: { gte: new Date(Date.now() - 90 * 86400000) } },
      });
      if (!alreadyTriggered) {
        await klaviyo.triggerFlow(customer.email, 'win-back-high-value');
        await db.winBackTriggers.create({ data: { customerId: customer.id } });
      }
    }
  }
}

顧客数が 10 万人以上のストア向け: パラメトリックアプローチよりも大幅に精度の高い予測を行うには、BG/NBD 確率モデル(Python の lifetimes ライブラリ)を使用します。

from lifetimes import BetaGeoFitter, GammaGammaFitter
from lifetimes.utils import summary_data_from_transaction_data

# Build RFM summary and fit BG/NBD model
rfm = summary_data_from_transaction_data(orders_df, 'customer_id', 'created_at', 'subtotal_cents')
bgf = BetaGeoFitter(penalizer_coef=0.001)
bgf.fit(rfm['frequency'], rfm['recency'], rfm['T'])

ggf = GammaGammaFitter(penalizer_coef=0.001)
ggf.fit(rfm[rfm['frequency'] > 0]['frequency'], rfm[rfm['frequency'] > 0]['monetary_value'])

rfm['predicted_clv_12mo'] = ggf.customer_lifetime_value(bgf, rfm['frequency'], rfm['recency'], rfm['T'], rfm['monetary_value'], time=12, discount_rate=0.01)

ベストプラクティス

  • カスタム実装を構築する前に、Shopify/WooCommerce では Klaviyo の予測 CLV を使用します — Klaviyo のモデルは適切に調整されており、すぐに利用できます
  • CLV スコアは少なくとも週 1 回更新します — 顧客の行動は変化するため、古いスコアではリテンションキャンペーンのターゲットを誤る原因になります
  • セグメントでは予測 CLV と過去の支出額を分けます — これらは異なる問いに答えます。過去の支出額は過去の価値を示し、予測 CLV は投資先を示します
  • 獲得チャネルごとに、CLV に基づく CAC の上限を設定します — Google Ads 経由の顧客の平均 CLV が粗利率 50% で $80 の場合、持続可能な CAC の上限は $40 です
  • 解約確率を実際の結果に照らして調整します — 6 か月前の予測と実際に解約した顧客を比較し、モデルの予測が過大または過小であればしきい値を調整します

よくある落とし穴

問題解決策
ごく少数の非常に高額な注文によって CLV モデルが過大評価されるパラメトリックモデルでは平均 AOV ではなく注文額の中央値を使用します。外れ値となる注文が 1 件あるだけで、平均値は大きく偏ります
休暇を取っている顧客に呼び戻しメールが送信される呼び戻しメールのトリガー条件として、前回購入から「60 日以上」を設定します。短い間隔は通常のことであり、解約の兆候ではありません
CLV の計算にキャンセル済みの注文が含まれる常に status NOT IN ('cancelled', 'refunded') で絞り込みます。キャンセル済みの注文があると、収益が過大評価されます
ロイヤル顧客の予測 CLV が過去の CLV を下回るBG/NBD では、在籍期間の変数(T)がアカウント作成日ではなく初回購入日から測定されていることを確認します

関連スキル

  • @customer-segmentation
  • @referral-program
  • @personalization-engine

コメント