How to forecast FX costs on cross-border payouts: a monthly budget model
A monthly budget model for cross-border payout costs: volume by corridor, all-in cost, flat fees, and an FX range for local-currency obligations.
To forecast FX costs on cross-border payouts, multiply each corridor's expected volume by its all-in cost from recent quotes, add flat fees per payout, and then put a range around anything you owe in local currency. The first two parts are stable and easy to predict. The third part moves with the market, so budget it as a range, not one number.
Most finance teams get the first part right and miss the third. A fixed BRL payroll can swing more in dollar terms in a month than every payout fee combined.
Key takeaways
- Split the forecast into transaction cost (fees and FX margin) and FX exposure (local-currency obligations).
- Take each corridor's all-in cost from your own quotes, not from public averages.
- Owners and admins can read per-rail flat and percentage fees from BlindPay's billing fees endpoint.
- Budget local-currency obligations at a budget rate plus or minus one typical monthly move.
- Each month, split the variance into volume, cost rate, and FX.
What are you actually forecasting?
Two different costs that behave differently. Mix them and the forecast is wrong every month for reasons nobody can explain.
| Cost | What drives it | How predictable | How to forecast |
|---|---|---|---|
| Transaction cost | Volume x all-in cost per corridor, plus flat fees | Very | Corridor table from last month's quotes |
| FX exposure | Local-currency obligations x rate change | Not at all | Range from historical moves |
Transaction cost is what the quote shows: the gap between commercial_quotation (market rate) and blindpay_quotation (rate after BlindPay's fee), plus flat_fee and any partner_fee_amount (payout quotes docs). How to read an FX quote explains the direction of each rate.
FX exposure only exists if you promised an amount in local currency. If you pay sellers "whatever their USD balance converts to", you have no FX exposure in the budget. You have it on the seller's side.
How do you measure the all-in cost per corridor?
Use cost per delivered dollar from last month's real payouts. For each payout, value what landed at the market rate on the quote, compare it with what you sent, and average by corridor. Cost per delivered dollar has the formula and the eight hidden costs to include.
You need the quote fields stored per payout. If you followed the payout quality metrics guide, your event log already has quote_id, the quoted receiver_amount, and the delivered amount. If not, start logging now. One month of data is enough for a first forecast.
For the flat part, BlindPay exposes the fee schedule. GET /v1/instances/{instance_id}/billing/fees returns a fee object per payment rail and network, with payout_flat in cents and payout_percentage in basis points. It requires the owner or admin role (billing docs). There is no static public rate card, so this endpoint and the live quote are the two sources of truth.
Illustrative example: what does one month cost?
A company pays contractors and suppliers in three corridors. All numbers are illustrative. Use your own quote history.
| Corridor | Volume (USD) | Payouts | All-in cost | Flat fee | Cost |
|---|---|---|---|---|---|
| BRL over Pix | 250,000 | 400 | 0.70% | 1.00 USD | 250,000 x 0.007 + 400 x 1.00 = 2,150 |
| MXN over SPEI | 120,000 | 150 | 0.60% | 1.00 USD | 120,000 x 0.006 + 150 x 1.00 = 870 |
| EUR over SEPA | 80,000 | 40 | 0.50% | 2.00 USD | 80,000 x 0.005 + 40 x 2.00 = 480 |
| Total | 450,000 | 590 | 3,500 USD |
Transaction cost: 3,500 USD, or 3,500 / 450,000 = 0.78% of volume. That number will be close to next month's actual if volumes hold.
Now the BRL line is a payroll promised in reais: 1,300,000 BRL a month. At a budget rate of 5.20 BRL per USD, that's 1,300,000 / 5.20 = 250,000 USD. Suppose the typical monthly move in the USD/BRL rate is about 4% (illustrative, measure your own).
| Scenario | Rate | Dollar cost of 1,300,000 BRL | Versus budget |
|---|---|---|---|
| USD/BRL up 4% (weaker real) | 5.20 x 1.04 = 5.408 | 240,384.62 USD | -9,615.38 |
| Budget | 5.20 | 250,000.00 USD | 0 |
| USD/BRL down 4% (stronger real) | 5.20 x 0.96 = 4.992 | 260,416.67 USD | +10,416.67 |
Look at the sizes. The whole month's transaction cost is 3,500 USD. The FX range on one payroll is about 20,000 USD wide. That's why the FX line gets its own row and its own owner.
How do you size the FX range?
Use history, not a forecast. Pull a daily series for the currency, compute month-over-month changes, and take a typical move (the standard deviation of monthly changes is a common choice). The Federal Reserve publishes daily rates in its H.10 release (Federal Reserve H.10), and FRED hosts them as series you can download: Brazilian reals per US dollar and Mexican pesos per US dollar.
Three practical rules:
- Use the same window every month, for example the last 24 months, so the range doesn't jump because you changed the method.
- Size the range per currency. How live quotes handle volatile currencies shows why BRL, MXN, COP, and ARS behave differently.
- Decide who owns the range. If treasury wants to narrow it, that's a hedging decision. Live quote vs forward contract vs fixed rate covers when a forward makes sense.
Do live quotes change the forecast?
They remove one source of surprise and leave the other. A live quote locks the rate for the payment itself, so there is no slippage between quoting and settling. If the payout executes inside the quote's window, the cost you forecast per corridor is the cost you get.
They don't fix the rate weeks ahead. The 1,300,000 BRL payroll above still costs whatever the market says on payday. That's not a flaw in the rail. It's the nature of a local-currency promise.
Who pays the transaction cost is a separate decision, and it changes which line it lands on. Passing FX costs to users or absorbing them covers that choice.
How do you explain the variance each month?
Split the gap between forecast and actual into three parts, so each one has an owner.
| Variance | Formula | Owner |
|---|---|---|
| Volume | (actual volume - forecast volume) x forecast cost rate | Operations or growth |
| Cost rate | (actual cost rate - forecast cost rate) x actual volume | Payments team |
| FX | local obligation / actual rate - local obligation / budget rate | Treasury |
A cost-rate variance that keeps growing on one corridor is a signal worth chasing: payout sizes changed, a rail changed, or the market got thinner. The FX variance needs no chasing. It's the range doing its job.
If you hold a USDC float to fund payouts, add its carrying cost to the same review. How much USDC to hold for payouts has the sizing formula.
What to do next
Export last month's payouts with their quote fields, build the three-corridor table above with your own numbers, and pull your fee schedule from the billing fees endpoint to fill in the flat fees.
FAQ
More payments articles
See all payments articlesHow much do cross-border payments cost in 2026? Fees by corridor and what counts as cheap
Sending $200 abroad costs 6.36% on average, per the World Bank. Here is where that money goes, how corridors differ, and what a cheap payment looks like.
Stablecoin payments business case template: how to pitch cross-border stablecoin payouts to your CFO
A fill-in business case for cross-border stablecoin payouts: cost baseline, proposed flow, cost model, risks, pilot plan, and the decision to ask for.
How AI agents get live FX quotes and pay out through MCP and Agent Skills
How an AI agent creates a live stablecoin quote, shows rate, fees, and expiry, waits for a human to confirm, and pays out through BlindPay's MCP server.