Solution guide · ERP

Custom ERP With Multi-Currency and Multi-Entity Accounting: Feasibility, Cost, and What Actually Breaks

The short answer

Adding real multi-currency and multi-entity accounting to a system that already exists typically runs $15,000 to $60,000 over 4 to 9 weeks. Building it as part of a first release is $50,000 to $130,000 in 10 to 16 weeks, and a full ERP (Enterprise Resource Planning) platform with consolidation, statutory books and per-country compliance is $150,000 to $350,000 over 6 to 12 months. Those are Digital Heroes delivery bands. The number moves on how many functional currencies and statutory jurisdictions you have, not on how many screens you want.

What this looks like once real books run on it

It is day four of the December close. Both subsidiaries' trial balances are in balance. Every local report ties. The consolidated balance sheet is out by 419.47 USD, and nobody can find it.

Here is what happened. The US parent, functional currency USD, lent 100,000 USD to the UK subsidiary, functional currency GBP. The UK entity recorded the payable at the day's rate of 0.7900 and stored 79,000 GBP. That is the whole bug: it stored 79,000 GBP and threw away the fact that this is a debt denominated in USD. At month end the closing rate is 0.7867. A correct system revalues that USD-denominated monetary liability and books a 330 GBP gain. This one did not, because it had nothing left to revalue against. So consolidation translates 79,000 GBP back at the closing rate, gets 100,419.47 USD, and the intercompany elimination against the parent's 100,000 USD leaves 419.47 sitting in the void.

Both sets of books balance. The consolidation does not. That residue grows every month and every rate move, and someone plugs it by hand until they leave the company. The naive version of this capability is not "we added a currency column." It is a schema that cannot answer the question "in what currency was this obligation actually incurred," and everything downstream inherits that.

Every amount is three amounts

IAS 21 and ASC 830 both draw the same three lines, and a competent ledger stores all three on every posted line. Transaction currency is what the document was written in. Functional currency is the entity's own operating currency, and it is a determination, not a preference: you have to argue it and document it. Presentation currency is whatever the consolidated report is rendered in. One journal line therefore carries an amount, a currency, a functional amount, and the rate and rate date used to get there. Not derivable at read time. Stored, because the rate that applied on 3 March is a fact, and facts do not get recomputed.

Storage: never a float. Use Postgres NUMERIC or DECIMAL(19,4), or integer minor units with an explicit exponent table. And the exponent is not always 2. ISO 4217 gives JPY zero decimals, KWD, BHD, JOD, TND and OMR three, and CLF four. A system that hardcodes two decimals will silently round a Kuwaiti dinar invoice and produce a rounding difference in a jurisdiction that audits rounding differences.

Then allocation rounding. A 100.00 invoice split across three cost centres is 33.33, 33.33, 33.34. Pick a method, largest remainder is the usual one, apply it in one place, and make the residual land on a designated line rather than scattering. If three modules each round independently, the trial balance drifts by cents, and cents are what makes a controller stop trusting the system.

Rates are a versioned dataset, not a lookup

You do not have "the EUR rate." You have spot, daily close, monthly average, historical, and budget rate, and each is used for a different purpose. Balance sheet monetary items translate at closing rate. Income statement lines translate at the period average. Equity translates at historical rate. The difference is not an error: it is the cumulative translation adjustment, and it belongs in other comprehensive income, not in a suspense account.

Sources matter. ECB reference rates publish once per TARGET business day around 16:00 CET, which means no weekend rates and no rate on Good Friday, so your rate table needs an explicit carry-forward rule an auditor can read. If you buy from OANDA, Xignite or Open Exchange Rates, decide bid, ask or mid and write it down. Store rates directionally with the quoted pair, because 1 divided by a rounded rate is not the rate the bank used, and that mismatch surfaces on bank reconciliation.

