Skip to content
The ExampleThe Exchange GapIn RivanePublished October 14, 2026

Why do two companies in the same group disagree about what they owe each other?

Lists of causes are easy to find. We built one example month for a three company group, ran it through a real matcher, and split the difference into its parts, including the one that survives every journal fix.

One group, one September close.

Current answers to this question list the causes: timing, currency, missing entries, keying errors. All true. What they do not show is how the causes stack inside one difference, or which of them a journal cannot fix.

So here is an example group. Parent reports in US dollars. Rhine GmbH is its German subsidiary and keeps its books in euros. Services LLC is a second US company. Every intercompany charge is invoiced in dollars. We used example exchange rates, not market rates: 1.10 dollars per euro until 25 September and 1.08 from 26 September, which is also the closing rate. Company names are placeholders.

What each side booked on its intercompany accounts for September. Parent amounts in US dollars. Rhine converts each dollar invoice to euros at the rate on the day it books.
ChargeParent’s booksRhine’s booksMatcher result
Opening balance (August invoice)200,000.00 due from RhineEUR 181,818.18 due to Parent, at 1.10Carried forward
Management fee, ref IC-093050,000.00 on 30 SepEUR 46,296.30 on 30 Sep, at 1.08Matched
Goods shipment, ref IC-0924120,000.00 on 24 SepEUR 111,111.11 on 6 Oct, at 1.08Date lag, across the month end
IT recharge, ref IC-091718,400.00 on 17 SepEUR 16,363.64 on 19 Sep (18,000.00), at 1.10Amount mismatch, 400.00
Interest on the group loan6,250.00 on 30 SepNothing bookedMissing mirror
Consulting, ref IC-0912Billed by Services LLC, 9,800.00 on 12 SepEUR 8,909.09 on 12 Sep, booked as due to ParentWrong counterparty
What each side booked on its intercompany accounts for September. Parent amounts in US dollars. Rhine converts each dollar invoice to euros at the rate on the day it books.

The balances are 120,991.81 dollars apart.

We ran these entries through the matching code Rivane uses, with its default settings. It matched one pair of journals, found one break of each journal type, and then compared the closing balances in dollars, translating Rhine’s euro balance at the closing rate.

Closing balances at 30 September in US dollars. Tolerance is 0.5 percent of the larger side, with a floor of 100 dollars. Our calculations, checked against the Rivane matcher.
PairOwed to the lenderOwed by Rhine, at 1.08DifferenceToleranceResult
Parent and Rhine394,650.00EUR 253,387.21 = 273,658.19120,991.811,973.25Balances disagree
Services LLC and Rhine9,800.00Nothing due to Services9,800.00100.00Balances disagree
Closing balances at 30 September in US dollars. Tolerance is 0.5 percent of the larger side, with a floor of 100 dollars. Our calculations, checked against the Rivane matcher.
What makes up the 120,991.81 dollar difference between Parent and RhineTiming 120,000.00. Missing mirror 6,250.00. Exchange difference 4,141.81. Amount mismatch 400.00. Wrong counterparty reduces the difference by 9,800.00. Total 120,991.81.ONE DIFFERENCE, FIVE CAUSES. US DOLLARS.Timing120,000.00Missing mirror6,250.00Exchange difference4,141.81Amount mismatch400.00Wrong counterparty(9,800.00)Total difference: 120,991.81
Example September close. The wrong counterparty entry makes Rhine owe Parent more, so it narrows the gap and hides part of the others. Our calculations, checked against the Rivane matcher.
The Parent and Rhine difference, item by item. Brackets reduce the difference.
ItemBreak typeUS dollars
Goods booked by Rhine in OctoberTiming120,000.00
Interest not booked by RhineMissing mirror6,250.00
Euro balance translated at 1.08, booked at 1.10Exchange difference4,141.81
Recharge booked 400 shortAmount mismatch400.00
Consulting booked as due to ParentWrong counterparty(9,800.00)
Total difference120,991.81
The Parent and Rhine difference, item by item. Brackets reduce the difference.

