One Number for Five Countries
A group trading in Nairobi, Kampala and Dar es Salaam asks its system for one figure. There is a good answer, a bad answer and a dishonest one, and the dishonest one is a single number with no currency on it. We publish the rule we use to avoid that — and a report of ours that breaks it, found while writing this.
The East African Community is unusual among trading blocs in a way that matters enormously to a reporting engine and gets discussed almost nowhere: the member currencies differ from each other not by a few percent but by a factor of roughly thirty. A Ugandan shilling and a Kenyan shilling share a name and nothing else. Put both in the same column and the arithmetic does not fail loudly — it produces a number, the number looks reasonable, and it is wrong by an order of magnitude.
Every regional group eventually asks the same question of its system. What did we spend? Not per country — in total, one figure, for the board pack. It is a completely reasonable thing to want and it is the question this post is about, because the honest answer is more interesting than the one people expect.
Three answers, and only one of them is honest
A system can respond to that question in three ways. The first is to convert everything into one currency and show a total. The second is to show the total in one currency and be explicit that it is one currency. The third is to add the numbers together and print the result without saying what it is.
The third is indefensible, and it is also the most common, because it is what you get when nobody makes a decision. Nothing in the code says "add unlike currencies" — that behaviour arrives by default when a SUM() meets a column whose currency lives somewhere the query never looks.
The first one is the answer most buyers expect and it is worse than it appears. A converted total requires a decision about which rate, as at when. Use today's rate and last year's closed period changes value every time somebody opens the report. Use the rate on each transaction and the total is a sum of thirty different rates that reconciles to no ledger anywhere. Neither version can be tied back to a set of books, which is the one thing a board figure has to survive.
A converted total moves between two viewings of the same closed period. Whatever else a board figure is, it should not be that.
So we chose the second, and wrote it down. Where a single money figure is shown over rows that are not all in the same currency, the rule is: show the largest single-currency total, labelled with its code, with an affordance saying how many other currencies exist. Never add unlike currencies. Never convert. The reader gets a number that is true, a label saying what it is, and the knowledge that there is more — which a single blended figure never gave them.
The part of that rule that is weaker than it sounds
Here is where the EAC makes a general convention specifically awkward, and it is worth setting out because it is the sort of thing a vendor would ordinarily leave in a code comment.
Without a rate, the only way to order currencies is by nominal amount — the raw number, ignoring what it buys. And nominal amounts are not comparable across currencies. In this region that is not a theoretical concern, it is a systematic bias, because the unit values are so far apart and two of the currencies carry no decimals at all.
| Currency | Decimal places we hold | Effect on a nominal ordering |
|---|---|---|
| Kenyan shilling (KES) | 2 | Smallest nominal figures of the group for the same value |
| Tanzanian shilling (TZS) | 2 | Roughly twenty times the KES nominal for equal value |
| Ugandan shilling (UGX) | 0 | Roughly thirty times the KES nominal — and no decimals |
| Rwandan franc (RWF) | 0 | Sorts high on nominal, no decimals |
| Burundian franc (BIF) | 0 | Sorts highest of all on nominal for a given value |
Read that column on the right as one sentence: in a regional group, "largest" picked by nominal amount is mostly a ranking of currency unit sizes, not of businesses. A trivial exposure in Kampala can sort above a serious one in Nairobi. The convention, applied naively, would tell a Kenyan group that its Ugandan operation is its biggest — every time, regardless of the facts.
What actually happens, and it is the right thing
Every place that shows one of these figures passes the organization's base currency as the one to lead with, so the currency the reader thinks in comes first whenever it is present, and nominal ordering only ever arranges the remainder that has already been disclosed as a remainder. It is also stable — the leading figure does not reshuffle as balances move. The weakness is real and it is contained; we would rather describe the containment than pretend the weakness is not there.
The better pattern, in one report
There is a second, stronger approach in the product, and it is worth naming because it is the one a regional group should ask every vendor for. Rather than showing one figure over mixed rows, the sales summary scopes the entire report to a single currency. You pick, from the currencies that actually have data in the period. The base currency leads the picker whether or not it has anything in it, so the default is stable and the report does not silently change shape as trade moves between countries.
That is the right answer for a regional group. Not one blended report, but a report you can run five times and file five times, each internally consistent, each reconcilable to the books of the country it came from. It is less impressive in a demonstration and it is the only version that survives an audit.
A report you can scope to one currency
The whole report, filtered to a single currency chosen from those with data in the period, with the base currency leading the list. Every figure inside is then comparable to every other.
A single figure that discloses its own currency and its remainder
The largest single-currency total, labelled, with a count of the other currencies present. Used on the dashboard's outstanding invoices and on credit-hold exposure.
Transactions that carry the currency and the rate applied
Sales and invoices store their own currency, and where a rate was applied it stays on the transaction rather than being recomputed later.
Currency-correct rounding per currency
Zero-decimal currencies are held with zero decimals rather than being formatted to two and quietly acquiring cents that do not exist.
A currency on a budget
There is no currency column on a budget. The figure a group budgets against is a bare number, and nothing records which money it is denominated in.
Currency anywhere in purchasing
Purchase orders, their lines and vendor records carry no currency at all. Purchasing is single-currency by construction — which is a limitation rather than a defect, but it is one a regional buyer must know before signing.
Consolidation across countries
Nothing sums across organizations, and it is not a feature waiting to be switched on. If your group is set up as one organization per country, cross-country reporting does not exist; if it is one organization, it carries one country profile.
And the report that breaks our own rule
We audited the reporting engine against the argument above while writing this, which is the reason these posts get written at all. Budget vs Actual does not follow it.
The actual-spend figure on a budget line is a plain sum of expense amounts in the category and the period. An expense has a currency — the field is on the form, it is validated, it is stored on the row. The report never looks at it. Two expenses in two currencies are added together as though they were the same money, and the result is compared against a budget figure that has no currency either.
A marketing budget, and a campaign run out of Kampala
The figures there are illustrative; the arithmetic is not. A single expense keyed in Kampala can put a Nairobi budget line into breach on a report somebody takes to a board meeting, and nothing on the page indicates that two kinds of money have been added together. This is the same fault that was found and fixed across the ageing report, the dashboard, the top-customers report and credit-hold exposure in August 2026. It survived here.
What the fix is, and what it is not
The fix is not to convert the Ugandan spend into shillings. That would need a rate and an as-at date, it would make a closed quarter move between viewings, and it would contradict the rule the rest of the product follows. The fix is to stop adding — to give the budget line a currency, scope the comparison to it the way the sales summary scopes itself, and disclose spend in other currencies as a separate, named figure rather than folding it in. That is a schema change and a decision about what a budget line means in a multi-country organization, which is why it is written up here rather than quietly patched: it is a product decision, not a typo.
What AWRA OpsHub does today
- Sales, invoices and POS sales each carry their own currency, and the rate actually applied stays on the transaction rather than being recomputed at report time.
- Per-currency rounding, so a zero-decimal currency is held and printed with zero decimals instead of acquiring cents it does not have.
- A published convention for a single mixed-currency figure — largest single-currency total, labelled, with the remainder disclosed — applied on the dashboard and in credit-hold exposure.
- The base currency leads every one of those figures, so nominal ordering never decides what the reader sees first.
- A whole-report currency scope on the sales summary, chosen from the currencies with data in the period.
What it does not do
- Budget vs Actual ignores the currency it stores. Expense amounts in different currencies are summed against a budget figure that has no currency of its own. Found writing this post, described above, and not yet fixed.
- No currency on a budget, so there is nothing yet to scope that report to.
- No currency in purchasing at all — not on the order, the line or the vendor. Purchasing is single-currency by construction.
- No conversion anywhere, deliberately. If you need a consolidated figure in one currency at a stated rate, this product does not produce it and will not pretend to.
- No consolidation across organizations. Nothing spans them, and a single organization holds one country profile.
- Only one of 36 catalogued reports can be scoped to a currency. The rest are either single-currency by nature or rely on the figure-level convention, and there is no switch that applies the scope everywhere.
Not ours, by choice
- We will not convert currencies to make a total look tidier. A number that changes when you reopen a closed period is not a number a board should be given, whatever it says on the label.
- We will not tell you how to structure a regional group. One organization per country and one organization overall have genuinely different consequences here, and which is right depends on your statutory filing obligations rather than on our software.
Five questions for any vendor selling into a regional group
Show me a report over two currencies. What is the total at the bottom?
What a straight answer sounds like
A figure with a currency code on it, or a refusal to show one total.
Why it matters
An unlabelled total over mixed rows is the single most common defect in this area and it is visible in ten seconds.
If you convert, at what rate and as at when?
What a straight answer sounds like
A named rate source and a named date.
Why it matters
If neither is named, the total cannot be reproduced — and a figure that cannot be reproduced cannot be defended to an auditor.
Can I scope a whole report to one currency, or only the summary figure?
What a straight answer sounds like
A demonstration, on a report with mixed data.
Why it matters
Scoping the header while the rows stay mixed is worse than not scoping at all, because it looks resolved.
Does a budget carry a currency?
What a straight answer sounds like
Yes or no. Ours is no.
Why it matters
A variance report compares spend to a budget. If either side lacks a currency, the comparison is arithmetic without units.
Is my group one organization or several in your system, and what does each choice cost me?
What a straight answer sounds like
Both consequences described without a recommendation.
Why it matters
The answer determines whether cross-country reporting is a feature question or an impossibility, and it is very hard to change later.
Three that follow from the above, in the order we would do them
The first is a repair and we would treat it as one. The second and third are genuine builds with real decisions inside them, and we would rather have those decisions with you than make them on your behalf.
A budget that knows what money it is in
A currency on the budget line, the variance comparison scoped to it, and spend in other currencies disclosed alongside rather than folded in. This closes the defect described above without introducing a conversion, and it is the pattern the sales summary already proves works.
The currency scope, everywhere it belongs
One report of the thirty-six can be scoped to a currency today. Extending that to the reports a regional group actually files — ageing, spend, margin, movement — is repetitive rather than difficult, and the honest way to scope it is by naming which reports you file rather than by promising all of them.
Currency in purchasing
Purchase orders, their lines and vendor records carry no currency at all today, so a group buying from a Ugandan supplier in Ugandan shillings has nowhere to put that fact. This is the largest of the three and it reaches landed cost, three-way matching and the payments register, which is exactly why it should be scoped properly rather than bolted on.
What we will not build at any price is a consolidated total at a rate we chose. If your auditor or your group finance function specifies a rate source and an as-at convention in writing, that is a different conversation and a legitimate one — but the rate has to come from you, because a vendor picking it is a vendor issuing an opinion on your accounts.
Talk to us about reporting across bordersThe verdict
There is no single honest number for a group trading across five currencies, and a system that hands you one without saying what it is has not solved the problem — it has hidden it. The defensible answers are a report scoped to one currency, or a figure that names its own currency and admits there is more. We publish that rule, we follow it in most places, and while writing this we found a report of ours that adds Ugandan shillings to Kenyan ones and calls a budget line breached on the result. That one is described above rather than tidied away, because a corpus that only reports the gaps it has already closed is a brochure.
Bring us a month of real regional data
Two countries, two currencies, whatever mix of invoices, POS sales and expenses you actually run. We will show you exactly which figures are scopeable, which disclose their remainder, and which we would have to build — before you commit to anything.
Talk to us about regional reporting