payout-split-management について
複数の販売者を扱うマーケットプレイスの運営者や開発者向けに、売上分配、手数料、留保金、定期振込の設計方法を解説します。Stripe Connectと主要なECプラットフォーム、独自構成の設定や税務上の注意点を扱います。
主な機能
- 01複数プラットフォームの分配構成
- 02Stripe Connectの販売者アカウント設定
- 03手数料と振込スケジュールの設定
- 04ローリングリザーブと返金リスクの管理
- 05販売者の収益と1099-Kデータの追跡
活用シーン
- 01独立販売者への自動振込の構築
- 02割合または定額のプラットフォーム手数料の徴収
- 03新規販売者の返金用留保金の設定
- 041099-K申告用データの準備
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill payout-split-managementインストール後、Claude Code で/payout-split-managementを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
tile.jsonevals/1099-k-tax-reporting-and-rolling-reserve/criteria.jsontask.mdevals/order-earnings-calculation-with-deductio/criteria.jsontask.mdevals/stripe-connect-disbursement-processor/criteria.jsontask.md詳細
支払い分配の管理
概要
マーケットプレイスや複数の販売者が参加するプラットフォームでは、各支払いをプラットフォーム(手数料)と1人以上の販売者(純支払額)に分配し、必要に応じて税金を源泉徴収し、返金に備えてローリングリザーブを管理し、スケジュールに沿って資金を支払う必要があります。Stripe Connect は、この処理を担う業界標準です。接続された販売者アカウントに資金を合法的に送金し、税金の源泉徴収と1099の報告に対応するため、販売者の資金を共同の銀行口座に預けておくことによるコンプライアンス上のリスクをなくせます。
複数の販売者が参加するマーケットプレイスとして運営されている Shopify、WooCommerce、BigCommerce のストアでは、マーケットプレイス専用アプリ(WooCommerce の Dokan など)が Stripe Connect 上で支払い分配のロジックを処理します。
このスキルを使用する場面
- 売上の支払いを受け取る必要がある独立した販売者が参加するマーケットプレイスを構築する場合
- プラットフォームが取引に対して定率または定額の手数料を課す場合
- 販売者に関する IRS 1099-K 報告要件を遵守する必要がある場合
- リスクの高い販売者や新規販売者向けにローリングリザーブを管理する場合
- 販売者から、より迅速な支払い(月次ではなく日次/週次)を求められている場合
基本手順
ステップ1:適切なマーケットプレイスと支払いアーキテクチャを選択する
| プラットフォーム | 推奨アプローチ | 備考 |
|---|---|---|
| Shopify | Shopify Marketplace Kit + Stripe Connect、または Multi-Vendor Marketplace アプリ | Shopify は複数の販売者への支払いを標準ではサポートしていません。マーケットプレイスアプリが販売者アカウントと支払い分配を処理します |
| WooCommerce | Dokan Multivendor Marketplace または WCFM Marketplace + Stripe Connect | Dokan は最も広く使われている WooCommerce マーケットプレイスプラグインです。支払い分配のための Stripe Connect 連携が標準搭載されています |
| BigCommerce | Multi-Seller Marketplace アプリ + Stripe Connect | BigCommerce App Marketplace のサードパーティ製マーケットプレイスアプリを使用します |
| カスタム/ヘッドレス | Stripe Connect(Express または Custom アカウント) | 支払い分配のロジック全体を構築します。Stripe がコンプライアンス、税務書類、資金の送金を処理します |
ステップ2:販売者への支払い用に Stripe Connect を設定する
販売者に資金を自動的に送金するアーキテクチャ(すべての資金を自社アカウントで受け取り、販売者に手動で送金する方式ではない場合)には、Stripe Connect が必要です。
適切な Connect アカウントタイプを選択します:
- Express アカウント:販売者は Stripe がホストするフォームで登録します。Stripe が本人確認(KYC)を処理します。ほとんどのマーケットプレイスに最適です
- Custom アカウント:登録時の UX をすべて自社で管理します。より複雑で、特定の UX 要件があるプラットフォーム向けです
- Standard アカウント:販売者が既存の Stripe アカウントを接続します。販売者の Stripe ダッシュボードに自社プラットフォームが表示されます
ほとんどのマーケットプレイスでは、Express アカウントが適しています。
Stripe Dashboard で Stripe Connect を設定します:
- Stripe Dashboard → Connect → Overview に移動し、プラットフォームを設定します
- Connect → Settings → Account types で Express アカウントを有効にします
- ホスト型登録フローに表示するプラットフォームのブランド情報(名前、ロゴ、色)を設定します
- プラットフォームの設定で手数料の構造を設定します(Stripe ではありません。Stripe は取引ごとに指定した金額に基づいて資金を送金します)
WooCommerce (Dokan)
- Dokan Multivendor Marketplace(無料の基本機能と dokan.wedevs.com の有料拡張機能)をインストールします
- Dokan → Settings → Selling Options に移動し、次の項目を設定します。
- 手数料の種類:パーセンテージ(例:各売上の15%をプラットフォームの収益とする)、定額、または併用
- 手数料率:マーケットプレイスの収益として受け取るパーセンテージまたは定額
- Dokan → Settings → Withdrawal に移動し、支払いスケジュール(毎週、隔週、毎月)と最低出金額を設定します
- Stripe Connect を有効にします。Dokan → Settings → Payment → Stripe Connect に移動し、Stripe Connect プラットフォームキーを入力します
- 販売者はベンダーダッシュボードに移動し、Payment Settings → Connect with Stripe をクリックして Stripe アカウントを接続します
- 注文が行われると、Dokan が自動的に支払いを分割します。販売者の取り分は接続済みの Stripe アカウントに送金され、手数料はプラットフォームの Stripe 残高に残ります
Dokan での 1099 レポート作成: Dokan は販売者ごとの累計支払額を追跡します。1099 の準備には、Dokan → Reports → Vendor Wise Sales からベンダー収益レポートをエクスポートします。1099 を自動生成するには、TaxBandits または Track1099 を使用します。Dokan のエクスポートデータをインポートして、IRS 準拠の 1099-K フォームを生成できます。
Shopify(Multi-Vendor Marketplace アプリ)
- Shopify App Store から Multi-Vendor Marketplace または Marketplace Kit(複数の提供元があります)をインストールします
- アプリのベンダー設定でベンダーの手数料率を設定します
- アプリの支払い設定で、支払い用に Stripe Connect を接続します
- ベンダーはホストされたフォームから登録し、ベンダーポータルで収益を確認して支払いをリクエストできます
BigCommerce
- BigCommerce App Marketplace からマルチセラーマーケットプレイスアプリをインストールします
- アプリの設定で手数料率と支払いスケジュールを設定します
- 自動的な資金振り分けのために Stripe Connect を接続します
カスタム/ヘッドレス
カスタムマーケットプレイスを構築する場合は、Stripe Connect を使用して、分割支払いのアーキテクチャ全体を実装します。
販売者の登録(Express アカウント):
// Create an Express Connect account for a new seller
const account = await stripe.accounts.create({
type: 'express',
country: 'US',
email: sellerEmail,
capabilities: { transfers: { requested: true } },
metadata: { seller_id: sellerId },
});
// Generate onboarding link — redirect seller to complete Stripe's KYC form
const accountLink = await stripe.accountLinks.create({
account: account.id,
refresh_url: `${process.env.PLATFORM_URL}/sellers/onboarding/retry`,
return_url: `${process.env.PLATFORM_URL}/sellers/onboarding/complete`,
type: 'account_onboarding',
});
// Save account.id to your database and redirect seller to accountLink.url
await db.sellers.update({ where: { id: sellerId }, data: { stripeAccountId: account.id } });
チェックアウト時の支払い分割(Destination charge パターン):
// Create a payment intent that automatically routes commission to your platform
// and the seller's share to their connected account
const paymentIntent = await stripe.paymentIntents.create({
amount: orderTotalCents,
currency: 'usd',
payment_method_types: ['card'],
application_fee_amount: Math.round(orderTotalCents * commissionRate), // Platform commission
transfer_data: {
destination: seller.stripeAccountId, // Seller's Connect account
},
metadata: { order_id: orderId, seller_id: sellerId },
});
ローリングリザーブ(返金に備えて一定割合を留保):
// Instead of immediate transfer, create a manual transfer on a delay
const transfer = await stripe.transfers.create({
amount: Math.round(sellerNetEarningsCents * (1 - ROLLING_RESERVE_RATE)), // 95% transferred now
currency: 'usd',
destination: seller.stripeAccountId,
transfer_group: `order_${orderId}`,
metadata: { order_id: orderId, reserve_amount: Math.round(sellerNetEarningsCents * ROLLING_RESERVE_RATE) },
});
// Schedule the reserve release 90 days later via a cron job or job queue
await reserveQueue.add('release-reserve', {
sellerId: seller.id,
orderId,
reserveAmount: Math.round(sellerNetEarningsCents * ROLLING_RESERVE_RATE),
}, { delay: 90 * 24 * 60 * 60 * 1000 });
1099-K の追跡:
販売者ごとの総取引額をリアルタイムで追跡します。2024 年以降、IRS の 1099-K 基準額は $600 です。
// Update seller YTD earnings after each order
await db.sellers.update({
where: { id: sellerId },
data: { ytdGrossVolume: { increment: orderSubtotal }, ytdTransactions: { increment: 1 } },
});
// Alert when approaching $600 threshold — request W-9 before first payout
const seller = await db.sellers.findUnique({ where: { id: sellerId } });
if (seller.ytdGrossVolume >= 400 && !seller.w9Collected) {
await sendW9RequestEmail(seller);
}
1099 フォームの生成には、IRS フォーム生成を一から構築するのではなく、TaxBandits API または Track1099 API を使用します。
手順 3:支払いスケジュールと販売者ポータルを設定する
Stripe Connect の支払いスケジュール: Stripe Dashboard の Connect → Settings → Payouts で、接続済みアカウントのデフォルトの支払いスケジュール(毎日、毎週、毎月)を設定します。個々の販売者アカウントは、プラットフォームの設定内でスケジュールの変更をリクエストできます。
販売者の収益ダッシュボード: 販売者が収益、保留中の支払い、リザーブを確認できるようにします。ポータルを構築するか、既製のポータルを使用します。
- Dokan/WCFM:収益、支払いリクエスト、支払い履歴を確認できるベンダーダッシュボードが含まれています
- カスタム:Stripe Connect の Account Balance API を使用して、販売者に利用可能残高をリアルタイムで表示します
ベストプラクティス
- Stripe Connect ExpressまたはCustomアカウントを使用します — 販売者の資金をプールした銀行口座で決して保管しないでください。Stripe Connectを使用し、資金が送金されるまでプラットフォームに法的に帰属するようにします
- 初回の支払い前にW-9を収集します — W-9がない場合、IRSの予備源泉徴収として24%を適用する必要があります。販売者のオンボーディングにW-9の収集を組み込みます
- 支払い時ではなく、注文の確定時に収益を計算します — 収益レコードは変更できないようにし、特定の注文に紐付けます。支払いは別途集計するステップです
- 新規販売者にはローリングリザーブを適用します — 返金やチャージバックに備えて、90日間5~10%を留保します。スケジュールに従って自動的に解放します
- 手数料率をスナップショットとして保存します — 手数料率は時間の経過とともに変わります。過去の収益を現在の手数料率で再計算しないでください。各販売時の手数料率を記録します
よくある問題
| 問題 | 解決策 |
|---|---|
| Stripe Connectの送金が失敗しても通知されない | transfer.failed Webhookをリッスンし、販売者と運用チームにすぐに通知します |
| 満期後もローリングリザーブが解放されない | 解放日を確認する日次cronジョブを作成します。ステージングで短いリザーブ期間を設定してテストします |
| 1099-Kの総額が販売者の記録と一致しない | 1099-Kにはプラットフォーム手数料を差し引く前の総支払額を記載する必要があります。販売者の純収益ではなく、注文の総額を使用します |
| W-9が未提出の販売者に予備源泉徴収が適用されない | オンボーディング時にW-9が収集されていない場合、データベースにフラグを設定します。受領するまで、その販売者へのすべての支払いに24%の源泉徴収を適用します |
| 期間中の返金額が売上を上回り、支払い額がマイナスになる | マイナス残高を次の支払い期間に繰り越します。販売者の銀行口座から返金を求めないでください |
| Dokanの手数料が正しく分割されない | 手数料率がベンダー単位で設定されていることを確認します(グローバルなデフォルト設定だけでは不十分です)。DokanのログでDokan → ログを確認し、送金エラーを調べます |
関連スキル
- @stripe-integration
- @payment-reconciliation-automation
- @accounts-receivable-automation
- @tax-compliance-automation
- @invoice-generation-automation