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.
- 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.