The hard one: rate corrections. A provider republishes a bad rate three days after 400 documents posted against it. A competent build makes rates effective-dated and versioned, refuses to silently re-translate posted transactions, and instead offers a re-run of the revaluation with a reversing entry. Realized FX, the difference between invoice rate and payment rate, hits P&L on settlement. Unrealized FX comes from the period end revaluation run and only touches monetary items. Inventory, prepaid expenses and fixed assets are non-monetary and stay at historical rate. Teams that revalue everything produce beautiful, wrong numbers.

The ledger must be append-only and gapless at the same time

Posted journal lines are never updated. Corrections are reversing entries. That is not a style choice, it is what makes the audit trail defensible under SOX, German GoBD, and French FEC rules. Enforce the double-entry invariant in the database with a deferred constraint that sums debits and credits to zero per journal, per entity, per currency, so no application bug can write an unbalanced batch.

Now the tension. Several jurisdictions require gapless sequential document numbering, France and Italy among them, and a Postgres SEQUENCE is explicitly not gapless: it burns numbers on rollback. So you need a counter table with SELECT FOR UPDATE or an advisory lock, which serializes posting per sequence and puts a hard ceiling on throughput. That ceiling is a design decision the buyer needs to make consciously: partition sequences per entity, per document type and per fiscal year, and know your posts-per-second number before you sign anything. Nobody quotes for this, and it is the thing that pages you at 3am on the last day of the quarter when 90,000 invoices try to post through one row lock.

Intercompany and consolidation: where the plug lives

Intercompany means every cross-entity transaction generates automatic due-to and due-from balancing entries in both books, tagged with the counterparty entity, so elimination at consolidation is mechanical rather than a spreadsheet. Add an intercompany matching run that reports unmatched pairs before close, because the one that always breaks is a transaction posted in one entity and never mirrored.

Consolidation itself needs ownership percentages, non-controlling interest, sub-consolidation for multi-level group structures, and a decision on equity method versus full consolidation per holding. It also needs a chart of accounts strategy: a global COA with a mapping layer to local statutory charts, or parallel books. If you run US GAAP and a local GAAP in parallel, that is multi-book, and multi-book roughly doubles both the posting layer and the reporting layer. Ask early, because retrofitting a second book later means every posting rule gets rewritten.

Close, calendars, and the backdated entry

Each entity has its own fiscal calendar. India and Japan run April to March. Retail clients want 4-4-5 periods. Period locks are per entity, per module, not global, so AP can be closed while GL is still open. And then someone posts backdated into a closed period.

Answer that question before you write code, because there are only three honest answers: reject it, reopen the period under a named approval with an audit record, or route it to a catch-up period. Whichever you pick, backdated entries invalidate your balance snapshots. You cannot compute a trial balance across 40 entities and five years by scanning raw journal lines: you need a materialized balances table keyed by account, entity, period and currency, which means you also need cache invalidation that knows a March entry landing in July dirties every period from March forward.

The statutory output is where scope quietly doubles. Each country is its own project: SAF-T for Portugal, Poland, Norway and Romania, FEC for France, GoBD exports for Germany, CFDI clearance for Mexico, SdI and FatturaPA for Italy, IRN and GST e-invoicing for India, Peppol BIS Billing 3.0 across the EU with ViDA mandates landing behind it. Plus US sales tax nexus, which realistically means integrating Avalara or Vertex rather than building rate tables. None of this is configuration. All of it is delivery.

Cost and timeline, honestly

Across Digital Heroes projects, the bands are consistent. A focused build of multi-currency and multi-entity accounting inside a product that already exists runs $15,000 to $60,000. Delivered as part of a first release it is $50,000 to $130,000 over 10 to 16 weeks. A full platform with consolidation, statutory books and per-country compliance is $150,000 to $350,000 over 6 to 12 months.

