Skip to content

Settlement and the platform fee

When a payment is confirmed, the money is in the address it was sent to: the address of an invoice, or a reusable deposit address. Settlement is what happens next. cTpeWay charges the platform fee and moves the funds to your master wallet.

Your customer never sees any of this. For them, the invoice is Paid as soon as the payment is confirmed.

You have one master wallet on each network. It is:

  • where released funds arrive,
  • where payouts are sent from,
  • what pays the platform fee and the network fee when you receive tokens.

Your wallet and your addresses are yours alone. They are never shared with another merchant and funds are never pooled. cTpeWay creates and operates these addresses for you and signs the transfers described on this page, so you approve nothing by hand.

cTpeWay charges 0.5% of every deposit. That is the only platform fee. There is no platform fee on payouts or refunds.

The fee is always charged in the network’s native coin: ETH on Ethereum, BNB on BNB Smart Chain, BTC on Bitcoin, SOL on Solana, TRX on Tron. This is true even when the deposit itself is a token.

That leads to two cases.

Example: your customer pays in BNB on BNB Smart Chain.

The platform fee is taken from the deposit itself when it is released, together with the network fee of the transfer. What remains arrives in your master wallet. You need nothing in your master wallet for this, and a native-coin deposit is never held for the fee.

Example: your customer pays in USDT on BNB Smart Chain.

A token cannot pay a fee that is charged in the native coin. So the platform fee is paid from your master wallet, in the native coin, and so is the network fee of moving the tokens. The full token amount then arrives in your master wallet.

If your master wallet does not hold enough native coin to pay both, the deposit waits in its address until it does. This is the status Held. Nothing is lost and your customer is unaffected. Send native coin to your master wallet on that network and the deposit is released.

The fee is 0.5% of the deposit’s value in USD, converted to the native coin. Both prices are taken at the moment the payment is confirmed and stored with the settlement, so the fee of a held deposit does not change while it waits.

An illustration, with every amount on BNB Smart Chain: a deposit of 100 USDT is confirmed while the native coin, BNB, is priced at 600 USD.

Deposit 100 USDT on BNB Smart Chain, worth 100.00 USD
Platform fee 0.5% = 0.50 USD = about 0.000833 BNB
Needed in the master wallet about 0.00093 BNB: the platform fee plus the network fees
Master wallet holds 0.01 BNB Released. The full 100 USDT on BNB Smart Chain arrives in the master wallet.
Master wallet holds 0.0005 BNB Held until you add native coin.

A very small platform fee is not sent in a transaction of its own. It is carried forward and collected with the next settlement on the same network. The size below which this happens is not final.

A platform fee is not always paid at the moment it is worked out. The fee report in the dashboard, under Balances, shows every fee and where it stands, in three parts:

Part Meaning
Charged The fee has been paid: the transaction that paid it is in a block. For a native-coin deposit, it was taken from the deposit on its way out.
Carried The fee was too small for a transaction of its own. It was carried forward when the deposit was released, and a later fee transfer collects it.
Due Neither yet. The deposit is still waiting, as pending, held, releasing or failed. The fee of a held deposit is due, not charged.

The three parts always add up to the fee. On a settlement, fee_native is the whole fee, fee_paid the charged part and fee_carried the carried part.

A settlement has one status. The three you will see most are Pending, Held and Released.

Status Meaning What to do
pending The payment is confirmed and the settlement is waiting to be released. Nothing.
held The deposit is waiting in its address. reason says why. Usually your master wallet is short of native coin. Usually: add native coin to the master wallet on that network. See the reasons below.
releasing The transfers are on their way. Nothing.
released The funds are in your master wallet. Nothing.
failed The release could not be completed. reason says why. See the reasons below. You can ask for another attempt with POST/v1/settlements/{id}/release.
reverted The payment was removed from the network after it had been confirmed. See Payments and confirmations.

Only a token deposit can be held for an unpaid fee.

A settlement that is held or failed carries a reason. It is one of these values, and absent in every other status.

reason Status Meaning What to do
insufficient_master_balance held The master wallet has too little native coin to pay the platform fee and the network fees of the release. Only token deposits can be held for this. Add native coin to the master wallet. The deposit is then released by itself.
uneconomic held The network fee of the release is estimated at more than half of what the deposit is worth. Nothing. It is looked at again regularly and released when the estimate falls.
below_sweep_min held The deposit is worth less than the minimum you have set for moving a deposit. Nothing, or lower that setting. It is released when the setting allows it, or when another release from the same address takes it along.
payment_orphaned failed A network reorganisation removed the payment while its release was under way. Nothing. The settlement returns to the queue by itself if the payment is confirmed again.
replanning failed For a moment only: a transaction prepared for the release could not be used as it was, and the release is being planned again by itself. Nothing.
transaction_failed failed A transaction of the release was rejected, or can no longer be included. It is retried by a cTpeWay operator. What was already paid is not paid again.
funds_missing failed The deposit is no longer at its address, and no release on record moved it. It needs a cTpeWay operator.
not_releasable failed The network cannot release this deposit as it stands. It needs a cTpeWay operator.
unclassified failed A reason outside this list. It needs a cTpeWay operator.

