Nobody sets out to build a single-market platform. It happens through a long series of individually reasonable shortcuts, each taken when a second market was hypothetical and the deadline was not.
Then a second market is approved, and the bill arrives all at once.
The shortcuts that cost the most
Currency as a display concern. Prices stored as numbers, formatted at render. It works perfectly until a market needs different rounding rules, tax-inclusive display, or a currency with no minor unit — and by then the assumption is spread across hundreds of call sites.
Copy embedded in components. Extraction is mechanical but enormous, and it always surfaces sentences assembled from fragments — which do not survive translation into languages that order clauses differently.
Business rules that assume one market's shape. Address formats, phone validation, tax identifiers, delivery windows, business registration checks. Each encodes a local assumption in a place nobody labelled as local.
One catalogue, silently. The deepest one. If product identity assumes a single market's assortment, adding a second market means either forking the catalogue or restructuring the model that everything reads from.
The expensive part is never the translation. It is that market-specific logic gets distributed across the system as ordinary code, and nothing marks it as market-specific.
What is genuinely cheap to do early
Not full internationalisation — that is a real project and premature before you need it. But a few structural habits cost almost nothing in the first market and save a great deal in the second:
- Keep copy out of components from the start. Even one locale. The discipline is the point.
- Money is a type, not a number — an amount plus a currency, formatted at the edge.
- Put market-specific rules behind a named seam. One place that says this varies by market, even if it currently has a single implementation. This single habit is worth more than the other three combined, because it converts an archaeology problem into a lookup.
- Never concatenate sentences. Whole strings with parameters, always.
Shared platform, not a fork
When the second market arrives there is always pressure to fork — it looks faster, and for the first three months it is.
Then every feature has to be built twice, every fix applied twice, and the two codebases drift until they are separate products with a shared history. The cost does not scale linearly with markets; it compounds, because each divergence makes the next merge harder.
A shared multi-locale platform with per-market configuration is slower to reach the first launch and dramatically cheaper by the third. That trade is only obvious in hindsight, which is precisely why it needs to be argued for in advance, by someone whose job is the second-order cost.
The test worth applying early
Ask: if a second market were approved tomorrow, what could not be configured? The answer is your internationalisation backlog, and it is far cheaper to write down while it is still short.