Founder & Lead Engineer, RAITHub
RAITHub ships and tests production software. See QA as a Service or talk to us.
A property platform built for one city rarely scales cleanly to many. What breaks first is the assumptions baked into the code: one currency, one address and date format, one timezone, and queries that silently mean the home market. To scale, make market a first-class dimension, store money and dates unambiguously, and handle locale and residency per market. Do this before the second market, not the fifth.
If you would rather have the multi-market work scoped and built for you, see how RAITHub would build this below. First, what actually breaks.
What breaks when a property platform enters a new market?
Usually not the obvious things. The breakages hide in assumptions nobody noticed because the first market never challenged them. Address formats differ; postcodes are not universal; a "bedroom" count and floor-area unit vary; currency, tax and date formats differ; and legal rules for leases and deposits are market-specific. The deepest problem is in the data: queries, reports and defaults quietly assume one market, so adding another makes totals wrong and listings leak across markets.
| Assumption from market one | What breaks in market two | Fix direction |
|---|---|---|
| One currency, stored loosely | Mixed-currency totals are meaningless | Store amount in minor units plus a currency code; never sum across currencies |
| Local time assumed everywhere | Viewings and rent-due dates land on the wrong day | Store timestamps in UTC; store the market timezone; convert on display |
| One address format | Search and validation reject valid addresses | A flexible address model, validated per market |
| Queries implicitly mean one market | Listings and reports mix markets | Make market a required dimension on every scoped query |
| One legal lease/deposit rule set | Compliance rules differ by jurisdiction | Market-specific rules; legal review per market |
How do you make market a first-class part of the data model?
Add a market (or region) key to the tables that belong to a market, and require every scoped query to filter by it, the same discipline used for tenant isolation in a multi-tenant SaaS. This is the mechanism behind keeping agencies apart in multi-agency platform isolation; here the dimension is the market rather than the customer. A database-level default stops a forgotten filter from leaking one market into another.
-- Market is a required dimension, not an afterthought.
ALTER TABLE listings ADD COLUMN market_id text NOT NULL;
-- Store money unambiguously: amount in minor units plus its currency.
ALTER TABLE rent_charges
ADD COLUMN amount_minor bigint NOT NULL,
ADD COLUMN currency char(3) NOT NULL; -- ISO 4217, e.g. 'EUR', 'AED'
-- Index the market so per-market queries stay fast as you add cities.
CREATE INDEX listings_market_status ON listings (market_id, status, created_at DESC);
Never sum amount_minor across different currency values; report per currency, or convert explicitly with a dated exchange rate and keep the original. Keep the raw amount and currency forever, because a converted figure is a derived number, not the truth.
What does localisation really involve?
More than translated strings. RAITHub delivers in English, but the engineering of locale, right-to-left layout, currency and date formatting, and address and phone validation, is market work regardless of language. For right-to-left markets, the layout must mirror correctly, which is a testing discipline, not a translation task. Plan currency and number formatting through a locale layer from the start, so a new market is a configuration change, not a code hunt. Treat each new market as a defined increment with its own QA pass, not a flag you flip.
Does each market force separate data storage?
Sometimes. Some jurisdictions expect personal data to stay in-region, and property data includes tenants' home addresses and payment history, which is sensitive. The options range from one shared database with a market key, through a database per region, to fully separate deployments. The right choice depends on the legal requirement and the operational cost, and it is a per-market decision. This is general information, not legal advice: confirm each market's data-residency and lease rules with a qualified adviser before you commit. RAITHub signs DPAs and SCCs and follows your controls; it holds no compliance certification.
Buy, build or hire?
| Option | What you get | Choose this when |
|---|---|---|
| A multi-market property SaaS | A vendor that already operates in your target markets | You manage property and a tool already covers your markets |
| Bolt a second market onto existing code | Quick, but each new market repeats the pain | You will only ever have two markets and can accept the debt |
| A custom multi-market re-architecture | Market as a first-class dimension, proper money and locale handling, residency handled per market | You are expanding into several cities or countries and need it to scale cleanly |
| A managed team on the platform | The build plus per-market QA and regression tests | Expansion is your growth plan and each market must be correct |
How long does multi-market work take, and what is the risk of doing it yourself?
Making market a first-class dimension, fixing money and date storage, and adding a locale layer is a re-architecture, not a toggle; a focused pass sits in the 2 to 4-week code-rescue range when the codebase is sound, and larger expansions run as fixed-scope phases. The main risk of doing it yourself is scaling the wrong assumption: adding a currency column but still summing across currencies, or adding a market flag but leaving queries that implicitly mean the home market. These produce wrong money totals and cross-market data leaks that are hard to detect. Make the model and the tests right before the second market goes live.
How RAITHub would build this
- Scope: add market as a required dimension across scoped tables and queries; store money in minor units with an ISO currency code; store timestamps in UTC with per-market timezones; add a locale layer for currency, date, address and right-to-left handling; set data residency per market; a per-market QA pass.
- Timeline: a re-architecture pass in the 2 to 4-week code-rescue range when the base is sound; a larger multi-market build in the 4 to 6-week fixed-scope range per phase, with backend-heavy residency work in the 6 to 12-week range.
- What you receive: the model changes, migration scripts, per-market and regression tests in CI, handover docs, the work on accounts you own, IP assigned to you and an NDA as standard.
- Next step: a free 15-minute technical audit, then a fixed written quote.
RAITHub built BlockEstate, a multi-tenant listings and inquiry platform (6-week MVP, no MLS), and PropDesk, property-management software with Stripe rent collection and 1,024 tests. See the SaaS development service, the real-estate industry page, the isolation detail in multi-tenant property management SaaS, and the sibling post on a portal slowing with thousands of listings. To scope your expansion, book the free 15-minute audit.
Frequently asked questions
What breaks first when a property platform enters a new market?
Usually hidden assumptions: a single currency, one address and date format, one timezone, and queries that silently mean the home market. These were never tested because the first market never challenged them, so the second market makes totals wrong and listings mix across markets.
How should I store money for a multi-currency property platform?
Store the amount in integer minor units plus an ISO 4217 currency code, and never sum across different currencies. If you must report a combined figure, convert explicitly with a dated exchange rate and keep the original amount and currency, because the converted number is derived, not the truth.
How do I keep one market's data from leaking into another?
Make market a required dimension on every scoped table and query, the same discipline used for tenant isolation in multi-tenant SaaS, and back it with a database-level default so a forgotten filter cannot leak rows. Add tests that cross the market boundary and expect no results.
Does each country need its own database?
Sometimes. Some jurisdictions expect personal data to stay in-region, and property data is sensitive. Options range from a shared database with a market key to a database per region to separate deployments. It is a per-market decision; confirm each market's data-residency rules with a qualified adviser.
Do you handle right-to-left markets and localisation?
RAITHub delivers in English, but the engineering of locale, right-to-left layout, and currency, date, address and phone handling is market work regardless of language. Right-to-left layout is a testing discipline, so each market gets its own QA pass rather than a single flag.
Related posts
Ready to discuss your project?
Book a free 15-minute technical audit with our engineering team.