メインコンテンツへスキップ

紛争とチャージバック

支払い紛争とチャージバックを理解、管理、および対応して、収益を保護し、コンプライアンスを維持するための包括的なガイド。

概要

紛争(チャージバックとも呼ばれる)は、顧客があなたに直接連絡する代わりに、カード発行者に請求に異議を唱えるときに発生します。カード発行者は資金をあなたのアカウントから引き出し、調査を開始します。紛争プロセスを理解し、効果的に対応することは、収益を回復し、低いチャージバック比率を維持するために重要です。

主要な概念:

  • 紛争: 顧客が銀行に請求に異議
  • チャージバック: 銀行がトランザクションを反転
  • 証拠: トランザクション有効性を証明するドキュメント
  • 再提示: 証拠による紛争への対応
  • チャージバック比率: 紛争/トランザクション合計(1%未満に保つ)
  • 照会: 紛争前の顧客質問(紛争を防止可能)

紛争ライフサイクル

一般的な紛争の理由

1. 詐欺(詐欺)

顧客請求: 「この購入を行っていません」

一般的な原因: カードが盗まれた、アカウントが危険にさらされた、家族が無許可の購入、真の詐欺

防止方法: 3Dセキュアを有効化、配送住所を検証、疑わしいパターンをチェック、詐欺保護ツール

必要な証拠: 配送証明、AVSおよびCVVマッチ結果、IP地理情報、デバイスフィンガープリント、購入履歴

2. 認識されない(認可なし)

顧客請求: 「この請求を認識しません」

一般的な原因: 請求記述子が不明確、購入を忘れた、サブスクリプション更新を忘れた

防止方法: 明確な請求記述子を使用、メール確認を送信、サブスクリプション更新通知、明確なコミュニケーション

必要な証拠: 購入確認メール、アカウント活動ログ、サービス使用記録、顧客ログイン履歴

3. 製品未受領(未受領)

顧客請求: 「製品を受け取っていません」

一般的な原因: 配送失敗、間違ったアドレス、遅延配送、顧客転居

防止方法: 追跡配送を使用、配送住所を確認、配送通知を送信、追跡番号を提供

必要な証拠: 追跡情報、配送確認(署名)、配送ラベル、配送に関するコミュニケーション

4. 製品受け入れ不可(説明と異なる)

顧客請求: 「製品に欠陥/説明と異なります」

一般的な原因: 製品損傷、誤った品目配送、誤解を招く説明、品質問題

防止方法: 正確な製品説明、明確な写真、品質管理、簡単な返品ポリシー

必要な証拠: 製品説明、写真/ビデオ、返品ポリシー、製品問題に関するコミュニケーション

5. 重複請求

顧客請求: 「2度請求されました」

一般的な原因: 技術エラー、顧客二重送信、サブスクリプション+ワンタイム請求、認可と取得の混乱

防止方法: 冪等性キー、明確なサブスクリプション条件、トランザクション重複排除、ユーザーフレンドリーなチェックアウト

必要な証拠: トランザクションログ、請求の説明、別個の購入の証拠、重複の払い戻し(該当する場合)

6. クレジット処理されない

顧客請求: 「返品したのに払い戻されていません」

一般的な原因: 払い戻し遅延、別のカードへの払い戻し、部分払い戻しの混乱、処理時間が通知されていない

防止方法: 払い戻しを迅速に処理、明確な払い戻しタイムライン、確認メール、払い戻しステータスをチェック

必要な証拠: 払い戻し確認、払い戻しタイミング説明、返品領収、払い戻しに関するコミュニケーション

7. キャンセルされたサービス

顧客請求: 「キャンセルしたのに請求されました」

一般的な原因: キャンセル未処理、請求サイクル開始済み、按分請求、試用期間終了

防止方法: 即座のキャンセル確認、明確なキャンセルポリシー、按分払い戻し、猶予期間

必要な証拠: キャンセル日付、請求サイクル説明、サービス利用規約、サービス使用ログ

紛争ステータス

