returns-refund-policy について
returns-refund-policyは、商品カテゴリ、顧客ランク、商品状態に応じた返品・返金ルールを設定するEC事業者向けスキルです。各プラットフォームでの設定、返品期限の計算、ポリシーの告知、独自の評価ロジックを扱います。
主な機能
- 01カテゴリ別の返品期限設定
- 02手数料と返品不可商品の設定
- 03会員ランクによるポリシー上書き
- 04条件を満たす返品の自動承認
- 05期限計算とポリシー告知の案内
活用シーン
- 01返品対応の基準を統一
- 02商品カテゴリごとに異なるルールを設定
- 03会員向けに返品期限を延長
- 04監査可能な自動承認フローの構築
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill returns-refund-policyインストール後、Claude Code で/returns-refund-policyを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
tile.jsonevals/auto-approval-workflow-and-value-cap/criteria.jsontask.mdevals/policy-resolution-and-eligibility-evalua/criteria.jsontask.mdevals/policy-versioning-and-audit-trail/criteria.jsontask.md詳細
返品・返金ポリシーエンジン
概要
返品・返金ポリシーエンジンを使うと、商品カテゴリごとの異なる返品期間、特定の商品タイプに対する再入荷手数料、返品不可商品の除外、ロイヤルティ会員向けの延長期間など、ルールを自動的に適用できます。これにより、カスタマーサービスチームが返品リクエストを一件ずつ手動で判断する必要がなくなり、ポリシーを一貫して適用できます。多くのプラットフォームでは、返品アプリと商品タグ、顧客セグメントを組み合わせて、これらのルールを実装できます。
このスキルを使う場面
- カスタマーサービスがケースバイケースで対応しているため、返品の判断に一貫性がない場合
- 商品カテゴリ(電子機器、アパレル、消耗品など)ごとに異なる返品期間を設定する必要がある場合
- ロイヤルティ会員の返品期間を延長したり、再入荷手数料を免除したりする段階的な返品ポリシーを導入する場合
- ほとんどの返品を人手を介さずに処理する自動承認ワークフローを構築する場合
- コンプライアンスや法的要件により、返品ポリシーの監査とバージョン管理が求められる場合
基本手順
ステップ 1: プラットフォームを特定し、適切な返品ツールを選ぶ
| プラットフォーム | おすすめのツール | 理由 |
|---|---|---|
| Shopify | Loop Returns または AfterShip Returns | Loop は最も機能が充実しており、商品タイプごとのポリシー、再入荷手数料、返品不可商品のブロック、ロイヤルティティアによる上書きに対応しています |
| WooCommerce | ReturnGo または WooCommerce Returns and Warranty Requests | ReturnGo は商品カテゴリごとのカスタムポリシールールと自動承認ロジックに対応しています |
| BigCommerce | AfterShip Returns Center または Loop Returns | どちらもカテゴリごとのポリシールールと再入荷手数料に対応しています |
| カスタム/ヘッドレス | ポリシー評価エンジンを構築し、返品ラベルには Shippo を使用 | ポリシーをデータベースに保存し、返品リクエストの受信時にプログラムで評価します |
ステップ 2: 返品ポリシーのルールを定義する
ツールを設定する前に、ポリシーの一覧を明確に定義します。
| 商品カテゴリ | 返品期間 | 再入荷手数料 | 自動承認 | 備考 |
|---|---|---|---|---|
| デフォルト(アパレル、アクセサリー) | 配達日から30日 | 0% | はい | ほとんどの商品 |
| 電子機器 | 配達日から15日 | 15% | いいえ — 手動審査 | 開封済みの電子機器 |
| ファイナルセール | 0日 | — | いいえ | 返品不可 |
| VIP/ゴールド会員 | 配達日から60日 | 0% | はい | ロイヤルティティアによる上書き |
| 不良品/誤配送品 | 配達日から90日 | 0% | はい | 顧客に責任がない場合 |
ステップ 3: 返品アプリでポリシールールを設定する
Shopify — Loop Returns
- Shopify App Store から Loop Returns をインストールします
- Loop → Policy → Return Windows に移動します。
- デフォルト:30日
- 「Add Rule」をクリックし、「Product tag is 'electronics'」を設定 → 返品期間:15日
- 「Add Rule」をクリックし、「Product tag is 'final-sale'」を設定 → 返品期間:0日(返品不可)
- Shopify 管理画面で商品に該当するタグを付けます(Products → Tags)
- Loop → Policy → Restocking Fees に移動します。
- ルールを追加します:「Product tag is 'electronics'」→ 再入荷手数料:15%
- Loop → Policy → Customer Segments に移動します。
- ルールを追加します:「Customer tag is 'gold-member' or 'vip'」→ 返品期間の上書き:60日、再入荷手数料:0%
- Loop → Settings → Automation で、対象となる返品の自動承認を有効にします:「ポリシー条件を満たす返品を自動承認する」
- 返品が承認されると、Loop が返品ラベルを自動生成します
ポリシーのテスト:
- Loop の Policy Simulator(Loop → Policy → Test Policy)を使って、想定上の返品リクエスト(商品タイプ、顧客タグ、配達からの経過日数)に正しいルールが適用されることを確認します
WooCommerce — ReturnGo
- retgo.com(または WordPress.org)からReturnGoをインストールします
- ReturnGo → Return Policy に移動します:
- デフォルトの返品期間を設定します:30日
- 「Custom Rules」で、商品カテゴリーに基づくルールを追加します:
- カテゴリー「Electronics」→ 15日、15%の再入庫手数料、手動審査が必要
- カテゴリー「Final Sale」→ 0日(返品不可)
- 「Customer Rules」で、タグに基づく上書きルールを追加します:
- 顧客タグ「wholesale」→ 14日、10%の再入庫手数料
- 自動承認を設定します:ReturnGo → Automation →「Auto-approve returns that match policy」を有効にします
- 顧客として返品リクエストを作成し、ルールが正しく適用されることを確認します
WooCommerce でファイナルセールを設定する方法:
- 「final-sale」という商品カテゴリーまたはタグを作成します
- ReturnGo で、このカテゴリー/タグの商品を返品不可にするルールを追加します
- 商品ページに、商品バッジプラグインを使って「Final Sale — No Returns」というメッセージを表示します
BigCommerce — AfterShip Returns Center
- BigCommerce App Marketplace から AfterShip Returns Center をインストールします
- AfterShip → Policy に移動します:
- デフォルトの返品期間を設定し、商品タイプごとの例外を設定します
- AfterShip のポリシーエンジンでは、商品タグに基づく返品期間と自動承認ルールを設定できます
- 再入庫手数料について:AfterShip では有料プランに再入庫手数料の設定が含まれています
Step 4: 返品期間の計算を正しく行う
最も重要な設定は、返品期間の起点を注文日や発送日ではなく、配達日にすることです。
重要な理由:
- 配送には、サービスによって2~10日かかります
- 注文日を起点に30日間の返品期間を設定すると、顧客が実際に商品を返品できる期間が20日しか残らない場合があります
- 多くの消費者保護法(EUの14日間のクーリングオフ権、英国の14日間)は配達日を起点としています
返品アプリでこの設定を確認してください:
- Loop Returns:Loop → Settings → Return Window に移動し、「Starts from: Delivery Date」を確認します ✓
- ReturnGo:Settings → Policy に移動し、「Return window starts from: Delivered date」を確認します ✓
- AfterShip:Settings → Return Policy に移動し、「Start date: Order delivered date」を確認します ✓
返品アプリに配達を検知する追跡連携機能がない場合は、近似値として「注文日+配送業者の平均輸送日数」を使用してください。
Step 5: ポリシーを明確に伝える
- 返品ページ: ポリシーの一覧表を掲載した専用の
/returnsまたは/return-policyページを作成します。顧客は購入前にこのページを確認します - 商品ページ:「カートに追加」ボタンの近くに、「30日間返品無料」またはファイナルセール商品向けの「Final Sale — No Returns」という短い返品案内を表示します
- 注文確認メール: 返品ページへのリンクと、「30日間返品可能」という短い案内を記載します
- 返品期間終了前のリマインダー: 返品期間終了の7日前に自動メールを送信するよう設定します。Loop と AfterShip はどちらもこの機能に対応しています
Step 6: カスタム/ヘッドレス — ポリシー評価ロジック
// Return policy rules stored in database and evaluated programmatically
interface ReturnPolicy {
id: string;
name: string;
priority: number; // higher = evaluated first
conditions: {
productTags?: string[]; // match any of these tags
customerTags?: string[]; // match any of these customer tags
orderTags?: string[]; // e.g., ['final-sale']
};
windowDays: number; // 0 = no returns allowed
restockingFeePct: number; // 0–100
autoApprove: boolean;
}
async function evaluateReturnEligibility(params: {
orderId: string;
productId: string;
customerId: string;
returnReason: string;
deliveredAt: Date;
}): Promise<{
eligible: boolean;
policy: ReturnPolicy | null;
restockingFeeCents: number;
requiresManualReview: boolean;
daysRemaining: number;
reason?: string;
}> {
const order = await db.orders.findById(params.orderId);
const product = await db.products.findById(params.productId, { include: ['tags'] });
const customer = await db.customers.findById(params.customerId, { include: ['tags'] });
// Find highest-priority matching policy
const policies = await db.returnPolicies.findAll({ is_active: true }, { orderBy: ['priority', 'desc'] });
const policy = policies.find(p => {
const productMatch = !p.conditions.productTags?.length ||
p.conditions.productTags.some(tag => product.tags.includes(tag));
const customerMatch = !p.conditions.customerTags?.length ||
p.conditions.customerTags.some(tag => customer.tags.includes(tag));
const orderMatch = !p.conditions.orderTags?.length ||
p.conditions.orderTags.some(tag => order.tags?.includes(tag));
return productMatch && customerMatch && orderMatch;
}) ?? null;
if (!policy || policy.windowDays === 0) {
return { eligible: false, policy, restockingFeeCents: 0, requiresManualReview: false, daysRemaining: 0, reason: 'FINAL_SALE_OR_NO_POLICY' };
}
// Calculate days since delivery
const daysSinceDelivery = Math.floor((Date.now() - params.deliveredAt.getTime()) / 86400000);
const daysRemaining = policy.windowDays - daysSinceDelivery;
if (daysRemaining < 0) {
return { eligible: false, policy, restockingFeeCents: 0, requiresManualReview: false, daysRemaining: 0, reason: 'WINDOW_EXPIRED' };
}
// Calculate restocking fee on the item's original price
const orderLine = await db.orderLines.findOne({ order_id: params.orderId, product_id: params.productId });
const itemValueCents = orderLine.unit_price_cents * orderLine.quantity;
const restockingFeeCents = Math.round(itemValueCents * (policy.restockingFeePct / 100));
return {
eligible: true,
policy,
restockingFeeCents,
requiresManualReview: !policy.autoApprove,
daysRemaining,
};
}
ベストプラクティス
- 返品期間は注文日ではなく配達日を起点にします — そのほうが顧客にとって公平で、紛争を減らし、ほとんどの地域の消費者保護法にも合致します
- ポリシーを変更するたびにバージョンを記録します — 返品ポリシーを更新する際は、変更日時とともに旧ポリシーを記録します。顧客から返品の申請があった場合は、購入時点で有効だったポリシーを適用します
- 顧客が返品を確定する前に再入庫手数料を表示します — 返品手続きの開始時に、「返金額から15%の再入庫手数料($12.75)が差し引かれます」と表示し、手続きの完了後に表示することは避けます
- 自動承認に返金額の上限を設けます — 自動承認を有効にしていても、潜在的な不正を検知できるよう、500ドルを超える返品は手動審査に回します
- 返品期間の終了が近づいたら、事前に顧客へ通知します — 最近購入した顧客に「30日間の返品期間はあと7日で終了します」というメールを送信すると、返品期間を逃して不満を感じる顧客を減らせます
よくある落とし穴
| 問題 | 解決策 |
|---|---|
| 返品可能期間が配送日ではなく注文日を基準に計算される | 返品アプリの設定で「返品可能期間の起算日」を明示的に確認してください。一部のツールでは注文日がデフォルトになっているため、配送日に変更してください |
| 複数のポリシーが一致し、誤ったポリシーが適用される | priority DESC で並べ替えて最初に一致したものを選びます。管理画面に優先順位の階層を記載し、VIP会員が家電を購入する場合などのエッジケースをテストしてください |
| 顧客が再入庫手数料に異議を唱える | 返品確認メールに手数料の金額とポリシー名(「家電ポリシー — 再入庫手数料15%」)を記載し、顧客が記録として保管できるようにしてください |
| 最終販売タグが一貫して適用されない | 運用手順を作成してください。セールに追加する商品にはすべて「final-sale」タグを付け、商品タグのレポートを使って毎月監査してください |
関連スキル
- @returns-management
- @order-management-system
- @b2b-commerce
コメント
Markdown 対応