Bubble × Stripe Connect で作る!予約決済プラットフォームの作り方【第3回】Destination Charges と手数料計算

Bubble × Stripe Connect で作る!予約決済プラットフォームの作り方

第3回:予約決済の実装 – Destination Charges と手数料計算


前回のおさらい

第2回では、Stripe Connect の設計を解説しました。

  • Express アカウントの特徴
  • オンボーディング(店舗登録)の流れ
  • stripe_account_id の保存

今回は、いよいよ 予約決済の実装 です。


Destination Charges とは

Stripe Connect には、お金の流れを制御する方法が複数あります。

方式 お金の流れ 用途
Direct Charges ユーザー → 店舗 店舗が主体
Destination Charges ユーザー → プラットフォーム → 店舗 プラットフォームが主体
Separate Charges 分割して処理 複雑なケース

今回は Destination Charges を使います。

なぜ Destination Charges か

ユーザーが3,000円を決済
    │
    ↓
プラットフォームが受け取る
    │
    ├─→ 手数料150円を差し引く
    │
    └─→ 店舗に2,850円を送金

メリット:

  • プラットフォームが決済の主体になる
  • 手数料を柔軟に設定できる
  • 返金もプラットフォームから操作可能

application_fee_amount

application_fee_amount は、プラットフォームが受け取る手数料です。

計算例

ユーザーが 3,000円 を決済する場合:

決済金額: 3,000円
Stripe手数料(3.6%): 108円
application_fee_amount: 150円(5%)

店舗の受取額: 3,000 - 108 - 150 = 2,742円

…あれ?計算が合わない?

重要:手数料の取られ方

実は、Stripe手数料は 店舗の受取額から 引かれます。

決済金額: 3,000円

プラットフォームの取り分: 150円(application_fee_amount)
    └─→ ここからStripe手数料は引かれない

店舗への送金: 2,850円
    └─→ ここからStripe手数料 108円が引かれる
    └─→ 店舗の実際の受取額: 2,742円

店舗に「手数料5%」と伝えている場合、実質的には 5% + Stripe手数料 が引かれることになります。

店舗への説明

正直に伝える場合:

「プラットフォーム手数料5% + Stripe決済手数料3.6%がかかります」

シンプルに伝える場合:

「売上の約8.6%が手数料として差し引かれます」

どちらが良いかはビジネス判断ですが、事前に明示することが重要です。


Bubble での実装

Stripe Checkout Session の作成

Bubble の API Connector で Stripe API を呼び出します。

API設定:

Method: POST
URL: https://api.stripe.com/v1/checkout/sessions
Headers:
  Authorization: Bearer sk_test_xxx
  Content-Type: application/x-www-form-urlencoded

Body パラメータ:

パラメータ 説明
mode payment 一回払い
success_url https://xxx/success 成功時のリダイレクト先
cancel_url https://xxx/cancel キャンセル時のリダイレクト先
line_items[0][price_data][currency] jpy 通貨
line_items[0][price_data][unit_amount] {{金額}} 決済金額(円)
line_items[0][price_data][product_data][name] {{商品名}} 表示名
line_items[0][quantity] 1 数量
payment_intent_data[application_fee_amount] {{手数料}} プラットフォーム手数料
payment_intent_data[transfer_data][destination] {{acct_xxx}} 送金先の店舗アカウント

手数料の計算

Bubble のワークフローで:

決済金額 = メニュー料金 × 卓数 × 時間
手数料 = 決済金額 × 0.05(5%)

注意:手数料は整数で渡す

Stripe API は小数を受け付けません。

150.5 → ❌ エラー

150 → ✓ OK

Bubble では rounded down で切り捨てます。


Bubble ワークフロー例

[決済ボタンをクリック]
    │
    ↓
[計算]
決済金額 = Parent group's メニュー's 料金 * Dropdown 卓数's value * Dropdown 時間's value
    │
    ↓
[計算]
手数料 = 決済金額 * 0.05 :rounded down
    │
    ↓
[API Call: Create Checkout Session]
・unit_amount = 決済金額
・application_fee_amount = 手数料
・destination = 店舗's stripe_account_id
    │
    ↓
[Open external website]
Result of step's url

決済画面の表示

Checkout Session を作成すると、URLが返ってきます。

{
  "id": "cs_test_xxx",
  "url": "https://checkout.stripe.com/c/pay/cs_test_xxx..."
}

このURLに遷移すると、Stripe の決済画面が表示されます。

ユーザー体験:

1. 予約内容を確認

2. 「決済する」ボタンをクリック

3. Stripe の決済画面に遷移

4. カード情報を入力

5. 決済完了 → 成功ページに戻る


metadata の活用

決済と予約データを紐付けるために、metadata を使います。

Checkout Session 作成時:

metadata[reservation_id]={{予約のユニークID}}
metadata[user_id]={{ユーザーID}}
metadata[store_id]={{店舗ID}}

Webhook で受け取る時:

{
  "metadata": {
    "reservation_id": "xxx",
    "user_id": "xxx",
    "store_id": "xxx"
  }
}

これで、どの予約に対する決済かを特定できます。


テスト方法

テスト用カード番号

カード番号 結果
4242 4242 4242 4242 成功
4000 0000 0000 0002 拒否
4000 0000 0000 3220 3Dセキュア

有効期限: 未来の日付(例: 12/30)

CVC: 任意の3桁(例: 123)

確認すべきポイント

1. 決済が成功するか

2. 金額が正しいか(Stripe ダッシュボードで確認)

3. application_fee_amount が正しいか

4. 店舗への送金額が正しいか

Stripe ダッシュボード → 支払い → 該当の決済をクリック

支払い金額: ¥3,000
プラットフォーム手数料: ¥150
送金先: acct_xxx
送金額: ¥2,850

よくあるエラー

1. Invalid integer

Error: Invalid integer: 150.5

手数料が小数になっている。:rounded down で整数にする。

2. No such account

Error: No such account: acct_xxx

店舗の stripe_account_id が間違っている、または存在しない。

3. Transfers not allowed

Error: Your destination account needs to have at least one of the following capabilities enabled: transfers

店舗のオンボーディングが完了していない。

charges_enabledpayouts_enabled を確認。


次回予告

第4回では、クーポンの罠 を解説します。

  • Stripe プロモーションコードが使えない問題
  • Destination Charges の制約
  • Bubble 側での回避策

お楽しみに!


このシリーズの目次

タイトル 内容
1 イントロ プラットフォーム決済の設計
2 Stripe Connect設計 Express アカウント、オンボーディング
3 予約決済の実装 ← 今ここ
4 クーポンの罠 プロモコードが使えない問題と回避策
5 サブスク課金 有料掲載・広告プランの実装
6 Webhook設計 決済完了の検知、ステータス更新
7 本番デプロイ テスト→本番の切り替え、審査対策

いいね・フォローしていただけると励みになります!


実装のご相談

予約システム・サブスク決済の導入でお困りの方へ。

・Stripe / Stripe Connect の設計・実装

・Bubble / Make.com でのノーコード開発

・テスト環境→本番デプロイまで一貫対応

初期設定から運用まで、初心者の方にも丁寧にサポートします。

👉 ココナラで相談する

この技術、気になりませんか?

このページも含め、サイト全体がWordPressで作られています。
同じような技術で、あなたのビジネスも強化しませんか?

お気軽にご相談ください

29年の判断 + AI で、成果を再現しませんか?

(マーケティング × 技術) + AI。伝言ゲームゼロで、設計から実装まで。