What you’ll build
A checkout that belongs to your platform, with an account named as the seller. Your platform is the merchant of record, the sale lands in your balance, and the seller’s share moves down to the account as part of settling the charge. By the end you’ll have created the checkout as your platform, sent the customer to it, confirmed the payment with a webhook, and read the seller’s payout back as a transfer, along with your own cut when you stated the split that way.When to use it
- Customers transact with your platform, not with the account, for the goods or services the account provides.
- Each charge names exactly one account as the seller.
- Your platform is the merchant of record.
The flow
1
Create the checkout as your platform
Do not send
X-Account-Id. Name the account in transfer_data.destination; its presence, on its own, is what makes this a destination charge. State the split with exactly one of two terms: platform_fee, what your platform keeps, or transfer_data.amount, what the account receives. Sending both is rejected, and sending neither is too, since the account’s share cannot be computed without one. Whichever you send, it is an amount in the base currency of the sale, not necessarily the currency the customer pays in.- platform_fee
- transfer_data.amount
Name your platform’s cut. The account receives whatever is left.
platform_fee carries the amount because there is one; a checkout with none returns "platform_fee": null rather than "0.00". The key is always present regardless of which term you sent. transfer_data is never echoed back, on either tab.2
Send the customer to the checkout
Redirect the customer to
checkout_url. Bachs hosts the payment page and collects the charge against your platform.3
Confirm with the webhook
Bachs sends checkout.completed once the customer finishes. Check
data.payment_status: paid means a charge was made.Event
organization_id is your platform: it is the party whose checkout completed, so it is also the event’s origin. See checkout.completed for the full payload.4
Read the seller's payout back
The account’s share settles as a transfer from your platform. List it with Read it from
kind=payout. What it carries, and whether your platform’s cut appears anywhere else, depends on which term you used to state the split.- platform_fee
- transfer_data.amount
The transfer carries the full
"100000.00" the customer paid, not the "80000.00" left after your fee. Your platform’s cut is not on this record: it settles separately, as its own record.GET /v1/platform_fees:collected_from is the account whose sale funded the fee, and earned_by is your platform. The transfer’s "100000.00" minus this fee’s "20000.00" is what actually reaches the account. See Platform fees.status is paid once settlement has posted the movement, and pending before it has. source_charge_id ties the transfer back to the checkout’s charge. See Transfers.With this shape
- The charge lands in your platform’s balance, not the account’s.
- One of
platform_feeortransfer_data.amountis required.platform_feefixes what your platform keeps;transfer_data.amountfixes what the account receives. - With
platform_fee, the account’s payout carries the sale’s gross, and your platform’s cut settles separately, readable at Platform fees. Withtransfer_data.amount, the payout carries only the account’s fixed share, and your platform mints no fee record for the rest. - A refund debits your platform’s balance for the full amount the customer paid. The payout transfer already sent to the account is not reversed: your platform bears the full refund, and the account keeps the share it received.
- A lost dispute drains your platform’s available balance, then its pending balance. Any amount still owed drives the available balance negative: that negative balance is the debt, and it heals as your platform’s own future settlement credits land. A dispute also debits a flat dispute fee when it opens, whether it is later won or lost. See Disputes.
- Your platform needs the capability for every payment method it plans to accept, active before a customer can pay it that way:
card_collection,ngn_card_collection,bank_transfer,mobile_money,crypto. The named account is checked only for ownership and active status, not for the capability. See Capabilities. - The account needs
payoutsactive to withdraw its share once it settles.
Errors
Destination-charge errors return the standard error envelope.
A charge priced in a currency different from the one it settles in still splits and settles: your platform’s cut and the account’s share are computed in the currency the sale was priced in. See Platform fees.

