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.

CostWhat drives itHow predictableHow to forecast
Transaction costVolume x all-in cost per corridor, plus flat feesVeryCorridor table from last month's quotes
FX exposureLocal-currency obligations x rate changeNot at allRange 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.

CorridorVolume (USD)PayoutsAll-in costFlat feeCost
BRL over Pix250,0004000.70%1.00 USD250,000 x 0.007 + 400 x 1.00 = 2,150
MXN over SPEI120,0001500.60%1.00 USD120,000 x 0.006 + 150 x 1.00 = 870
EUR over SEPA80,000400.50%2.00 USD80,000 x 0.005 + 40 x 2.00 = 480
Total450,0005903,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).

ScenarioRateDollar cost of 1,300,000 BRLVersus budget
USD/BRL up 4% (weaker real)5.20 x 1.04 = 5.408240,384.62 USD-9,615.38
Budget5.20250,000.00 USD0
USD/BRL down 4% (stronger real)5.20 x 0.96 = 4.992260,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:

  1. Use the same window every month, for example the last 24 months, so the range doesn't jump because you changed the method.
  2. Size the range per currency. How live quotes handle volatile currencies shows why BRL, MXN, COP, and ARS behave differently.
  3. 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.

VarianceFormulaOwner
Volume(actual volume - forecast volume) x forecast cost rateOperations or growth
Cost rate(actual cost rate - forecast cost rate) x actual volumePayments team
FXlocal obligation / actual rate - local obligation / budget rateTreasury

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