Two things stand out. The wrong counterparty entry hides part of the problem: Rhine booked a 9,800 dollar consulting invoice from Services LLC as owed to Parent, which makes the Parent pair look 9,800 better and leaves Services LLC with nothing on the other side. A team that only compares one pair at a time can spend a day on the wrong company.

The second is the 4,141.81 dollars of exchange difference. No journal is missing or wrong there. Rhine booked its August balance and two September invoices at 1.10, and by 30 September a euro buys 1.08 dollars, so the same euros are worth fewer dollars than Parent is owed.

The gap that stays after every journal is fixed.

Suppose Rhine fixes all four journal breaks on 30 September: it books the goods in transit, tops up the recharge by 400 dollars, books the interest, and moves the consulting invoice to Services LLC. We ran the matcher again.

Closing balances in US dollars after the journal fixes, then after revaluation. Our calculations, checked against the Rivane matcher.
StagePairOwed to the lenderOwed by RhineDifferenceResult
After the four journal fixesParent and Rhine394,650.00EUR 361,746.64 = 390,686.373,963.63Break
After the four journal fixesServices LLC and Rhine9,800.00EUR 8,909.09 = 9,621.82178.18Break
After Rhine revalues at 1.08Parent and Rhine394,650.00EUR 365,416.67 = 394,650.000.00Matched
After Rhine revalues at 1.08Services LLC and Rhine9,800.00EUR 9,074.07 = 9,800.000.00Matched
Closing balances in US dollars after the journal fixes, then after revaluation. Our calculations, checked against the Rivane matcher.

Both pairs still break. The Parent pair is 3,963.63 dollars apart against a tolerance of 1,973.25, and the Services LLC pair is 178.18 apart against a tolerance of 100. Widening the tolerance would hide it this month and fail again next month.

The answer is in IAS 21. Paragraph 23(a) says foreign currency monetary items are translated at the closing rate at the end of each reporting period, and paragraph 28 puts the exchange difference in profit or loss. Rhine owes dollars, so it must remeasure those dollar payables at 1.08. That entry is a loss of EUR 3,670.03 on the Parent balance and EUR 164.98 on the Services LLC balance. After it, both pairs agree to the cent.

Then comes the part that surprises people. IFRS 10 paragraph B86(c) eliminates intragroup balances in full, so the 394,650 dollars disappear from the group balance sheet. Rhine’s exchange loss does not. IAS 21 paragraph 45 says an intragroup monetary item cannot be eliminated against its mirror “without showing the results of currency fluctuations”, because it commits the group to convert one currency into another. The loss stays in consolidated profit or loss, as a real cost of the group carrying a dollar balance inside a euro company.

That is why one common example of a currency conversion difference corrected before consolidation needs care. If the difference comes from rates, the right fix is the revaluation entry in the entity that holds the foreign currency item. Adjusting one side to equal the other, or plugging the elimination, removes a gain or loss the group is required to report.

A close order that ends with matching balances.

  1. Agree a cut-off date and one shared reference for every intercompany charge. The issuer puts the reference on the invoice and the receiver keys it on its journal. A shared reference is what lets a matcher pair two lines with different dates or amounts.
  2. Map every intercompany account to one counterparty. An account called “due to group companies” cannot tell you which company Rhine owes, so a wrong counterparty stays invisible until the balances refuse to agree.
  3. Revalue foreign currency intercompany items in each entity at the closing rate before you match. This is the step most often left until after the matcher, and it is the one that produces a gap no journal fix can close.
  4. Match the journals and work the breaks by type. Timing: the receiver books goods in transit at month end. Amount: the issuer’s invoice is the reference, and the receiver corrects. Missing mirror: the receiver books its side. Wrong counterparty: reclassify to the right company.
  5. Reconcile the closing balances last, in the group reporting currency, with a tolerance stated in advance. Whatever is left above it after the steps above is an open question for a person, not a plug.
  6. Eliminate the agreed balances, and leave the exchange gains and losses from step 3 in group profit or loss.