What moves this specific number: retrofitting onto a single-currency schema, where every historical row has to be backfilled with a transaction currency and a rate and every existing report rewritten, reliably eats 3 to 5 weeks of the estimate before a single new feature ships. Each additional statutory jurisdiction with an e-invoicing mandate adds roughly $8,000 to $25,000, and that cost repeats forever as mandates change. Multi-book roughly doubles the reporting layer. Consolidation with partial ownership and non-controlling interest adds 2 to 4 weeks. Opening balance migration, including establishing an opening cumulative translation adjustment your auditor will accept, is usually underestimated by half. Entity count barely matters. Distinct functional currencies and distinct jurisdictions are what you are paying for.

When you should NOT build this

If you are an operating company that sells things and needs books, buy NetSuite OneWorld, Sage Intacct, or Microsoft Dynamics 365 Business Central, and spend the money on a good implementation partner instead. They already have automatic intercompany, consolidation with non-controlling interest, revaluation, localizations and statutory exports, all maintained by people whose full time job is tracking when Italy changes its schema. Rebuilding that is a decade of accumulated regulatory trivia you will pay for twice.

Build custom in exactly two cases. First, the ledger is the product: marketplaces paying out in 30 currencies, fintech, embedded wallets, anything where accounting is the thing customers buy. Second, your volume or model breaks the SaaS envelope, at which point look at Modern Treasury Ledgers, Formance, or TigerBeetle before writing your own. Know the tradeoff going in: TigerBeetle transfers cannot cross ledgers, so multi-currency means one ledger per currency plus linked transfers for the FX leg, which is a real architecture decision, not a footnote. And even then, most teams that build a custom ledger still keep an off-the-shelf GL for statutory filing. That is the correct answer more often than vendors admit.

How to brief and vet a developer for this

Five questions separate people who have shipped this from people who have read about it.

One: name the three currencies on a journal line and what each one is used for. If you do not hear transaction, functional, presentation, stop.

Two: how do you store an amount, and what do you do with JPY and KWD. Correct answers are NUMERIC or integer minor units with an ISO 4217 exponent table. "Float" or "two decimals" ends the interview.

Three: two entities with different functional currencies, one intercompany loan. At close, why might the elimination not net to zero, and where does the difference go. Someone who has shipped this will say cumulative translation adjustment and other comprehensive income without pausing.

Four: how do you produce gapless document numbers under concurrent posting, and what is the throughput ceiling. If they say "a database sequence," they have not read the requirement.

Five: an entry lands backdated into a closed period. Walk me through it. Listen for period reopening controls and balance snapshot invalidation, not just "we allow it."

Then a sixth, softer one: which statutory export have you actually produced, and for which country. FEC, SAF-T and CFDI leave scars. People who have them will tell you a story. People who have not will describe a plan.

Research & sources

The evidence behind this guide

