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
cover_fees: true puts the fees on the sender, cover_fees: false takes them from what the recipient gets.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.
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):
| Cost | Where it shows | What it is |
|---|---|---|
| FX margin | commercial_quotation vs blindpay_quotation | The gap between the market rate and the rate after BlindPay's fee |
| Flat fee | flat_fee | A fixed amount per payout |
| Your markup | partner_fee_amount | Your 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.
cover_fees is the switch. On a payout quote:
cover_fees | Who pays | Effect |
|---|---|---|
false | The recipient | Fees are deducted from the fiat amount the bank account receives |
true | The sender | Fees 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.
Match the model to the promise you made. A rough guide:
| Business | Promise to the recipient | Model | Quote settings |
|---|---|---|---|
| Payroll and contractor pay | "You get 8,000 BRL" | Absorb | currency_type: receiver, cover_fees: true |
| Supplier invoices (AP) | "The invoice is paid in full" | Absorb | Same as payroll |
| Marketplace seller earnings | "Your balance is $412.50" | Pass through or hybrid | currency_type: sender, cover_fees: false |
| Wallet or app withdrawals | "Cash out what you hold" | Pass through, maybe markup | cover_fees: false, plus partner_fee_id |
| Consumer remittance app | "Send money home" | Markup with disclosure | partner_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.
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).
| Line | Arithmetic | Result |
|---|---|---|
| Platform revenue | 4,000,000 x 10% | 400,000 USD |
| Seller payouts | 4,000,000 x 90% | 3,600,000 USD |
| Payout cost at 0.80% | 3,600,000 x 0.008 | 28,800 USD |
| Cost as share of revenue | 28,800 / 400,000 | 7.2% |
| Cost per 400 USD seller payout | 400 x 0.008 | 3.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.
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.
If your users are consumers, the law may decide part of this for you.
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.
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.
Seven places blockchain payments beat bank rails: contractor payroll, remittances, B2B suppliers, marketplaces, 24/7 treasury, bill pay, and PSP payouts.
Push means the payer sends an ACH transfer. Pull means you debit a connected account. How each funds a USD to USDC on-ramp, the fees, and the return risk.
AP2, ACP, and x402 each verify that an AI agent had permission to spend. Here is what every protocol covers, who backs it, and the reconciliation gap none of them close.