ERP migration
Moving from Excel to a property ERP: what to migrate, and in what order
Most property businesses do not run on no system; they run on twenty workbooks that disagree. Moving them into one ERP is less a data-loading job than an ordering problem: master data before documents, balances before movements, and a reconciliation after each step. This is the order that works, learned from doing it.
Last revised
It is an ordering problem, not a loading problem
The instinct when leaving spreadsheets is to export everything and import everything. It fails for a reason that has nothing to do with file formats: a document depends on the master data it names. An instalment invoice needs a customer, a unit and an agreement to exist first; a contractor bill needs a contractor, a contract and a project; a receipt needs the invoice it settles. Load documents before their masters and every row is an orphan.
So the migration is a sequence, and the sequence is the same for almost every property business: the accounts, then the things the business is about, then the agreements between them, then the open documents, then the money — with a reconciliation after each layer. What follows is that sequence, learned from doing it, with the reconciliation that closes each step.
Layer 1 — the chart of accounts and the opening balances
Start with the chart of accounts. Map every account the workbooks use to an account in the new chart — and expect to find accounts that were really dimensions (“Contractor cost — Project A”), which become one account plus a project on the line. Then load the opening trial balance as at the cutover date, one journal, with Opening Balance Equity as the balancing side.
The fiscal calendar comes first even here: the accounting periods and fiscal years the opening balances and every later document will fall into must exist and be open before anything posts. A calendar corrected after the fact is one of the more painful migration errors, because every period-dependent posting has to be re-examined.
| Check | Passes when |
|---|---|
| Trial balance | Debits equal credits, and every account total equals the workbook’s closing balance for it. |
| Control accounts | Receivable and payable control totals equal the sum of the open items you are about to load in layer 4 — not the workbook’s aggregate, which may include items already settled. |
| Third-party balances | Retention, advances, deposits and owner balances are stated by counterparty, so they can be matched to documents later. |
Layer 2 — what the business is about: projects, properties, units, parties
Next the masters that every document will name. In BuilderOne these are shared across modules, which is the first thing the migration has to respect: one contractor record whether the workbook called them a contractor, a supplier or a payee; one project whether Construction, Selling or Investor Management refers to it.
- Projects — one canonical project record per development, with the code the accounts will carry as a dimension.
- Properties and units — for selling: the unit inventory per project with its current state (available, reserved, booked, sold); for rental: buildings and units with their owners and ownership dates.
- Parties — customers, contractors, suppliers, owners, investors, employees. Deduplicate before loading: the same firm appearing under three spellings in three workbooks is the single most common source of a wrong balance after migration.
- Cost categories, tax settings, departments, pay components — the reference data the documents will classify against.
| Check | Passes when |
|---|---|
| Counts | Units per project, parties per role and projects match the deduplicated source lists — and every discrepancy is explained, not absorbed. |
| Ownership | Every rental unit resolves to exactly one owner (or a defined share) on every date the history will need. |
Layer 3 — the agreements between them
Now the contracts: what the parties have agreed with the business. Each is loaded as an executed document with its own terms, because the open documents in the next layer will be validated against it.
- Construction contracts — contractor, project, value, cost category, retention terms, advance terms; then the advances already paid as advance documents so the recovery balance is right.
- Selling agreements — customer, unit, agreed price, discount, payment plan; then the instalment schedule as it stands, so the system knows which lines are still to invoice.
- Rental agreements — tenant, unit, rent, term, deposit held; the deposit as its own record, because it is a liability, not rent.
- Investor positions — investor, project, principal contributed to date, profit allocated to date, as movements.
- Employee records and their project allocations, effective from cutover.
| Check | Passes when |
|---|---|
| Contract values | Sum of loaded contract values per project equals the commitment the workbook claims. |
| Schedules | For every selling agreement, invoiced-to-date plus still-to-invoice equals the net sale price. |
| Deposits and advances | Sum by counterparty equals the layer 1 balance for that account. |
Layer 4 — the open documents, not the whole history
The decision that shapes the whole project: how much history to load. The honest default is open items only — unpaid invoices, unpaid contractor and vendor bills, unrecovered advances, held retention, held deposits — each as a real document dated as it was, with everything already settled represented by the opening balances alone. Full history is possible but costs weeks, and the workbooks rarely contain it at document grain.
- Customer invoices outstanding, by instalment, with due dates — so ageing is right from day one.
- Contractor and vendor bills unpaid, against their contracts and orders.
- Retention holds outstanding, by bill.
- Rent invoices outstanding, by tenancy.
| Check | Passes when |
|---|---|
| Receivable | Sum of open customer and rent invoices equals the receivable control balance from layer 1. |
| Payable | Sum of open bills equals the payable control balance; retention equals the retention liability. |
| Ageing | The day-one ageing report matches the last workbook ageing, bucket by bucket. |
Layer 5 — the money, and the cutover
Finally the cash and bank accounts, each linked to its ledger account with its opening balance, and the bank reconciliation brought to the cutover date. From this point every receipt, payment, payroll run and payout is entered in the new system only. Run the two side by side for one period if you must, but reconcile them daily; parallel running for longer is how the old workbook quietly becomes the system of record again.
| Check | Passes when |
|---|---|
| Bank | Every treasury account reconciles to its bank statement at cutover. |
| Trial balance, again | The trial balance after all five layers equals the layer 1 opening trial balance plus the documents loaded since — nothing has moved that should not have. |
| Statements | The first period-end profit and loss and balance sheet, company-wide and per project, are ones the finance team is willing to sign. |
What we learned doing it
- The source is never what it says it is. Workbooks carry synthetic rows, reversed signs and totals that were typed rather than summed. Profile the data before mapping it, and treat every total as a claim to verify.
- Load through the product’s own documents, not into its tables. A document created through the same path a user would take is validated by the same rules; a row inserted directly bypasses them and is the one that will not reconcile.
- Reconcile per layer, and stop when a layer does not. A control account that is 1 out at layer 1 will be 1 out forever, and finding it at layer 4 costs ten times as much.
- Keep the migration journal visibly separate. Opening Balance Equity, a migration user, a migration date — so anyone can later tell what was loaded from what was earned.
- Do not migrate the workbook’s categories; migrate the business’s. If a “project” in the workbook was really a phase, or a “supplier” really a contractor, the migration is where that gets fixed.
Where this lives in BuilderOne
See it on your own numbers
The fastest way to judge whether this is how your software should work is to put a real project through it. Tell us what you run and we will set your company up.
