customer-segmentation について
購買行動に基づく顧客セグメントの作成と、マーケティング施策への活用方法を説明する、EC マーケター向けのスキルです。Shopify、WooCommerce、BigCommerce と独自構成を扱い、RFM 分析や広告配信除外リストも紹介します。
主な機能
- 01購買行動に基づく顧客セグメント作成
- 02RFM スコアリングの活用
- 03セグメントとマーケティング施策の対応付け
- 04顧客データのエクスポートや同期
- 05広告配信除外リストの作成
活用シーン
- 01ライフサイクル段階別のメール施策
- 02VIP 向けの高価値顧客の特定
- 03既存購入者を除外して広告費を抑制
- 04獲得コホート間のリテンション比較
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill customer-segmentationインストール後、Claude Code で/customer-segmentationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
tile.jsonevals/cohort-retention-analysis-and-behavioral/criteria.jsontask.mdevals/rfm-scoring-and-segment-classification/criteria.jsontask.mdevals/segment-export-to-marketing-platforms-wi/criteria.jsontask.md詳細
顧客セグメンテーション
概要
顧客セグメンテーションでは、購入行動が似ているグループに顧客基盤を分け、マーケティングキャンペーン、プロモーション、商品レコメンデーションを的確にターゲティングします。Klaviyo、Omnisend、Metorik では、Shopify と WooCommerce 向けに、カスタム SQL を使わずにすぐ利用できる RFM 方式のセグメンテーションが提供されています。必要なセグメントロジックにプラットフォームのツールが対応していない場合に限り、カスタムのセグメンテーションシステムを構築してください。
このスキルを使う場面
- 顧客のライフサイクル段階(新規、アクティブ、離反リスクあり、離反済み)に応じてメールキャンペーンをパーソナライズする場合
- すでにコンバージョンした顧客への広告費の浪費を避けるため、除外リストを作成する場合
- VIP プログラムや先行アクセスキャンペーン向けに「優良顧客」を特定する場合
- どの獲得コホートが最も高い 90 日維持率を持つか分析する場合
- 行動セグメントを広告プラットフォーム(Meta、Google)と同期する場合
基本手順
ステップ 1:プラットフォームを特定し、適切なセグメンテーションツールを選ぶ
| プラットフォーム | 組み込みのセグメンテーション | 推奨ツール |
|---|---|---|
| Shopify | 基本:管理画面 → 顧客 → フィルター;高度:Klaviyo または Omnisend | メール + SMS には Klaviyo;コホート分析には Lifetimely |
| WooCommerce | WooCommerce Analytics → 顧客(基本的なフィルター) | Klaviyo + WooCommerce プラグイン;または分析には Metorik |
| BigCommerce | 顧客グループ(ティア別);Analytics → 顧客 | 行動セグメンテーションには Klaviyo |
| カスタム/ヘッドレス | SQL で RFM スコアリングを構築し、アクティベーションのため Klaviyo に同期 | プラットフォームにセグメンテーションツールがない場合に必要 |
ステップ 2:プラットフォーム固有のセットアップ
Shopify
オプション A:Shopify 管理画面のセグメント(基本、無料)
- 管理画面 → 顧客に移動します
- フィルターバーを使って、次の条件に基づくセグメントを作成します:
- 注文回数、購入総額、最終注文日
- メール購読状況、タグ、所在地
- 購入した商品
- フィルターを顧客セグメントとして保存します
- セグメントを CSV にエクスポートして、広告やメールキャンペーンで使用します
オプション B:Klaviyo(ライフサイクルセグメンテーションに推奨)
Klaviyo は Shopify と自動的に同期し、実際の購入データに基づく RFM 方式のセグメンテーションを提供します。
Klaviyo で作成する主なセグメント:
-
優良顧客(高価値、購入頻度が高い、購入時期が最近):
- ルール:
Ordered at least 3 timesANDLast order within 60 daysANDTotal spent > $200 - アクション:新商品の先行アクセス、VIP 特典、紹介プログラムへの招待
- ルール:
-
離反リスクあり — 高価値:
- ルール:
Total spent > $200ANDLast order 90–180 days ago - アクション:パーソナライズされたオファーを含む再購入促進フロー
- ルール:
-
最近の初回購入者:
- ルール:
Order count equals 1ANDFirst order within 30 days - アクション:オンボーディングシーケンス、2 回目の購入を促進
- ルール:
-
離反済み顧客:
- ルール:
Last order more than 180 days agoANDOrder count >= 2 - アクション:「お客様がいなくて寂しいです」というメッセージを含む再エンゲージメントキャンペーン
- ルール:
-
購入経験のない購読者:
- ルール:
Email subscriberANDOrder count equals 0 - アクション:ソーシャルプルーフと初回注文特典を含むウェルカムシリーズ
- ルール:
Klaviyo でセグメントを作成するには:
- Lists & Segments → Create Segmentに移動します
- フィルタービルダーを使って条件を追加します。Klaviyo には Shopify 固有のイベントを含む、150 種類以上の定義済みフィルタータイプがあります
- セグメントに分かりやすい名前を付けます(例:「離反リスクあり・高価値 — 90~180 日」)
- セグメントを Flow のトリガー、または Campaign のオーディエンスとして使用します
Klaviyo 予測分析(有料プラン):
- Klaviyo は顧客ごとに 予測 CLV、次回注文の予測日、離反リスクを自動計算します
- Analytics → Predictive Analyticsで確認できます
- これらの予測値を、カスタムコードなしでセグメントのフィルター条件として使用できます
WooCommerce
オプション A:Metorik(推奨の分析プラットフォーム)
- Metorikをインストールします(WooCommerce REST API経由で接続します)
- Metorik → Segments → Create Segmentに移動します
- 購入履歴、商品への関心、地域などを使って、ルールベースのセグメントを作成します
- MetorikがRFMスコアを自動で算出します
- セグメントをCSVにエクスポートするか、Klaviyo/Mailchimpに直接同期します
オプション B:WooCommerce向けKlaviyo
- WordPress.orgからKlaviyo: Email Marketing for WooCommerceをインストールします
- KlaviyoがWooCommerceの注文履歴を同期し、すべての顧客のプロフィールを作成します
- 上記のShopifyセクションで説明したものと同じライフサイクルセグメントを作成します
BigCommerce
段階別セグメント向けの顧客グループ:
- Customers → Customer Groups → Add Groupに移動します
- 購買行動のルールに基づいてグループを作成します:
- 「VIP」— 生涯購入額が500ドルを超える顧客
- 「リピーター」— 注文が3件以上の顧客
- グループごとに価格設定、カテゴリーへのアクセス、配送ルールを設定します
行動ベースのセグメントにはKlaviyoを使用します:
- Klaviyo for BigCommerceアプリをインストールします
- BigCommerceストアに接続します
- 購入履歴とイベントデータを使って、Klaviyoで行動ベースのセグメントを作成します
カスタム/ヘッドレス
SQLでRFMスコアを算出し、アクティベーション用にESPへ同期します:
-- PostgreSQL: Calculate RFM scores for all customers
WITH customer_rfm AS (
SELECT
customer_id,
EXTRACT(EPOCH FROM (NOW() - MAX(created_at))) / 86400 AS recency_days,
COUNT(id) AS frequency,
SUM(subtotal_cents) / 100.0 AS monetary
FROM orders
WHERE status NOT IN ('cancelled', 'refunded')
GROUP BY customer_id
),
rfm_scored AS (
SELECT
customer_id,
recency_days, frequency, monetary,
NTILE(5) OVER (ORDER BY recency_days DESC) AS r_score, -- Lower recency = higher score
NTILE(5) OVER (ORDER BY frequency ASC) AS f_score,
NTILE(5) OVER (ORDER BY monetary ASC) AS m_score
FROM customer_rfm
)
SELECT
customer_id, r_score, f_score, m_score,
r_score + f_score + m_score AS rfm_total,
CASE
WHEN r_score >= 4 AND f_score >= 4 AND m_score >= 4 THEN 'champions'
WHEN r_score >= 3 AND f_score >= 3 AND m_score >= 3 THEN 'loyal_customers'
WHEN r_score >= 4 AND f_score <= 2 THEN 'recent_customers'
WHEN r_score <= 2 AND f_score >= 4 AND m_score >= 4 THEN 'cannot_lose_them'
WHEN r_score <= 2 AND f_score >= 3 THEN 'at_risk'
WHEN r_score = 1 AND f_score <= 2 THEN 'lost'
ELSE 'needs_attention'
END AS segment
FROM rfm_scored;
// Sync a segment to Klaviyo — batched at 100 profiles per request
export async function syncSegmentToKlaviyo(segmentCustomers: Customer[], klaviyoListId: string) {
const BATCH_SIZE = 100;
for (let i = 0; i < segmentCustomers.length; i += BATCH_SIZE) {
const batch = segmentCustomers.slice(i, i + BATCH_SIZE);
await fetch(`https://a.klaviyo.com/api/lists/${klaviyoListId}/relationships/profiles/`, {
method: 'POST',
headers: {
Authorization: `Klaviyo-API-Key ${process.env.KLAVIYO_PRIVATE_KEY}`,
'Content-Type': 'application/json',
revision: '2024-10-15',
},
body: JSON.stringify({
data: batch.map(c => ({
type: 'profile',
attributes: { email: c.email, first_name: c.firstName, last_name: c.lastName },
})),
}),
});
}
}
// Export suppression list for Meta Ads — hash emails before sending
export async function exportSuppressionListForMeta(lookbackDays = 30): Promise<string[]> {
const recentBuyers = await db.orders.findMany({
where: { createdAt: { gte: new Date(Date.now() - lookbackDays * 86400000) }, status: 'completed' },
select: { customerEmail: true },
distinct: ['customerEmail'],
});
return recentBuyers.map(({ customerEmail }) => {
const { createHash } = require('crypto');
return createHash('sha256').update(customerEmail.toLowerCase().trim()).digest('hex');
});
}
ステップ 3:セグメントをアクションに結び付ける
各セグメントには、明確なマーケティングアクションを設定する必要があります:
| セグメント | 推奨アクション |
|---|---|
| チャンピオン | VIP向け先行アクセス、紹介プログラムへの招待、ウィンバック割引は不要 |
| ロイヤルカスタマー | ロイヤルティプログラムへの登録、レビュー依頼、次のティアへのアップセル |
| 初回購入直後の顧客 | 2回目の購入を促すメールシリーズ(初回注文の7日後に送信) |
| 離反リスクあり — 高価値 | 「しばらくご無沙汰しています」というメッセージを添えたパーソナライズドなウィンバック |
| 失うわけにはいかない顧客 | 直接のアプローチ、大幅なオファー(20%オフ)、創業者からの個別メール |
| 休眠/離反 | 低コストの再エンゲージメント(ニュースレター、製品のお知らせ)。アクティブなキャンペーンから除外 |
ステップ 4:有料広告向けの除外リストを作成する
獲得予算の無駄を避けるため、直近の購入者をMetaとGoogleの除外リストにアップロードします:
- Meta Business Manager:オーディエンス → オーディエンスを作成 → 顧客リスト → ハッシュ化したメールアドレスのCSVをアップロード
- Google Ads:オーディエンスマネージャー → カスタマーマッチ → メールリストをアップロード
- これらの除外リストは毎月更新します
ベストプラクティス
- セグメントを毎晩更新する — KlaviyoとMetorikでは自動で更新されます。カスタム構築の場合は、RFMのSQLを毎晩実行します
- まずRFMから始め、その後に行動シグナルを重ねる — 購入の最新性/頻度/金額が最も信頼できる基盤です。データが増えたら、カテゴリーへの関心やチャネルの好みを追加します
- ターゲティングリストと併せて、必ず除外リストを作成する — アクティブな顧客に再エンゲージメントキャンペーンを送ると、予算を無駄にし、顧客を不快にさせます
- キャンペーン送信前にセグメントの規模を検証する — セグメントの顧客数が0の場合、通常はロジックエラーを示しています。最小しきい値のチェックを設定します
- オファーの種類ごとに、どのセグメントの反応が最も良いかを追跡する — チャンピオンに割引が必要となることはほとんどありません。離反リスクのある顧客には、割引率より送料無料の方が効果的な場合があります
よくある落とし穴
| 問題 | 解決策 |
|---|---|
| チャンピオンのセグメントが毎月縮小する | チャンピオンは購入の最新性と頻度が高いことを条件とするため、顧客が自然に対象から外れます。長期的な関係管理には「ロイヤルカスタマー」も併用します |
| 1件の非常に高額な注文によってRFMスコアに偏りが生じる | Klaviyoの予測CLVはこの影響を緩和します。カスタム構築では、金額スコアに総購入額ではなく注文金額の中央値を使用します |
| セグメントをKlaviyoに同期するとプロフィールが重複する | 同期時は常にメールアドレスを主キーとして照合します。重複がある場合は、Klaviyoのプロフィール統合を使用します |
| コホート分析でリテンションの低下が見られるが、原因が不明 | 獲得チャネル別にコホートを分け、特定のチャネルがより質の低い顧客を獲得しているかを特定します |
Related Skills
- @customer-lifetime-value
- @personalization-engine
- @referral-program