Every FX trade has two sides, and many of them are already standing opposite each other inside the same group or network. One participant needs to sell euros for dollars on the same day another wants to buy euros with dollars. Sent separately to the market, both pay a spread. Matched first, they cancel — and only the true remainder has to trade.
The cost of trading against yourself
When opposite flows are executed independently, each one crosses the spread, incurs a fee and settles on its own timeline. Multiply that across ten currencies and daily operations and the friction adds up, even when the underlying exposure nets to near zero. The margin is paid not on a real risk but on a failure to look across the book before trading.
Netting inside the order book
A single order book changes the sequence. Approved operations are gathered, offsetting currency flows are matched internally, and internal FX settles what both sides already hold. Only the net position — the part with no natural counterparty inside the network — is routed externally. The external trade is smaller, so the spread is paid on less. Routing still evaluates each remaining path by cost, settlement time, reliability and regulatory fit, so the market is used deliberately rather than by default.
What treasury needs to see
Netting only works if treasury can see the whole book. Operations must be captured with enough detail to identify offsetting flows across entities, currencies and time windows. A double-entry ledger, with every entry attributable to a principal, an agent and a policy version, gives that picture and an audit trail behind it. Around ten currencies and per-unit reporting keep the scope manageable, and balances staying with licensed partners does not prevent the matching.
In short
- Opposite flows sent separately pay the spread twice.
- Matching first means only the net position trades externally.
- Internal FX settles what participants already hold.
- A clear ledger is a precondition for trustworthy netting.
See how internal FX and netting interact → /protocol/