On Tron in particular, moving a token deposit uses TRX for the network fee, so a small token deposit on Tron may wait as uneconomic until moving it is worth it.

When native coin arrives in your master wallet, cTpeWay releases held deposits by itself. You do not need to call anything.

  • Deposits are released oldest first.
  • A deposit that the balance cannot cover is skipped, so one large held deposit does not block the smaller ones behind it.

This order comes from the v2 design and can change before launch.

To find out what is held and how much to add:

Where What it tells you
settlement.held Sent when a deposit becomes held. Includes required_native, the native coin needed for this release, and master_wallet_address, where to send it.
master_wallet.low_balance Sent when deposits are held because the master wallet is short. Includes held_count and required_to_clear, the amount that releases everything.
GET/v1/master_wallets/{network} The master wallet’s address and balances, held_count and required_to_clear.
GET/v1/settlements The list of settlements. Add ?status=held for the deposits that are waiting.
Dashboard, Balances The total held on each network and the amount needed to release all of it.

If you have just topped up and do not want to wait, POST/v1/settlements/{id}/release asks for a release attempt now. It answers with the settlement as it is at that moment; settlement.released or settlement.held follows as an event.

These are the fields you will use most. The API reference lists all of them.

Field Meaning
gross The deposit, in the smallest unit of its asset.
fee_native The platform fee, in the smallest unit of the network’s native coin.
fee_source deposit when the fee is taken from a native-coin deposit, master when your master wallet pays it for a token deposit.
fee_paid, fee_carried How much of the fee has been charged, and how much was carried forward. See Charged, carried and due.
required_native Native coin your master wallet must hold for this release.
network_fees Network fees paid for this settlement, in the native coin.
net_released What arrived in your master wallet.
reason Why the settlement is held or failed. See the list of reasons.
fee_tx, topup_tx, sweep_tx The transactions that paid the fee, sent native coin to the deposit’s address when that was needed, and moved the funds.
Native-coin deposit Token deposit
Platform fee (0.5%) Taken from the deposit. Paid by your master wallet, in native coin.
Network fee of the release Taken from the deposit. Paid by your master wallet, in native coin.
Can be held for the fee No. Yes, until the master wallet can pay.
You receive The deposit minus both fees. The full token amount.

Released funds stay in your master wallet until you send them somewhere. A payout does that. POST/v1/payouts sends an amount of one asset on one network, from the master wallet of that network, to an address you name.

Because a payout moves money out, the API asks for more than usual:

  • The key must be allowed to pay out. A new secret key cannot. It needs the payouts:write permission, granted when the key is created, and at least one limit: an IP allowlist (the key then pays any valid address, only in requests from those IP addresses) or a payout allowlist (the key pays only the addresses on it). See API keys.
  • An Idempotency-Key header is required, so that a retry can never pay twice. See Idempotency.
  • The amount is what the destination receives, in the asset’s smallest unit.

A payout starts as pending, moves through processing and included to confirmed, or ends as failed with a failure_code. You are told by the events payout.broadcast, payout.confirmed and payout.failed.

POST/v1/payouts/{id}/cancel cancels a payout, but only until its transaction has been signed.

A failed payout sent nothing. failure_code says why it failed. One value to know is stale: the payout was not signed in time. That happens when it has waited two hours, for instance through a pause of payouts, or when cTpeWay’s payout service was restarted while it waited. A stale payout is not paid late. Create it again, with a new idempotency key.

Payouts and refunds cannot be created while your account is on hold. When cTpeWay has paused payouts for a while, for instance during maintenance, creating one is answered with status 503 and the code payouts_paused, and the dashboard shows a notice. Try again later. A payout created before the pause waits and is sent when payouts resume, unless it has waited two hours by then: it then fails as stale, with nothing sent.

cTpeWay can also pause releases to master wallets for a while. Payments are still detected and confirmed and you receive the same events; the release of a deposit simply waits, and happens within a few minutes of the pause ending.

A refund is a payout that returns one payment, or part of it, to the payer: POST/v1/refunds. The same rules apply. The key needs refunds:write as well as payouts:write, the payer’s address must be on the key’s payout allowlist when the key has one (a key limited by IP address alone refunds to any valid address), and an Idempotency-Key is required. The refunds of a payment cannot add up to more than the payment.

The 0.5% platform fee charged on the original deposit is not returned. See Invoices.

Test mode uses the same settlement rules on test networks, with fees charged in test coins. That lets you see a deposit go from Pending to Held to Released before you go live. See Testing.

Event Sent when
settlement.held A confirmed deposit is waiting in its address.
settlement.released The deposit was moved to your master wallet.
settlement.failed The release could not be completed.
master_wallet.low_balance Deposits are held because the master wallet is short of native coin.