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 is built into the existing context types (
1:1, 1:N, N:M) and match rules — there is no separate “multi-currency” context type.
When transactions have different currencies, Matcher uses the amountBase and currencyBase fields on each transaction to compare converted amounts. Today, these base fields are populated at match time: Matcher derives them from per-transaction FX hints carried in the transaction’s own metadata (see FX from transaction metadata below).
You cannot supply a base amount directly at file upload — the field-map vocabulary has no base-amount columns. If a transaction already carries a base amount, Matcher honors it and never overwrites it, but the supported way to get base amounts onto your transactions is the FX metadata path.
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.
Exact rule with base amount matching
cURL
matchBaseAmount is true, the rule compares amountBase fields instead of amount. When matchBaseCurrency is true, it compares currencyBase instead of currency.
Tolerance rule with base amount matching
cURL
Confidence scoring
ThematchScore and matchBaseScore fields are accepted and validated in the rule config, but they do not influence the calculated confidence score. The scoring engine always uses the fixed internal component weights (DefaultConfidenceWeights: amount 40, currency 30, date 20, reference 10) to produce a 0–100 score. Values like matchScore: 100 or matchBaseScore: 90 are not applied directly as the match output.
These fields are currently reserved for future use (retained for parity across rule configs and for metrics); setting them has no effect on how a match is scored or auto-confirmed today.
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, and it never overwrites a base amount that is already set on the transaction. The original amount and currency are never mutated — conversion changes only the comparison.
Metadata fields
Example transaction with FX metadata
amountBase = 1000.00 * 1.085 = 1085.00 and currencyBase = USD, then compares against the other side using the rule’s matchBaseAmount / matchBaseCurrency settings.
If a transaction already carries a base amount, these metadata hints are ignored — Matcher never overwrites an existing base amount. If the hints are missing or malformed (unparseable rate, failed expression), the transaction simply does not participate in base-amount matching — the run is not aborted.
When base fields are missing
When a rule requires base-amount matching (matchBaseAmount / matchBaseCurrency) and transactions lack a base amount or base currency, Matcher records the condition under the FX_RATE_UNAVAILABLE exception reason. You can filter the exceptions list by reason=FX_RATE_UNAVAILABLE (along with the related MISSING_BASE_AMOUNT and MISSING_BASE_CURRENCY reasons) to find transactions that could not join base-amount comparison.
FX rate-variance band
Cross-currency amounts often disagree slightly because each side was converted 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. Both transactions are flagged with the FX_RATE_VARIANCE exception reason so the residual is recorded as 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 gates (date window, reference, currency, composite fields) still pass.
fxVarianceBand disables the band.
cURL
Transaction fields
For multi-currency matching, each transaction carries both original and base currency fields. You supply
amount and currency at upload; Matcher derives amountBase and currencyBase at match time from the FX metadata:
Example transaction
After FX conversion, a transaction looks like this internally:Example: cross-currency reconciliation
Source (EUR account):
Target (USD account):
With a TOLERANCE rule (
matchBaseAmount: true, percentTolerance: 0.02):
- Base amounts: 1,095.00
- Variance: $10.00 (0.92%)
- Tolerance: 2%
- Result: Match (0.92% < 2%)
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 — no runtime rate lookups.Reflect FX uncertainty through rule design
Reflect FX uncertainty through rule design
matchBaseScore and matchScore are reserved fields and do not change the calculated confidence score — the engine always uses the fixed 40/30/20/10 weights. To flag FX-converted matches for review, design the rule itself (e.g. tighter tolerances or required reference/date checks) instead of relying on these score fields.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.

