Back to Journal
financeen

Multi-currency reconciliation: HUF, EUR, USD in one flow

1,800 monthly transactions, four currencies, 11-second reconciliation versus 38 minutes by hand, and the December 2025 zero-rate bug.

More than half of Hungarian SMEs run their books in at least three currencies: HUF for payroll, EUR for invoicing the West, USD for AWS bills. A software company invoices in EUR, pays AWS in USD, and runs salaries in HUF. An importer invoices the consumer in HUF, pays the supplier in EUR, covers logistics in USD. Every one of those movements is a reconciliation line, and every one of them depends on the MNB middle rate.

What the Netorigo Finance module handles

We fetch the official Hungarian National Bank (MNB) rates daily — the middle rate for 32 major currencies. Rates land in an fx_rate table keyed by date, currency, middle rate, and capture timestamp. Whenever an invoice, bank transaction, or internal journal entry is booked, it receives the matching daily rate. If a user needs a specific rate (a card-transaction rate from their card statement, for example), they can override it manually; every override is written to an audit trail.

At month close we run an automatic revaluation. FX-denominated balances — primarily receivables and payables — are revalued at the last working day's rate. The resulting unrealized FX gain or loss lands on the right ledger account (911 for gain, 871 for loss in the Hungarian chart of accounts).

The bug from late 2025

In the last week of December 2025, one of our partners running a four-currency operation had hundreds of thousands of forints worth of entries mistakenly categorized at a zero rate. Root cause: during the Hungarian public holidays (24-26 December) the MNB does not publish rates, so the fx_rate table received no new rows for three days. The naive code did a findFirst({ where: { date: tx.date } }) and got back null, then a downstream layer treated null as 0 when summing.

The fix: every rate lookup now follows a forward-fill rule — if no rate exists for the requested day, use the most recent prior rate and tag the row with rate_source = 'inherited'. A migration retroactively repaired the December 24-26 entries and wrote the original-versus-corrected delta into an fx_rate_audit table. The blast radius was 87 entries and 1,247,000 HUF.

The four-currency tenant

One IT services partner books transactions in four currencies (HUF, EUR, USD, GBP), about 1,800 transactions per month. Reconciliation used to take 38 minutes by hand (an Excel artisan with overlapping pivot sheets); it now runs in 11 seconds inside the Netorigo module.

The trick: reconciliation runs as a single SQL query that groups transactions by partner, currency and end-of-month, joins the matching MNB rate, converts to HUF and aggregates. The output is a CSV or XLSX picked up by the partner's general ledger application (SAP B1 in this case).

What we do not do

We do not use real-time market rates (Bloomberg, Reuters, Open Exchange Rates). MNB only. For Hungarian counterparties the official rate is the common language, and the MNB daily middle rate is the audit-suitable reference. A card-transaction rate can be set manually per entry; the override is audited.

We do not run advanced hedge accounting (FX forward, swap, option). That is a specialist domain typical SMEs do not need, and we do not want to drag the Finance module into treasury-system territory.

The bigger picture

Multi-currency reconciliation is not a hard problem, but it is a problem full of small traps: missing rates, public holidays, month-end revaluation, manual overrides, audit trail. Get each of those right and 1,800 monthly transactions reconcile in eleven seconds.