Overview
Multi-currency matching converts both transaction amounts to a base currency using the appropriate FX rate, then applies standard matching rules. If the converted amounts fall within tolerance, Matcher creates a match. Otherwise, it creates an exception for review.
Multi-currency matching flow.
How it works
Multi-currency support lives in the existing context types (
1:1, 1:N, N:M) and match rules. There is no separate “multi-currency” context type.
At match time, Matcher computes a base amount and a base currency for each transaction from FX hints in the transaction’s own metadata (see FX from transaction metadata below). Rules that set matchBaseAmount or matchBaseCurrency compare these base values. You cannot upload a base amount directly.
There is no external FX provider or rate-lookup service: the rate always comes from the transaction row itself.
Key components
Configuring rules for multi-currency
Enable multi-currency comparison by setting
matchBaseAmount and matchBaseCurrency to true in the rule config.
The checks on the original values stay active. An EXACT rule compares amount while matchAmount is on, and EXACT and TOLERANCE rules compare currency while matchCurrency is on. Both are on by default, so a cross-currency rule turns them off.
Exact rule with base amount matching
cURL
matchBaseAmount compares the base amounts, and matchBaseCurrency compares the base currencies. A transaction without a base amount fails both checks.
Tolerance rule with base amount matching
cURL
matchBaseAmount, a TOLERANCE rule compares base amounts in place of the original amounts, and absTolerance is in base-currency units.
Confidence scoring
Base-amount rules use the same fixed component weights as all other rules. For the full scoring model, see Confidence scoring.FX from transaction metadata
When a transaction has no base amount yet, Matcher converts it at match time using FX hints carried in that transaction’s
metadata. Matcher does not call any external rate provider. The rate travels with the row.
Conversion only runs when fx_base_currency is present. Conversion never changes the original amount and currency, because it changes only the comparison. Matcher rounds the converted amount to the largest roundingScale among the context’s TOLERANCE rules, or to 2 decimal places when the context has none. Match simulation does not convert, so base-amount rules find no matches in a simulation.
Metadata fields
Example transaction with FX metadata
matchBaseAmount / matchBaseCurrency settings.
When the hints are absent or invalid (unparseable rate, failed expression), the transaction gets no base amount. It cannot match under a base-amount rule and stays unmatched. The run continues.
FX rate-variance band
Cross-currency amounts often disagree slightly, because each side converts at a different rate or on a different day. The
fxVarianceBand key on TOLERANCE rules handles this: it defines a second threshold stacked above the match tolerance, expressed as a decimal fraction (0.0001 = 1 basis point).
After the strict-tolerance pass, Matcher rescans unmatched cross-currency 1:1 pairs. A pair whose base-amount residual exceeds the match tolerance but stays within the band still matches. The pair becomes a proposed group with a fixed confidence of 75, below the auto-confirm threshold, so it always requires human review. Matcher flags both transactions with the FX_RATE_VARIANCE exception reason. The residual then becomes a typed exception instead of collapsing to UNMATCHED.
The band applies only when:
- both sides carry a base amount and the same base currency.
- the original currencies differ (same-currency drift is a plain mismatch, not an FX case).
- all of the rule’s other checks (date window, reference, composite fields) still pass. The rule must set
matchCurrencytofalse, because the currency check rejects pairs whose original currencies differ.
fxVarianceBand disables the band.
cURL
Example: cross-currency reconciliation
Source (EUR account):
Target (USD account):
Both transactions carry
fx_base_currency: "USD". txn_001 carries fx_rate: "1.085" and txn_002 carries fx_rate: "1".
With a TOLERANCE rule (matchCurrency: false, matchBaseAmount: true, matchReference: false, percentTolerance: 0.02):
- Base amounts: 1,095.00
- Difference: $10.00
- Threshold: 2% of the larger amount, $21.90
- Result: Match (21.90)
Best practices
Supply stable FX metadata per transaction
Supply stable FX metadata per transaction
Attach
fx_base_currency and fx_rate (or fx_notional_expr) to each transaction’s metadata at the source, using the rate that applied when the transaction settled. Because the rate travels with the row, results are reproducible across runs, with no runtime rate lookups.Combine with tolerance rules
Combine with tolerance rules
FX conversions introduce small variances. Use TOLERANCE rules with matchBaseAmount to allow for rounding and rate timing differences.
Document your base currency choice
Document your base currency choice
Use a consistent base currency across all contexts. USD is common for international operations. Use your reporting currency for domestic + international.
Next steps
Confidence Scoring
How match scores work and what thresholds apply.
Match Rules
Full reference for rule types and config fields.