ステータス意味必要なアクション
open紛争が提出され、証拠を待つすぐに証拠を提出
pending証拠を提出し、審査中決定を待つ(45-90日)
won紛争に勝ちました資金がアカウントに復帰
lost顧客が紛争に勝ちました資金は引き出されたまま
charge_refunded決定前に払い戻したアクションなし
closed紛争解決(理由は様々)結果を確認

紛争に対応

ステップ1: 紛争を確認

const dispute = await omise.disputes.retrieve('dspt_test_...');

console.log('Reason:', dispute.reason_code);
console.log('Amount:', dispute.amount / 100);
console.log('Due date:', dispute.closed_at);
console.log('Transaction:', dispute.charge);

ステップ2: 証拠を収集

すべての紛争に共通の証拠:

  • 顧客名とメール、請求・配送住所、購入日時、トランザクションID、製品/サービス説明、顧客IP、コミュニケーション履歴

紛争タイプ別の具体的な証拠:

詐欺紛争用:

  • 署名付き配送証明、AVS・CVVマッチ結果、IP地理情報、デバイスフィンガープリント、購入履歴、配送写真

未受領用:

  • 追跡番号、配送確認、運送会社名、配送日時、署名付き領収、住所での梱包写真

説明と異なる用:

  • 製品写真・説明、返品ポリシー、製品に関するコミュニケーション、品質保証記録、解決試行の証拠

ステップ3: 証拠を提出

const evidence = await omise.disputes.update('dspt_test_...', {
message: 'Customer received product as confirmed by tracking',
metadata: {
tracking_number: '1Z999AA10123456784',
delivery_date: '2025-01-15',
carrier: 'DHL'
}
});

const document = await omise.disputes.upload('dspt_test_...', {
file: fs.readFileSync('/path/to/delivery-proof.pdf'),
description: 'Delivery confirmation with signature'
});

ダッシュボード経由

  1. Omiseダッシュボードにログイン
  2. 紛争に移動
  3. 紛争を選択
  4. **「証拠を提出」**をクリック
  5. 証拠フォームに入力:
    • 説明を記述
    • ドキュメントをアップロード(PDF、画像)
    • 追跡情報を提供
  6. 確認して提出

ステップ4: ステータスを監視

app.post('/webhooks/omise', (req, res) => {
const event = req.body;

switch (event.key) {
case 'dispute.create':
handleNewDispute(event.data);
break;

case 'dispute.update':
handleDisputeUpdate(event.data);
break;

case 'dispute.close':
handleDisputeClosed(event.data);
break;
}

res.sendStatus(200);
});

async function handleDisputeClosed(dispute) {
if (dispute.status === 'won') {
console.log('Won dispute!', dispute.id);
notifyTeam('Dispute won', dispute);
} else if (dispute.status === 'lost') {
console.log('Lost dispute', dispute.id);
analyzeFailureReason(dispute);
}
}

ベストプラクティス

1. 迅速に対応

async function handleNewDispute(dispute) {
// 即座にチームに通知
await sendSlackNotification({
text: `⚠️ New dispute filed! Amount: ${dispute.amount / 100} ${dispute.currency}`,
dispute_id: dispute.id,
reason: dispute.reason_code,
due_date: dispute.closed_at
});

// タスクを作成
await createJiraTicket(dispute);

// サポートチームにメール
await emailSupportTeam(dispute);
}

タイムライン:

  • 7-10日以内に証拠を提出 最良の結果のため
  • 最終期限: カード ネットワークにより異なる(14-21日)
  • 遅延提出: 自動的に却下される可能性

2. 詳細な記録を保持

async function createCharge(orderData) {
const charge = await omise.charges.create({
amount: orderData.amount,
currency: 'THB',
card: orderData.tokenId,
metadata: {
order_id: orderData.orderId,
customer_email: orderData.email,
customer_phone: orderData.phone,
billing_address: JSON.stringify(orderData.billingAddress),
shipping_address: JSON.stringify(orderData.shippingAddress),
ip_address: orderData.ipAddress,
user_agent: orderData.userAgent,
product_description: orderData.productDescription,
shipping_method: orderData.shippingMethod,
tracking_number: orderData.trackingNumber
}
});

await db.transactions.create({
charge_id: charge.id,
customer_id: orderData.customerId,
session_data: orderData.sessionData,
timestamp: new Date()
});

return charge;
}

