Skip to main content

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

A customer pays the platform, which transfers a share to the account and pays Bachs its processing fee. The customer pays your platform directly. Your platform settles Bachs’s processing fee out of that one charge, and the split with the account is settled the way you stated it: either your platform names its own cut, or it names what the account receives.
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.
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 kind=payout. What it carries, and whether your platform’s cut appears anywhere else, depends on which term you used to state the split.
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.
Read it from 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_fee or transfer_data.amount is required. platform_fee fixes what your platform keeps; transfer_data.amount fixes 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. With transfer_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 payouts active 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.

Next steps