Case study · Cross-border payments
Owning the roadmap for a machine-learning FX pricing engine behind cross-border card payments, and deciding how to price 50+ corridors as transparency compressed the margin and customers could finally compare.
If you read nothing else
A global bank earned a quiet FX margin on cross-border card payments across 50+ corridors, priced with blunt, mostly static spreads. Regulators were forcing that spread into daylight and fintechs were advertising near mid-market rates, so the old uniform pricing was losing the contested corridors while leaving margin on the quiet ones. I owned the engine that moved pricing from one-size to corridor-level and machine-learning-driven: tighten where customers could compare, hold where the risk and cost were real. The point was not to cut the price. It was to price each corridor for what it actually is.
When a cardholder pays in a foreign currency, the bank earns a margin on the conversion: a spread over the wholesale rate. Across 50+ corridors, that spread was a meaningful and almost invisible revenue line. I owned the roadmap for the pricing engine that set it, and the mandate was to take it from blunt and largely static toward a machine-learning system that priced each corridor on its own terms.
Two forces were closing on that margin at the same time. From the regulators: a transparency push, the EU's cross-border payment rules forcing currency-conversion costs to be shown and the G20 roadmap setting hard cost-reduction targets, that was dragging the hidden spread into the light. From the market: fintechs advertising near mid-market rates, which made the bank's spread look expensive exactly where customers had started to compare.
The bank's pricing was too uniform to survive that. A one-size spread leaves money on the table in the corridors where the bank still had pricing power, and prices the bank out of the corridors where customers had begun shopping. The instinct in the building was to cut the spread across the board. That was the wrong instinct, and seeing why was the whole job.
A uniform spread is two mistakes at once: too wide where customers can compare, too thin where the risk is real.
The flat line is the old uniform spread. The curve is what each corridor actually warranted. The gap on the left is volume lost to fintechs; the gap on the right is margin and risk mispriced. Closing both gaps, fast, is what the engine was for.
The bet was to refuse the blanket and differentiate hard at the corridor level, letting the model price dynamically rather than settling it by committee. Concretely: tighten spreads on the small set of high-volume, high-transparency, fiercely contested corridors, the liquid major pairs where the fintechs competed hardest and customers comparison-shopped most, GBP/EUR, GBP/USD and EUR/USD, to defend win-rate and volume, accepting thinner per-transaction margin there. And hold or widen on the thin, volatile, lower-competition corridors, the thinner and more volatile emerging-market routes such as GBP/INR and other low-liquidity pairs, where cost-to-serve and FX risk genuinely justified it and customers had fewer alternatives.
What I chose not to do was the two tempting options. Not the across-the-board spread cut the competitive pressure was pushing toward, which would have bled margin in every corridor, including the ones under no pressure at all. And not the do-nothing hold, which kept losing exactly the high-volume corridors that mattered most. The senior call was to price to each corridor's real elasticity and risk, and to put that judgment into a system rather than a meeting, so it could move at the speed the market was moving.
Which corridors to defend on volume and which to defend on margin is the one call that sits between finance, risk, and the customer. Owning the engine meant owning that call.
The hard part was never the model. It was getting three groups with opposing incentives to agree on one engine's behavior. Finance measured me on blended margin. Treasury and risk measured exposure and could veto any spread that left the bank under-hedged. Engineering and data science had to build something aggressive where the data was rich and conservative where it was thin. Each was right from where they sat, and their right answers contradicted each other.
The specific standoff, where risk and treasury wanted wider, safer spreads to keep the volatile corridors hedged while commercial wanted to cut spreads on the major pairs to match the fintech rates customers kept citing, did not get solved by picking a side. It got solved by changing the number everyone was arguing over. Instead of optimizing per-transaction margin, which pits competitiveness against safety in every single corridor, I reframed the target as the blended margin of the whole corridor book, the total contribution across volume rather than the spread on any single transaction. Once both sides could see that defending volume on the contested corridors and protecting margin on the thin ones added up to a better book than either pure position, the veto turned into agreement. The roadmap followed from there: instrument win-rate and margin per corridor, ship corridor-level pricing where the data supported it, hold the conservative default everywhere else.
Corridor-level pricing shipped across the 50+ corridors, moving the engine from static to dynamic. On the targeted contested corridors, the bank stopped pricing itself out and started winning back volume it had been losing to the fintechs, while the blended margin across the book held through a stretch when much of the market was absorbing across-the-board compression. To be honest about attribution: the model was data science's, the metric reframe was a shared win with finance, and my part was owning the call and the roadmap that made it one decision instead of fifty arguments.
What I would do differently
I priced for competition and for risk, and I under-weighted the third dimension that turned out to matter most: how the price would look to a customer who could now see it. As the spread moved from invisible to disclosed, the right test was not only "do we win this corridor" but "would this price look fair to someone comparing it in the open." I would build that visibility test into the engine from day one, and treat a spread that could not survive being seen as a defect, not a margin opportunity.
The spread used to be a number only the bank could see. The work, in the end, was learning to price as if the customer were already looking.
Three years on, that instinct has only sharpened. Transparency rules have bitten, specialist FX spreads have fallen below one percent, and stablecoins are starting to settle the fattest cross-border corridors at near-zero marginal cost. Corridor-level pricing is table stakes now. The frontier has moved to pricing a margin business against rails that increasingly do not need one, and that is the version of this problem I want to work on next.