What Oracle and SAP give you.

Oracle’s intercompany reconciliation report shows the receivables and payables difference in transaction currency. If you add a second currency, it asks for a conversion rate type and date. From the difference you drill to the journal lines that sit in one balance but not the other, and Oracle’s stated fix for a line posted to the wrong account is to reverse it.

SAP S/4HANA intercompany matching and reconciliation matches items with a matching method built from matching rules, with exact, suggested and exceptional match patterns. Reconciliation cases group the results into display groups with tolerance settings, and runs can be started from the apps or scheduled as background jobs.

Both are strong at finding the lines that differ. In both, as in any system, the revaluation is a separate close step, so put it before the matching run on the close calendar.

How Rivane matches intercompany today.

Rivane’s intercompany matcher runs per consolidation group and period, from Close management, Intercompany, with a Run matcher button. It starts from a counterparty map that names the group company behind each due-to and due-from account, compares every pair of companies in the group reporting currency, and labels each break with one of the five types used above. The tables in this article come from running the example through that matching code with its defaults.

Rivane intercompany matcher, as built

# How Rivane's intercompany matcher works today.

counterparty map  each due-to / due-from account, per
                  entity, names one group company
legs read         the period, widened by 62 days either
                  side, so a mirror in the next month
                  is still found
translation       every leg at the spot rate on its
                  posting date; closing balances at the
                  closing rate. A missing or stale rate
                  stops the run; it never assumes 1.0
tolerance         0.5% of the larger side, floor of 100
                  in the reporting currency
date window       7 days (settable 0 to 31)
same transaction  shared reference such as IC-0917, or
                  50% of narration words in common
break types       date lag, amount mismatch, wrong
                  counterparty, missing mirror,
                  balances disagree
each item         stored with a plain explanation, the
                  rate receipt and a link to the source
                  journal
matched balances  passed to consolidation as the
                  elimination for that pair

What it does not do: the matcher reports breaks and does not post corrections. Fixing a break means a journal in the entity concerned, then a rerun. It also translates balances as they stand in the ledger, so the revaluation in step 3 of the close order has to be posted before the run for the exchange gap to clear. Tolerance and the date window can be changed per run through the API; the screen uses the defaults.

Keep the record your auditor will ask for.

  • The counterparty map in force for the period, with who changed it and when.
  • Every matched pair and every break, with both journal numbers, dates, amounts, and the rate used to translate each side.
  • The revaluation entry in each entity, with the closing rate, its date and its source.
  • For each break: the correcting entry, who posted it, and the rerun that shows the pair matched.
  • The elimination entry, tied to the reconciled balances it removes.

Revalue first, then match.

In the example, four of the five causes were journals to fix, and each had an owner and a date. The fifth was 3,963.63 dollars of exchange difference that only a revaluation could clear, and its loss belongs in group profit. Put revaluation ahead of matching on the close calendar and the balances that remain to argue about are the real ones.

If you run a group with more than one currency, see how Rivane handles multi-entity close, intercompany matching and eliminations.

Sources

A note on how this was researched. IFRS 10 and IAS 21 were read in the text adopted by the European Union. This article cites IFRS; if you report under US GAAP, confirm the treatment under ASC 830 with your auditor. The Oracle and SAP behaviour comes from each vendor’s own pages and may differ by release. The group, the charges and the rates are examples, and every figure was produced by the Rivane matching code and checked by hand. The Rivane section describes the product as built today, checked against the code rather than marketing copy.

On embedded social posts: we looked for public posts from vendors or practitioners on exchange differences in intercompany reconciliation and found none we could verify as current, relevant and authentic, so this article uses ordinary citations instead.