referral-program について
referral-programは、顧客紹介プログラムの企画、設定、効果測定を支援するスキルです。既存ツールの選定や独自構築に加え、報酬、不正対策、告知、分析を扱います。
主な機能
- 01プラットフォーム別のツール選定
- 02紹介報酬とメールの設定
- 03自分自身への紹介の不正防止
- 04コンバージョンと獲得コストの分析
- 05紹介導線と告知の計画
活用シーン
- 01Shopifyストアで双方に報酬を設定
- 02段階的な報酬で紹介を促進
- 03購入後メールに紹介追跡を追加
- 04紹介と有料チャネルの獲得コストを比較
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill referral-programインストール後、Claude Code で/referral-programを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
tile.jsonevals/cookie-based-referral-attribution/criteria.jsontask.mdevals/referral-fraud-signal-detection/criteria.jsontask.mdevals/tiered-rewards-and-first-purchase-logic/criteria.jsontask.md詳細
紹介プログラム
概要
紹介プログラムでは、既存顧客が新規顧客を紹介すると報酬を受け取れる仕組みによって、既存顧客を顧客獲得チャネルにできます。ReferralCandy や Referral Hero などの紹介アプリを使えば、固有リンクの生成、紹介者と被紹介者の双方への報酬、不正検出、購入後のメール送信トリガーを、カスタムコードなしで処理できます。これらのツールで対応できない階層型の報酬ロジック、CRM 連携、不正利用対策ルールが必要な場合に限り、カスタム紹介システムを構築してください。
このスキルを使用するタイミング
- 「紹介した人に $10、紹介された人に $10」を提供する友達紹介プログラムを構築するとき
- 成功した紹介の件数に応じて報酬が増える、階層型の報酬を追加するとき
- 自己紹介や複数アカウントによる不正利用で、紹介報酬の予算が圧迫されているとき
- 紹介プログラムの CAC を他の顧客獲得チャネルと比較して測定するとき
- 紹介トラッキングを Klaviyo の購入後メールフローと連携するとき
基本手順
ステップ 1:プラットフォームを確認し、適切な紹介ツールを選択する
| プラットフォーム | 推奨ツール | 理由 |
|---|---|---|
| Shopify | ReferralCandy | eコマース向けに特化しており、顧客ごとの紹介リンク生成、紹介者と被紹介者双方への報酬、購入後メールのトリガー、不正検出に対応 |
| Shopify | Referral Hero | 現金、ギフトカード、ストアクレジット、カスタム報酬など、報酬の種類が柔軟。紹介メールフロー向けの Klaviyo 連携も充実 |
| Shopify | Smile.io | ロイヤルティポイントと紹介の仕組みを1つのアプリに統合。両方を利用したい場合に最適 |
| WooCommerce | ReferralCandy または Referral Hero | どちらも WooCommerce プラグインを提供。REST API 経由で注文をトラッキングし、報酬を発行 |
| BigCommerce | ReferralCandy | BigCommerce App Marketplace から利用可能 |
| カスタム/ヘッドレス | 紹介トラッキングと報酬ロジックを構築 | プラットフォーム連携や不正利用対策ルールがニーズに合わない場合に必要 |
ステップ 2:プラットフォーム別のセットアップ
Shopify
オプション A:ReferralCandy(推奨 — 紹介プログラム一式を提供)
-
Shopify App Store から ReferralCandy をインストールします
-
Shopify ストアを接続します。ReferralCandy が既存顧客を自動的にインポートします
-
報酬の仕組みを設定します:
- ReferralCandy → Rewards → Set Rewards に移動します
- 紹介者の報酬タイプを選択します。PayPal 経由の現金、ストア割引、カスタムギフトから選べます
- 被紹介者の報酬タイプを選択します。チェックアウト時に適用される割引コードを選びます
- 例:紹介者には $10 のストアクレジット、被紹介者には初回注文で使える $10 の割引を提供します
-
紹介メールの送信タイミングを設定します:
- Post-Purchase Email → Settings に移動します
- 購入から1〜3日後に送信するよう設定します(顧客の満足度が高い時期です)
- ブランドに合わせてメールテンプレートと紹介リンクをカスタマイズします
-
ReferralCandy は次の処理を自動的に行います:
- 顧客ごとに固有の紹介リンクを生成します
- 30日間の Cookie 有効期間内でクリックと成果をトラッキングします
- 自己紹介を検出し、報酬の発行をブロックします
- 被紹介者がリンク経由で登録すると、割引コードを記載したウェルカムメールを送信します
-
ReferralCandy → Analytics でパフォーマンスを確認します:
- 送信した紹介、クリック、登録、購入の件数
- 紹介経由の売上
- 上位の紹介者(VIP 向けのアプローチに活用)
オプション B:Referral Hero(Klaviyo を優先する場合)
- App Store から Referral Hero をインストールします
- Referral Hero → Campaigns → Create Campaign で設定します
- Referral Hero は Klaviyo と連携します。紹介が成約すると、報酬通知メール用の Klaviyo フローがトリガーされます
- 報酬タイプには、ストアクレジット(Shopify の割引コード経由で発行)、現金(PayPal)、ギフトカードがあります
購入後メールに紹介の導線を追加する(Klaviyo):
- Klaviyo で Post-Purchase flow に移動します
- 3日後のステップに、紹介リンクを記載したメールを追加します
- ReferralCandy と Referral Hero はどちらも Klaviyo 連携に対応しており、
{{ customer.referral_link }}を差し込みタグとして挿入できます
WooCommerce
WooCommerce 向け ReferralCandy:
- WordPress.org または ReferralCandy の連携ページから ReferralCandy プラグインをインストールします
- ReferralCandy の API 認証情報を使って WooCommerce ストアを接続します
- ReferralCandy が WooCommerce の注文を追跡し、購入を紹介者に自動で関連付けます
- ReferralCandy のダッシュボードで報酬とメール送信のタイミングを設定します(上記の Shopify と同じです)
WooCommerce 向け Referral Hero:
- Referral Hero WooCommerce プラグインをインストールします
- キャンペーンを設定し、報酬の種類を WooCommerce クーポンコードに設定します
- Referral Hero が登録時に紹介された人それぞれに固有のクーポンコードを発行し、購入に至った際に紹介者へ通知します
AutomateWoo を使った手動の紹介プログラム:
- 完全に自分で管理したい場合は、AutomateWoo を使って紹介メールを送信し、割引コードを発行します
- AutomateWoo には AutomateWoo → Workflows → Referrals に、組み込みの紹介ワークフローテンプレートがあります
BigCommerce
BigCommerce 向け ReferralCandy:
- Apps → Search "ReferralCandy" に移動してインストールします
- 設定は Shopify 版と同じです
- ReferralCandy が BigCommerce の注文を追跡し、報酬として BigCommerce の割引コードを発行します
カスタム/ヘッドレス
ヘッドレスストアフロントでは、段階的な報酬と不正検知を備えた紹介追跡機能を構築します:
// lib/referrals.ts
import { randomBytes } from 'crypto';
// Generate a unique, human-friendly referral code per customer
export async function getOrCreateReferralCode(customerId: string): Promise<string> {
const existing = await db.referralCodes.findFirst({ where: { customerId } });
if (existing) return existing.code;
const customer = await db.customers.findUnique({ where: { id: customerId } });
const prefix = (customer!.firstName ?? 'USER').slice(0, 4).toUpperCase();
const suffix = randomBytes(3).toString('hex').toUpperCase();
const code = `${prefix}${suffix}`; // e.g., JANE3A9F
await db.referralCodes.create({ data: { customerId, code } });
return code;
}
// Middleware: capture referral code from ?ref= URL param into a 30-day cookie
export function referralTrackingMiddleware(req: Request, res: Response, next: NextFunction) {
const code = req.query.ref as string;
if (code && !req.cookies.ref_code) {
res.cookie('ref_code', code, { maxAge: 30 * 86400000, httpOnly: true, secure: true, sameSite: 'lax' });
}
next();
}
// Tiered rewards: reward amount increases as referrer accumulates successful referrals
const REFERRAL_TIERS = [
{ minReferrals: 0, referrerRewardCents: 1000, refereeRewardCents: 1000 }, // $10/$10
{ minReferrals: 5, referrerRewardCents: 1500, refereeRewardCents: 1000 }, // $15/$10 after 5
{ minReferrals: 10, referrerRewardCents: 2500, refereeRewardCents: 1500 }, // $25/$15 after 10
];
function getReferralReward(successfulReferrals: number) {
return [...REFERRAL_TIERS].reverse().find(t => successfulReferrals >= t.minReferrals)!;
}
// On new account creation: attribute referral, run fraud checks
export async function onCustomerCreated(customerId: string, refCode: string | undefined) {
if (!refCode) return;
const referralCode = await db.referralCodes.findFirst({ where: { code: refCode } });
if (!referralCode || referralCode.customerId === customerId) return; // block self-referral
// Fraud check: same shipping address as referrer
const [referee, referrer] = await Promise.all([
db.customers.findUnique({ where: { id: customerId }, include: { addresses: true } }),
db.customers.findUnique({ where: { id: referralCode.customerId }, include: { addresses: true } }),
]);
const refereeAddr = referee?.addresses[0]?.addressHash;
const referrerAddr = referrer?.addresses[0]?.addressHash;
if (refereeAddr && refereeAddr === referrerAddr) return; // same address = block
await db.referrals.create({ data: { referrerId: referralCode.customerId, refereeId: customerId, code: refCode, status: 'pending' } });
}
// On referee's first purchase: issue rewards to both parties
export async function onRefereeFirstPurchase(refereeId: string, orderId: string) {
const referral = await db.referrals.findFirst({ where: { refereeId, status: 'pending' } });
if (!referral) return;
const order = await db.orders.findUnique({ where: { id: orderId } });
if (!order || order.subtotalCents < 2500) return; // require minimum $25 order
const referrerStats = await db.referralCodes.findFirst({ where: { customerId: referral.referrerId } });
const tier = getReferralReward(referrerStats?.totalReferrals ?? 0);
await Promise.all([
issueStoreCredit(referral.referrerId, tier.referrerRewardCents, `Referral reward`),
issueStoreCredit(refereeId, tier.refereeRewardCents, 'Welcome reward — referred by a friend'),
]);
await db.referrals.update({ where: { id: referral.id }, data: { status: 'rewarded', orderId } });
await db.referralCodes.update({ where: { customerId: referral.referrerId }, data: { totalReferrals: { increment: 1 } } });
}
紹介プログラムの分析用 SQL:
-- Monthly referral program performance
SELECT
DATE_TRUNC('month', r.created_at) AS month,
COUNT(*) AS total_referrals,
COUNT(CASE WHEN r.status = 'rewarded' THEN 1 END) AS successful_referrals,
ROUND(100.0 * COUNT(CASE WHEN r.status = 'rewarded' THEN 1 END) / NULLIF(COUNT(*), 0), 1) AS conversion_rate_pct,
SUM(CASE WHEN r.status = 'rewarded' THEN rc.total_rewards_cents END) / 100.0 AS rewards_paid_usd
FROM referrals r
JOIN referral_codes rc ON r.referrer_id = rc.customer_id
GROUP BY 1
ORDER BY 1 DESC;
ステップ 3:紹介プログラムを宣伝する
紹介リンクは見つけやすい場所に表示する必要があります。目立たない場所に埋もれていると、顧客に見つけてもらえません:
- 購入後の確認ページ — 注文確認ページに紹介 CTA を追加します:「ご注文はいかがでしたか?友達に紹介すると、お二人に $10 を進呈します」
- 購入後のメール — 購入から 3 日後に送信するメールに紹介リンクを含めます(ReferralCandy と Klaviyo はどちらもこれを自動でサポートしています)
- 顧客アカウントページ — リンクと紹介履歴を表示する「友達を紹介」セクションを追加します
- トランザクションメール — 配送確認メールに控えめな紹介 CTA を含めます
ステップ 4:紹介プログラムの ROI を測定する
| 指標 | 測定方法 |
|---|---|
| 紹介コンバージョン率 | 成功した紹介数 / 紹介リンクの合計クリック数 |
| 紹介 CAC | 支払った報酬の合計 / 成功した紹介数 |
| 紹介経由の売上 | 紹介経由の注文にタグを付け、売上合計を比較します |
| 紹介顧客と非紹介顧客の CLV | 90 日後と 12 か月後のコホートを比較します |
紹介 CAC を有料獲得チャネルと比較します。最適化された紹介プログラムでは、有料チャネルと比べて CAC が通常 20~30%低くなります。
ベストプラクティス
- ゼロから構築する前に ReferralCandy を利用する — リンク生成、アトリビューション、不正検知、報酬の発行を数分で処理できます
- 報酬の対象となる初回注文の最低金額を設定する — $1 のテスト注文による報酬の不正取得を防ぎます
- 1 回限りの割引コードではなく、ストアクレジットを使う — ストアクレジットを利用するには顧客が再訪する必要があり、2 回目の購入機会を生み出します
- 30 日間のアトリビューション期間を設定する — 期間が短いと、コンバージョンまで時間がかかる顧客を取りこぼします
- 紹介された人が購入したら、すぐに報酬通知メールを送信する — 紹介者は報酬が付与されたことを知らないことがよくあります。また、これによりさらなる紹介を促せます
- 同じ配送先住所への紹介をブロックする — 同じ世帯内での自己紹介を示す最も明確な不正の兆候です
よくある落とし穴
| 問題 | 解決策 |
|---|---|
| 複数のメールアカウントを使った自己紹介不正 | 同じ配送先住所からの紹介をブロックします(最も有効なシグナルです)。ReferralCandy はこれを自動的に検出します |
| 紹介リンクがクーポン情報フォーラムで共有される | 紹介経由の顧客群の CLV を監視します。オーガニック経由より大幅に低い場合は、最低注文金額を引き上げます |
| 30 日間の返品期間が終わる前にストアクレジットを発行する | 返品を考慮し、紹介された顧客の注文から 30 日後まで報酬の発行を遅らせます |
| 後からクリックされた広告によって紹介 Cookie が上書きされる | 最初の紹介クリックを別途保存します。ReferralCandy は紹介にファーストクリックアトリビューションを使用します |
| 紹介メールの開封率が低い | 顧客満足度が最も高い購入後 3 日目に、レシートメールではなく専用メールで紹介を促します |
関連スキル
- @affiliate-program
- @customer-lifetime-value
- @customer-segmentation
- @email-marketing-automation