FX slippage

Detecting Stripe Connect FX slippage

This one is different from the other three. There is no missing flag and nothing to claw back — the conversion happened and the spread is gone. What you can do is measure it, and measurement is what turns an invisible cost into a negotiable one.

Measuring without a third-party FX feed

Comparing Stripe's rate against a mid-market feed mostly restates the fact that Stripe charges a spread. That is a pricing negotiation, not a reconciliation finding, and it adds an external dependency with its own spread to a number you need to trust.

The useful measure is relative: how did this transfer's realised rate compare to the rate the same currency pair achieved on comparable transfers the same day? That isolates outliers — the transfers where something actually went wrong.

A 1.2% deviation on $200k monthly cross-border volume
Monthly cross-border volume
$200,000
Typical spread
~0.5%
Observed on affected transfers
~1.7%
Excess cost per month
$2,400
Annualised if unchanged
$28,800
const balanceTx = await stripe.balanceTransactions.retrieve(
  transfer.balance_transaction as string,
);

// Populated only for cross-currency transfers
const realisedRate = balanceTx.exchange_rate;
const deviation = Math.abs(realisedRate - dayBaseline) / dayBaseline;

if (deviation > 0.008 && realisedRate < dayBaseline) flag(transfer.id);

Only losses, never windfalls

A conversion better than the day's baseline is a good outcome, not a discrepancy. Flagging it would be noise in a queue people are trying to work through.

The check must be directional: flag only where the realised rate is worse than baseline beyond tolerance. Symmetric deviation checks roughly double the finding count while adding nothing actionable.

What an outlier usually means

A deviation several times your normal spread rarely indicates one bad conversion. It usually indicates a misconfigured settlement currency — and that keeps costing money on every future transfer until someone changes a setting.

That is why FX findings are worth surfacing despite being unrecoverable: the individual loss is sunk, but the cause is often still live.

Reducing it

Hold a balance in the destination currency where volume justifies it. Batch cross-border payouts rather than converting per transaction. And once you can quantify annual conversion cost, negotiate it — a documented figure is the only thing that makes that conversation productive.