3. 明確なコミュニケーション

async function sendOrderConfirmation(order) {
await sendEmail({
to: order.customer_email,
subject: `Order Confirmation #${order.id}`,
html: `
<h2>Thank you for your order!</h2>
<p><strong>Order #:</strong> ${order.id}</p>
<p><strong>Total:</strong> $${order.amount / 100}</p>
<p><strong>Billing descriptor:</strong> YourCompany.com</p>

<h3>What's Next?</h3>
<ul>
<li>Processing: 1-2 business days</li>
<li>Shipping: 3-5 business days</li>
<li>Tracking: Will be emailed when shipped</li>
</ul>

<p>Questions? Reply to this email or visit our support page.</p>
<p><strong>Note:</strong> The charge will appear as "YourCompany.com" on your statement.</p>
`
});
}

4. 紛争を予防的に防止

function calculateDisputeRisk(order) {
let risk = 0;

if (order.amount > 500000) risk += 20;
if (order.customer.first_order) risk += 15;
if (order.shipping_country !== order.billing_country) risk += 25;
if (order.shipping_address !== order.billing_address) risk += 15;
if (order.shipping_method === 'express') risk += 10;

return risk;
}

async function processHighRiskOrder(order) {
const risk = calculateDisputeRisk(order);

if (risk > 50) {
await requestPhoneVerification(order);
await enable3DSecure(order);
await addManualReview(order);
} else if (risk > 30) {
await useSignatureShipping(order);
await sendExtraConfirmations(order);
}
}

5. 適切な場合に受け入れる

勝つことができない紛争に対して資源を費やさないでください。証拠が不十分な場合は、紛争を受け入れます。

6. チャージバック比率を監視

async function calculateChargebackRatio(month) {
const totalTransactions = await db.charges.count({
created: { $gte: month.start, $lt: month.end }
});

const disputes = await db.disputes.count({
created: { $gte: month.start, $lt: month.end }
});

const ratio = (disputes / totalTransactions) * 100;

console.log(`Chargeback ratio: ${ratio.toFixed(2)}%`);

if (ratio > 1.0) {
await alertManagement('High chargeback ratio!', ratio);
}

return ratio;
}

業界基準:

  • < 0.65%: 健全
  • 0.65% - 1.0%: 密接に監視
  • > 1.0%: 高リスク(ネットワークがペナルティを課す可能性)
  • > 1.5%: 過剰(処理を失う危険)

よくあるご質問

紛争に対応するのにどのくらいの時間がありますか?

通常、カード ネットワークに応じて7-21日です。ただし、最良の結果のため7-10日以内に対応してください。ダッシュボードまたはAPIで紛争のclosed_at日付を確認してください。

対応しなかったらどうなりますか?

期限までに証拠を提出しない場合、紛争は自動的に失い、資金は引き出されたままになります。限定的な証拠でも対応してください。

紛争を避けるために払い戻しできますか?

はい! 紛争を受け取り、顧客が有効な請求を持っていると判断した場合、払い戻しを発行してください。これは紛争を解決し、親善を保つのに役立ちます。

マーチャントはどのくらい紛争に勝ちますか?

勝率はさまざまです(10-40%)。証拠の品質と紛争理由に依存します。詐欺紛争は配送証明がなければ最も勝ちにくいです。

3Dセキュアは紛争を防ぎますか?

3Dセキュアは詐欺紛争の責任をカード発行者に移すため、紛争が提出されてもあなたは資金を失いません。ただし、顧客は依然として非詐欺紛争を提出できます。

良いチャージバック比率は何ですか?

  • 優秀: < 0.5%
  • 良い: 0.5% - 0.75%
  • 許容可能: 0.75% - 1.0%
  • 高リスク: > 1.0%

ネットワークは1%以上にペナルティを課す可能性があります。

関連リソース