Foreign Exchange (FX) in Payments
Overviewโ
Foreign Exchange (FX) in the context of payments refers to the conversion of one currency to another when a payment is made across different currency zones. FX is involved whenever the debtor and creditor accounts are in different currencies โ domestically (e.g., AUD account โ USD account) or internationally.
When FX is Requiredโ
| Scenario | FX Required? | Notes |
|---|---|---|
| AUD โ AUD (domestic) | โ No | Same currency, no conversion |
| AUD account โ USD account (same bank, on-us) | โ Yes | Intra-bank FX conversion |
| AUD โ USD via SWIFT | โ Yes | Cross-currency international payment |
| EUR โ AUD (inbound SWIFT) | โ Yes | Conversion before credit to AUD account |
| AUD account โ AUD account via SWIFT | โ No | Same currency, different bank |
FX in ISO 20022 Messagesโ
pain.001 โ Instructed Amount vs Settlement Amountโ
<!-- Customer instructs AUD 10,000 to be paid -->
<InstdAmt Ccy="AUD">10000.00</InstdAmt>
<!-- Bank converts to USD for settlement -->
<IntrBkSttlmAmt Ccy="USD">6500.00</IntrBkSttlmAmt>
<!-- Exchange rate applied -->
<XchgRate>0.6500</XchgRate>
pacs.008 โ FX Fieldsโ
<CdtTrfTxInf>
<!-- Settlement amount (in settlement currency) -->
<IntrBkSttlmAmt Ccy="USD">6500.00</IntrBkSttlmAmt>
<!-- Original instructed amount (in original currency) -->
<InstdAmt Ccy="AUD">10000.00</InstdAmt>
<!-- Exchange rate information -->
<XchgRateInf>
<XchgRate>0.65000</XchgRate> <!-- AUD/USD rate -->
<RateTp>AGRD</RateTp> <!-- Rate type: Agreed -->
<CtrctId>FX-20240615-001</CtrctId> <!-- FX deal reference -->
</XchgRateInf>
<!-- Charge Bearer (important for FX) -->
<ChrgBr>SHAR</ChrgBr>
</CdtTrfTxInf>
FX Rate Typesโ
| Code | Name | Description |
|---|---|---|
SPOT | Spot Rate | Current market rate (settlement T+2) |
SALE | Sale Rate | Retail rate charged by bank (includes margin) |
PURC | Purchase Rate | Rate bank pays to purchase foreign currency |
AGRD | Agreed Rate | Pre-agreed rate (from FX contract/forward) |
OVRN | Overnight Rate | Overnight swap rate |
FX in Outbound International Paymentsโ
Customer instructs: Send AUD 10,000 to supplier in Germany (EUR account)
Step 1 โ FX Conversion at Debtor Bank:
Customer's AUD account debited: AUD 10,000
Bank buys EUR at spot rate: 0.6200 AUD/EUR
EUR amount calculated: EUR 6,200
Step 2 โ pacs.008 sent to Creditor Bank:
IntrBkSttlmAmt: EUR 6,200
InstdAmt: AUD 10,000
XchgRate: 0.6200
Step 3 โ Settlement:
Via SWIFT correspondent with EUR account
EUR 6,200 delivered to German bank
Step 4 โ Credit to Creditor:
EUR 6,200 credited to supplier's EUR account
FX in Inbound International Paymentsโ
Overseas sender sends USD 5,000 to Australian recipient (AUD account)
Step 1 โ Received by Australian bank:
IntrBkSttlmAmt: USD 5,000
Step 2 โ Creditor account is AUD:
Bank converts USD โ AUD at current rate
USD/AUD rate: 1.5400
AUD credited: AUD 7,700
Step 3 โ camt.054 to customer:
Original amount: USD 5,000
Credited amount: AUD 7,700
Exchange rate: 1.5400
FX Rate Componentsโ
Banks earn revenue on FX through:
Mid-market rate (interbank): 1 AUD = 0.6500 USD
โ
Bank margin: + 0.0050 (spread)
โ
Customer buy rate (selling AUD): 1 AUD = 0.6450 USD โ customer gets less
Customer sell rate (buying AUD): 1 AUD = 0.6550 USD โ customer pays more
Transaction Fee vs Spreadโ
- Spread โ Built into exchange rate (hidden cost)
- Transaction fee โ Explicit fee per transaction (e.g., $15 per SWIFT payment)
- Correspondent charges โ Fees deducted by intermediary banks (per
ChrgBr)
Charge Bearer (ChrgBr) and FX Impactโ
ChrgBr | Who pays what | Impact on credited amount |
|---|---|---|
DEBT | All fees paid by sender | Creditor receives full converted amount |
CRED | All fees paid by receiver | Correspondent fees deducted from credited amount |
SHAR | Each pays own bank | Sending bank fee on sender; receiving bank fee on receiver |
SLEV | Per service level | Defined in agreement |
FX Hedging and Forward Contractsโ
Corporate customers often hedge FX risk:
Company A needs to pay EUR 100,000 in 3 months:
TODAY:
Book FX forward contract at rate 0.6200 AUD/EUR
Lock in: need to deliver AUD 161,290 to get EUR 100,000
IN 3 MONTHS:
Regardless of spot rate (0.5900 or 0.6500),
execute at agreed rate 0.6200
CtrctId referenced in pacs.008 XchgRateInf
Multi-Currency Accountsโ
Banks may offer multi-currency accounts allowing customers to hold balances in multiple currencies:
Customer Account:
โโโ AUD wallet: $10,000
โโโ USD wallet: $5,000
โโโ EUR wallet: โฌ3,000
Outbound USD payment:
โ Debit USD wallet directly (no FX needed)
Outbound GBP payment:
โ No GBP wallet โ FX from AUD wallet โ GBP settlement
Regulatory FX Obligationsโ
| Requirement | Description |
|---|---|
| IFTI Reporting | All international transfers (any amount) reported to AUSTRAC |
| Best Execution | Banks must obtain fair FX rates for customers |
| Rate Disclosure | Rate, fees, and total amount must be disclosed (ASIC) |
| RBA FX reporting | Large FX positions reported to RBA |
Java Spring Notesโ
@Service
public class FxConversionService {
public FxConversionResult convert(
BigDecimal amount,
Currency fromCurrency,
Currency toCurrency,
FxRateType rateType) {
if (fromCurrency.equals(toCurrency)) {
return FxConversionResult.noConversion(amount, fromCurrency);
}
// Get rate from FX rate provider (Reuters, Bloomberg, internal)
FxRate rate = fxRateProvider.getRate(
fromCurrency, toCurrency, rateType);
BigDecimal convertedAmount = amount
.multiply(rate.getRate())
.setScale(2, RoundingMode.HALF_UP);
// Audit log the conversion
fxAuditLog.record(FxAuditEntry.builder()
.fromCurrency(fromCurrency)
.toCurrency(toCurrency)
.originalAmount(amount)
.convertedAmount(convertedAmount)
.rate(rate.getRate())
.rateType(rateType)
.rateTimestamp(rate.getTimestamp())
.build());
return FxConversionResult.builder()
.originalAmount(amount)
.originalCurrency(fromCurrency)
.convertedAmount(convertedAmount)
.convertedCurrency(toCurrency)
.exchangeRate(rate.getRate())
.build();
}
}
Related Conceptsโ
- swift.md โ FX is most common on SWIFT cross-border payments
- pacs008.md โ FX fields in interbank message
- inbound.md โ FX on inbound payments
- outbound.md โ FX on outbound payments
- fis.md โ Nostro accounts per currency
Interview Questions (Senior Level)โ
- How do you manage FX rate integrity and auditability across pricing, booking, and settlement?
- What controls prevent margin leakage and customer-disclosure issues in cross-currency payments?
- How do you design fallback behavior when market data feeds fail during payment processing?
- When should treasury hedging decisions be decoupled from payment execution?
Short answer guide:
- Version rates with timestamps and immutable deal references.
- Enforce transparent fee/spread disclosure and reconciliation.
- Use stale-rate thresholds, circuit breakers, and controlled degradation.
- Keep execution deterministic while treasury manages exposure policy.
Interview Focus
Explain rate sourcing, execution, audit trails, and treasury separation of concerns.
Interview Trap
Reducing FX design to conversion math while ignoring stale-rate and disclosure risk.