Independent findings on why this investment pays off. Every link goes to the primary source.

  1. In a survey of 579 supply chain professionals (July 31 to October 1, 2024), only 29% had built at least three of the five capabilities Gartner identifies as needed for future competitiveness (agility, resilience, regionalization, integrated ecosystems, and enterprise-wide strategy). Source: Gartner (2025) →
  2. Large companies globally have captured, on average, only 31% of the expected revenue lift and 25% of the expected cost savings from their digital and AI transformations - a significant gap between expected and realized value. Source: McKinsey & Company (2023) →
  3. In an RCT, the no-show rate was 23.5% for patients receiving a text-message reminder versus 38.1% for the control group - a 14.6 percentage-point reduction (p = 0.04). Source: Clinical Pediatrics / PubMed Central (Lin et al.) (2016) →
  4. Gallup reports global employee engagement fell to 20% in 2025 (its lowest since 2020, down from a 2022-2023 peak of 23%), and estimates low engagement costs the world economy an estimated $10 trillion in lost productivity, or 9% of global GDP. (Note: this figure appears in Gallup's evergreen State of the Global Workplace page, currently reflecting the 2026 edition reporting on 2025 data.). Source: Gallup (2025) →
Rohan Malhotra · Enterprise Software Consultant

Rohan advises mid-market and enterprise teams on ERP, CRM and custom software, and has led delivery on dozens of business-software builds.

Writes for Digital Heroes, shipping business software for 2,000+ brands across 55+ countries since 2017.

FAQ

Frequently asked questions

How much does it cost to add multi-currency and multi-entity accounting to our existing system?
Typically $15,000 to $60,000 over 4 to 9 weeks, based on Digital Heroes delivery. The main driver is whether your current schema stores a single amount column, because backfilling every historical row with a transaction currency and rate and rewriting every existing report usually consumes 3 to 5 weeks on its own. Entity count matters far less than the number of distinct functional currencies and statutory jurisdictions.
Can we get this done for $25,000?
Yes, for a narrow scope: transaction plus functional currency on every line, a versioned rate table, a period end revaluation run, and consolidation for two or three entities in one jurisdiction. What $25,000 does not buy is multi-book parallel GAAP, non-controlling interest, or any country-specific e-invoicing integration. Be explicit about which jurisdictions you file in before the quote, because each one with a mandate adds roughly $8,000 to $25,000.
What does a full multi-entity ERP platform actually cost?
$150,000 to $350,000 over 6 to 12 months for consolidation, statutory books, per-country compliance and the reporting layer that makes a close survivable. If a vendor quotes $60,000 for that scope, they are quoting the screens and not the accounting. Ask them to price consolidation with partial ownership and the opening balance migration separately and watch the number move.
How long does it take?
4 to 9 weeks bolted onto an existing product, 10 to 16 weeks as part of a first release, 6 to 12 months for a full platform. What extends it is not feature count but decisions you have not made yet: functional currency determinations, whether you need parallel books, what happens to a backdated entry, and which statutory exports you owe. Nail those in week one and the timeline holds.
Can you add it to our existing app without a rewrite?
Usually yes, but the ledger tables get migrated, not patched. Every posted line needs a transaction currency, a functional amount, a rate and a rate date, which means backfilling history and rewriting every report that reads amounts. If your amounts are stored as floats, budget for a data cleanup pass first, because you cannot reconcile a ledger that has already lost fractions of a cent.
What breaks at scale?
Two things. Gapless document numbering serializes posting through a single row lock, so 90,000 invoices posting at quarter end queue behind each other, and you need to know your posts-per-second ceiling before launch. Second, trial balances computed by scanning raw journal lines stop working past a few million rows, so you need materialized period balances plus invalidation logic that understands a backdated March entry dirties every period after it.
Should we just use NetSuite OneWorld or Sage Intacct instead?
If you are an operating company that sells things and needs books, yes, and spend the difference on a good implementation partner. They already ship automatic intercompany, consolidation with non-controlling interest, revaluation and per-country statutory exports maintained by people who track regulatory changes full time. Build custom only when the ledger is the product, such as a marketplace paying out in 30 currencies, or when volume genuinely breaks the SaaS envelope.
Do we need an accountant involved during the build?
Yes, and specifically a controller who will sign the close. Functional currency determination, monetary versus non-monetary classification, and where the cumulative translation adjustment lands are accounting decisions, not engineering ones, and getting them wrong produces books that balance and are still wrong. Every ledger we have shipped successfully had a named finance person reviewing the trial balance weekly from week two.
What is the single most common mistake?
Storing only the functional amount and discarding the transaction currency. It looks fine for months because each entity's local trial balance still balances, then consolidation drifts by hundreds of dollars a month and nobody can find the source. Once the original currency of an obligation is gone from the record, no revaluation run can recover it and the only fix is a data migration.
Why do companies replace NetSuite with custom software?
The three reasons we hear most at Digital Heroes are per-user license growth, SuiteScript customizations that became fragile, and workflows the platform cannot model without workarounds. A company adding 50 users to NetSuite takes on roughly $59,000 per year in extra licenses at the commonly quoted $99 per user rate, which is often the moment the custom math starts winning. Replacements usually keep the accounting structure intact and migrate module by module.
What does it cost to keep custom software running after launch?
Budget 15-20% of the original build cost per year, which on a $100,000 system means $15,000 to $20,000 for security patches, dependency updates, bug fixes, and small improvements as real usage reveals what the spec missed. Cloud hosting for a typical business application adds $50 to $300 a month on top. Skipping maintenance does not save the money; in Digital Heroes rescue work, unmaintained systems typically need a far more expensive rebuild within about three years.
Should I pick Microsoft Dynamics 365 Business Central or build a custom ERP?
Pick Business Central if you already live in the Microsoft stack, your processes are close to standard, and around $80 per user per month for Business Central Essentials stays affordable at your headcount. Build custom when your revenue-driving workflow, such as custom manufacturing steps or unusual pricing logic, would need heavy extension work anyway. In our experience, once Dynamics customization quotes pass about $100,000 the custom option deserves a serious side-by-side.
We run everything on spreadsheets and Airtable. How do we know it's time for custom software?
The reliable signals are re-typing the same data into multiple tools, one employee acting as human middleware between systems, and errors appearing in handoffs between teams. Hard limits force the issue too: Airtable's Team plan caps at 50,000 records per base, and Business costs $45 per seat per month, so a 20-person team pays about $10,800 a year for a tool it has already outgrown. When workarounds consume more hours than the tools save, the spreadsheet era is over.
How long does it take to build a custom web or mobile app from scratch?
Plan on 8 to 16 weeks for a focused first version and 4 to 9 months for a larger platform, which is the typical spread across Digital Heroes builds. The first 2 to 3 weeks go to discovery and design before any production code ships. The two things that stretch timelines most are integrations with legacy systems and slow feedback from your side, not developer speed.
How many developers does it take to build an ERP?
A typical Digital Heroes ERP pod is five to seven people: two or three backend engineers, one frontend engineer, a QA engineer, a project manager, and a part-time architect and designer. Bigger teams rarely go faster on ERP because the bottleneck is decisions about your business rules, not typing speed. What you need on your side is one empowered internal owner who can answer process questions within a day.
How do I vet an agency for an ERP project?
Ask to speak with two clients who have been running an ERP the agency built for at least two years, because ERP quality shows up in year two, not at launch. Then ask for their data migration plan, their module rollout sequence, and the named senior engineers who will be on your project. An agency that leads with screen designs instead of process mapping is a red flag for ERP work.
Who owns the source code if an agency builds my ERP?
You should, in full, and it must be written into the contract as work for hire with IP assignment on payment. At Digital Heroes every client receives the complete repository, database schemas, and deployment documentation, so they could hand the system to another team tomorrow. Walk away from any ERP proposal built on the agency's proprietary platform with ongoing license fees, because that recreates the vendor lock-in you were escaping.
What happens to my ERP if the agency shuts down or we part ways?
If ownership was set up correctly, nothing breaks: you hold the source code, the system runs in cloud accounts you own, and handover documentation lets a new team take over. Insist on repository access from day one, admin ownership of all hosting and third-party accounts, and documentation as a contract deliverable rather than a favor. This is the single most important clause to check before signing an ERP contract.
What should I prepare before contacting an ERP development agency?
Bring a list of your current tools and spreadsheets, a rough map of how an order or job moves through the company today, your user count by role, and the three problems costing you the most hours. You do not need a formal specification; a good agency writes that with you during discovery. Companies that arrive with those four things typically cut two to three weeks off scoping in our experience.
Keep reading
let's build

Build something worth launching.

A plan, a team, a timeline, within 24 hours. No decks, no discovery calls. Tell us what you're building and we'll come back with a real scope and a real number.

message us directly · we reply within one business day

mission briefing

Monthly dispatch

Playbooks, real build costs, and what we're shipping. One email a month. No fluff.

visit us

New York HQ

1140 Broadway, Suite 704 · New York, NY 10001

Get directions
Online now

Hey there 👋 How can we help you today?