Should you pass FX costs to your users or absorb them? Pricing cross-border payouts

Absorb, pass through, or mark up: who should pay the FX margin and fees on cross-border payouts, with cover_fees, a worked example, and disclosure rules.

Whether to pass FX costs to users or absorb them depends on what you promised the recipient. If they were promised an exact amount (a salary, an invoice), absorb the cost and fix the amount they receive. If they were promised a share of a balance (marketplace earnings), passing the cost through is normal, as long as the quote shows it clearly.

This is a pricing decision, not a technical one. The API supports both. What changes is your margin, your support load, and how the payout feels on the other end.

Key takeaways

  • Three models: absorb (you pay), pass through (recipient pays), or mark up (recipient pays your cost plus a margin).
  • On BlindPay, cover_fees: true puts the fees on the sender, cover_fees: false takes them from what the recipient gets.
  • Absorb when the amount is a promise: payroll, supplier invoices, refunds.
  • Pass through when the amount is a balance: marketplace earnings, wallet withdrawals.
  • If you pass costs through to consumers, disclosure rules apply in the US and the EU.

What does it mean to pass through or absorb FX costs?

Absorbing means your company pays the FX margin and fees, so the recipient's amount is untouched. Passing through means the cost comes out of the recipient's amount, or is charged to the customer on top. Marking up means passing through more than your cost and keeping the difference.

Every cross-border payout has a cost. The World Bank's Remittance Prices Worldwide puts the global average for sending $200 at 6.36% of the amount (World Bank, Remittance Prices Worldwide). Business payouts on stablecoin rails usually cost far less, but someone still pays. The question is who.

Which costs are you actually deciding about?

You are deciding about three lines, all visible in a quote before you execute it. A BlindPay payout quote returns them as fields (payout quotes docs):

CostWhere it showsWhat it is
FX margincommercial_quotation vs blindpay_quotationThe gap between the market rate and the rate after BlindPay's fee
Flat feeflat_feeA fixed amount per payout
Your markuppartner_fee_amountYour own fee, if you pass a partner_fee_id

BlindPay combines a monthly plan with per-transaction fees that vary by rail and network and are disclosed in the live quote before execute. There is no static rate card, so build your pricing on the quote fields, not on a fixed number of basis points. How to read an FX quote explains which way each rate points, and how to calculate FX spread turns the two rates into a percentage.

How does cover_fees decide who pays?

cover_fees is the switch. On a payout quote:

cover_feesWho paysEffect
falseThe recipientFees are deducted from the fiat amount the bank account receives
trueThe senderFees are added on top of the stablecoin amount sent, so the recipient gets the full amount

The docs call customer-paid fees the most common case and say sender-paid fees are typical for payroll. Combine cover_fees: true with currency_type: "receiver" and you fix the exact local amount that lands, with the quote telling you how much USDC that costs. Paying an exact BRL, MXN, or EUR amount walks through that pairing.

cover_fees moves the fee lines. The FX margin is built into blindpay_quotation either way. If you absorb, you pay it in extra USDC. If you pass through, the recipient sees it in a lower rate.

Which model fits which business?

Match the model to the promise you made. A rough guide:

BusinessPromise to the recipientModelQuote settings
Payroll and contractor pay"You get 8,000 BRL"Absorbcurrency_type: receiver, cover_fees: true
Supplier invoices (AP)"The invoice is paid in full"AbsorbSame as payroll
Marketplace seller earnings"Your balance is $412.50"Pass through or hybridcurrency_type: sender, cover_fees: false
Wallet or app withdrawals"Cash out what you hold"Pass through, maybe markupcover_fees: false, plus partner_fee_id
Consumer remittance app"Send money home"Markup with disclosurepartner_fee_id, full fee breakdown on screen

Hybrid is underrated. Absorb the cost on the first payout of the month, or on payouts above a threshold, and pass it through on the rest. Sellers feel looked after on the payout that matters, and your cost stays bounded.

Illustrative example: what does absorbing cost a marketplace?

A marketplace processes 4,000,000 USD of gross sales a month, keeps a 10% take rate, and pays the other 90% to sellers in Brazil. Assume an all-in payout cost of 0.80% of the amount (illustrative, read your own from the quote).

LineArithmeticResult
Platform revenue4,000,000 x 10%400,000 USD
Seller payouts4,000,000 x 90%3,600,000 USD
Payout cost at 0.80%3,600,000 x 0.00828,800 USD
Cost as share of revenue28,800 / 400,0007.2%
Cost per 400 USD seller payout400 x 0.0083.20 USD

Absorbing costs the platform 7.2% of its revenue. Passing it through costs each seller 3.20 USD on a 400 USD payout, which most sellers barely notice. That asymmetry is why marketplaces usually pass through and payroll platforms usually absorb: a salary of 8,000 BRL that lands as 7,936 BRL is a support ticket, while a seller payout that's 3.20 USD lighter is a line item.

Run the same table with your own numbers. Cost per delivered dollar shows how to get the all-in percentage from real quotes.

How do you add a markup on top of your cost?

Use a partner fee. You create a fee configuration with a percentage (in basis points) or a flat amount (in minor units), separately for payins and payouts, and pass its partner_fee_id on each quote. BlindPay collects it from your customer during the transaction and releases the month's total on the first day of the next month, net of your BlindPay invoice (partner fees docs).

The amount on each transaction is partner_fee_amount on that quote. How platforms add their own margin to a live quote covers whether the markup should sit in the rate or in a separate fee line.

What do disclosure rules require if you pass costs through?

If your users are consumers, the law may decide part of this for you.

  • United States. For consumer remittances, the CFPB Remittance Transfer Rule requires a pre-payment disclosure with the transfer amount, fees, exchange rate, total, and total to the recipient (12 CFR 1005.31).
  • European Union. Regulation 2019/518 requires providers offering currency conversion on an online credit transfer to show the estimated conversion charges, the total in the payer's currency, and the estimated amount the payee receives before the transfer starts (Regulation (EU) 2019/518).

Business payouts often fall outside both, but the same screen is good practice for everyone. How to show a cross-border quote to users lists the six things a quote screen should show.

What to do next

Pick your three most common payout types, label each one "promise" or "balance", and request one quote per type with cover_fees on and off. The payout quotes docs have the request body.

FAQ