---
title: "How to forecast FX costs on cross-border payouts: a monthly budget model"
seoTitle: "How to forecast FX costs on cross-border payouts"
description: "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."
date: "2026-10-13"
updated: "2026-10-13"
category: "payments"
author: "BlindPay Team"
howto:
  name: "How to build a monthly FX cost forecast for cross-border payouts"
  steps:
    - name: "List next month's payouts by corridor"
      text: "Group expected payouts by destination currency and rail, with total volume and payout count for each corridor. Use last month's actuals plus known changes such as new hires or a seller growth target."
    - name: "Measure the all-in cost per corridor"
      text: "From last month's quotes, compute cost per delivered dollar for each corridor: the gap between what you sent and what landed, valued at the market rate. Use commercial_quotation as the market rate on each quote."
    - name: "Add per-payout flat fees"
      text: "Multiply each corridor's payout count by its flat fee. Owners and admins can read the per-rail payout_flat and payout_percentage fee objects from the billing fees endpoint."
    - name: "Add an FX range for local-currency obligations"
      text: "For payouts promised in local currency, such as BRL salaries, convert the obligation at a budget rate and at rates one typical monthly move stronger and weaker. Report the range, not one number."
    - name: "Compare forecast to actual every month"
      text: "Split the variance into volume, cost rate, and FX movement, using the quote fields you logged for each payout. Update the corridor cost assumptions with the new month's data."
faq:
  - q: "What goes into an FX cost forecast for payouts?"
    a: "Four inputs per corridor: expected volume, payout count, the all-in cost percentage from recent quotes, and the flat fee per payout. If some payouts are promised in local currency, add a fifth: a range for the exchange rate, because the dollar cost of a fixed BRL payroll moves with the rate even when fees don't change."
  - q: "Where do I get the cost per corridor?"
    a: "From your own quotes. Each BlindPay quote returns commercial_quotation, the market rate, and blindpay_quotation, the rate after BlindPay's fee, plus flat_fee and partner_fee_amount. Average the all-in cost over last month's payouts per corridor. That beats any published benchmark because it reflects your sizes and your rails."
  - q: "How do I budget for exchange rate moves?"
    a: "Don't try to predict the rate. Pick a budget rate, then compute the dollar cost of your local-currency obligations at a rate one typical monthly move stronger and one weaker. Measure that move from public history such as the Federal Reserve's daily series on FRED. Report the budget as a range."
  - q: "Does paying with stablecoins remove FX risk from the budget?"
    a: "It removes the window between quoting and settling, because a live quote locks the rate for the payment. It does not remove the risk between your budget date and your payment date. If you owe 1,300,000 BRL next month, its dollar cost still depends on where the rate is when you quote."
  - q: "How often should I update the forecast?"
    a: "Monthly, after the books close. Compare forecast and actual, split the gap into volume, cost rate, and FX, and roll the new cost rates into next month. Revisit sooner if a corridor's volume changes by more than a quarter or you add a new rail."
---

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](/docs/payout-quotes)). [How to read an FX quote](/resources/more/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](/resources/more/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](/resources/more/payout-quality-metrics-slippage-expiry-rate), 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](/docs/learn/billing)). 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](https://www.federalreserve.gov/releases/h10/)), and FRED hosts them as series you can download: [Brazilian reals per US dollar](https://fred.stlouisfed.org/series/DEXBZUS) and [Mexican pesos per US dollar](https://fred.stlouisfed.org/series/DEXMXUS).

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](/resources/more/live-quotes-volatile-currencies-latin-america) 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](/resources/more/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](/resources/more/pass-through-or-absorb-fx-costs) 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](/resources/more/how-much-stablecoin-float-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](/docs/learn/billing) to fill in the flat fees.
