Chapter 12

Destination Charges

Toru Furukawa
Toru Furukawa
2021.12.12に更新

Destination Charges は、次のように定義されている。

Connect を使用すると、プラットフォームアカウントで支払いを作成し、手数料を徴収し、その後の残余金額を連結アカウントに送金することができます。

今日は、この資金分配のデータを見ていく。大まかな資金フローは、下図である。

Buyer           Platform          Seller
Card            Bank              Bank
 :
Payment Method  Platform Account  Connected Account
 |                ^                 ^
 v                |                 |
[Payment Intent]--+-----------------+

Destination Charge が完了した状態

API 呼び出しと、そのレスポンスは以下のようになる。

request
curl https://api.stripe.com/v1/payment_intents \
  -d amount=1000 \
  -d application_fee_amount=200 \
  -d "transfer_data[destination]"="acct_xxxx" \
  ...
response
{
  "id": "pi_xxxx",
  "object": "payment_intent",
  "charges": {
    "data": [
      {
        "id": "ch_xxxx",  // 👈
        "object": "charge",
        "amount": 1000,
        "application_fee": "fee_xxxx",  // 👈
        "application_fee_amount": 200,
        "transfer": "tr_xxxx", // 👈
        ...
      }
    ],
  },
  ...
}

Charge、Application Fee、Transfer という 3 つのオブジェクトの ID がある。

単純な決済では、Payment Intent には Charge だけが関連づく。Destination Charge 方式では、資金の分配のために、Stripe 内部で別の取引が発生する。金額から察するに、以下のようになるか。

Buyer           Platform                           Seller
Card            Bank                               Bank
 :
Payment Method  Platform Account                   Connected Account
 |               ^    |      ^                       |   ^
 |               |    |      |                       |   |
 |               |    |      +--[Application Fee]<---+   |
 v               |    v                   :              |
[Charge]---------+  [Transfer]---------------------------+
  :                     :                 :
[Payment Intent]..........................:

ダッシュボードで残高変化を見ると、下の表のようになる。

Platform Account Connected Account
+164 +800

合計が 1000 円より小さいのは、Stripe の決済手数料が発生しているからだ。詳しく見ていこう。

Balance Transaction を展開

残高変化に関する情報は Balance Transaction オブジェクトを展開すると分かる。

request
curl https://api.stripe.com/v1/payment_intents/pi_xxxx \
  -u sk_xxxx: \
  -d "expand[]"="charges.data.balance_transaction" \
  -d "expand[]"="charges.data.transfer.balance_transaction"
response
{
  "charges": {
    "data": [
      {
        "id": "ch_xxxx",
        "object": "charge",
        "application_fee": "fee_1JtoCfQcqFYldDVGpLBBGNBv",
        "application_fee_amount": 200,
        "balance_transaction": {
          "id": "txn_1", // 👈
          "amount": 1000,
          "fee": 36,
          "net": 964,
          ...
        },
        "transfer": {
          "id": "tr_xxxx",
          "object": "transfer",
          "balance_transaction": {
            "id": "txn_2",  // 👈
            "amount": -1000,
            "fee": 0,
            "net": -1000,
          },
          "destination": "acct_xxxx",
          ...
        },
        ...
      }
    ],
  },
  ...
}

Charge に関連する Balance Transaction txn_1 は、シンプルな決済と同様に、36 円の手数料の情報を持っている。支払いに由来する残高増加を表している。

Transfer に関連する Balance Transaction は、Platform Account から、Connected Account に資金を移動させる。Plaform Account の残高が減るので "net": -1000 となる。

Stripe Connect では、Platform Account が Stripe への手数料を支払う。そして Destination Charge では、決済による資金の到達先が Connected Account になる。だから Charge と Transfer を合算すると、Platform Account の残高がマイナスになる。

Transaction Payment Method Platform Account Connected Account Stripe
Charge -1000 +964 0 +36
Transfer 0 -1000 +1000 0
収支 -1000 -36 +1000 +36

あらら。Application Fee を見てみよう。

request
curl https://api.stripe.com/v1/application_fees/fee_xxxx \
  -u sk_xxxx: \
  -d "expand[]"=balance_transaction \
  -G
response
{
  "id": "fee_xxxx",
  "balance_transaction": {
    "id": "txn_3",
    "account": "acct_xxxx",
    "amount": 200,
    "fee": 0,
    "net": 200,
    ...
  },
  ...
}

Connected Account から Platform Account に、200 円移動している。Platform から見た残高変化なのでプラスだ。

Application Fee の取引的な意味は「Platform が Seller にサービスを提供した、その対価として、Seller が Platform に手数料を支払った」だ。Seller からの売上と考えることもできる。

図にすると下のようになる。TXN というのが Balance Transaction だ。

Buyer           Platform                       Seller
Card            Bank                           Bank
 :
Payment Method  Platform Account               Connected Account
 |               ^    |      ^                   |   ^
 |               |    |      | 200           200 |   |
 |               |    |      |                   |   |
 |               |    |      +-----[TXN 3]<------+   |
 |               |    |        [Application Fee]     |
 | 1000      964 |    | 1000                         | 1000
 v               |    |                              |
[Charge]         |    |                              |
[TXN 1]----------+    +---->[TXN 2]------------------+
 |                         [Transfer]
 | 36
 v
Stripe
Transaction Payment Method Platform Account Connected Account Stripe
Charge -1000 +964 0 36
Transfer 0 -1000 1000 0
Applecation Fee 0 +200 -200 0
収支 -1000 +164 +800 +36

まとめ

Platform Accont の観点からの Destination Charge を見てきた。Balance Transaction に注目すると、残高の増減が明確に鳴る。明日は、Connected Account の観点で見ていく。