Property accounting
A chart of accounts for a property developer
A property developer’s chart of accounts has to hold things a trading company’s never does: retention owed to contractors, advances paid to them, deposits held for tenants, money owed to property owners, and capital put in by project investors. This is one way to structure it, using the chart BuilderOne seeds as the example — not as a rule.
Last revised
What is different about a property developer’s books
A trading company’s chart of accounts is mostly about stock, sales and overhead. A property developer’s has to hold balances a trading company never sees: money paid to contractors before they have done the work, money withheld from contractors after they have, deposits that belong to tenants, rent collected that belongs to property owners, and capital that belongs to the investors in a particular project. Each of those is somebody else’s money passing through the business, and each needs an account that says so.
The other difference is dimension. A developer wants every one of those balances by project, and often by property or unit. That is not a reason to create a set of accounts per project — see why a project dimension beats accounts-per-project — but it does shape what the accounts themselves need to be.
The seeded chart, as an example
When a company is set up in BuilderOne’s Accounting module it receives a default chart: headers to group, posting accounts to post to, and control accounts that only governed postings may touch. Codes are four digits by convention; the structure is what matters.
| Code | Account | Kind | What posts here |
|---|---|---|---|
| 1000 | Assets | header | — |
| 1100 | Current Assets | header | — |
| 1110 | Cash on Hand | posting | Petty cash and cash receipts. |
| 1120 | Bank | posting | Bank accounts; each treasury account is linked to a GL account. |
| 1140 | Advances to Contractors | posting | Mobilisation and material advances paid, recovered against bills. |
| 1150 | Owner Receivable | posting | What a property owner owes the business when charges exceed collections. |
| 1200 | Accounts Receivable | control | Customer invoices (instalments, rent) until collected. |
| 1300 | Non-Current Assets | header | — |
| 1310 | Fixed Assets | posting | The asset register’s ledger side. |
| 2000 | Liabilities | header | — |
| 2100 | Current Liabilities | header | — |
| 2110 | Accounts Payable | control | Contractor and vendor bills accrued, until paid. |
| 2140 | Tenant Security Deposits | posting | Deposits held for tenants — never income. |
| 2160 | Retention Payable | posting | Retention withheld from contractor bills, until released. |
| 3000 | Equity | header | — |
| 3100 | Share Capital | posting | The owners’ capital. |
| 3200 | Retained Earnings | posting | Accumulated results. |
| 3300 | Opening Balance Equity | posting | The balancing side of opening balances at migration. |
| 3400 | Investor Equity | control | Investor capital and allocated profit, by investor and project. |
| 3450 | Investor Profit Allocation Clearing | control | The debit side of a profit allocation, cleared by payout. |
| 4000 | Revenue | header | — |
| 4100 | Sales Revenue | posting | Instalment and rent invoices. |
| 4150 | Owner Service Charge Income | posting | The management charge to property owners. |
| 4160 | Tenant Service Charge Income | posting | Service charges billed to tenants. |
| 5000 | Expenses | header | — |
| 5100 | Cost of Sales | posting | Project cost: contractor bills, vendor bills, owner cost. |
| 5200 | Operating Expenses | posting | Overheads. |
Modules add their own accounts when first used — HR & Payroll seeds its payroll payable, Project Management its fee accounts — and every module’s posting adapter can be mapped to a different account than the default. The seeded codes are a shared contract: a code the template uses is one a module can rely on, which is also why a new account is added at a free code rather than a convenient one.
The balances that are not the business’s money
Four accounts in that chart exist because the business holds money for someone else, and the discipline of a developer’s books is keeping each of them clean:
| Balance | Increases when | Decreases when | Never |
|---|---|---|---|
| Advances to Contractors (asset) | An advance is paid: Dr 1140 / Cr Bank. | A certified bill recovers it: Dr Accounts Payable / Cr 1140. | Charged to project cost — the cost comes with the bill, not the advance. |
| Retention Payable (liability) | A hold is applied to a certified bill: Dr Accounts Payable / Cr 2160. | A release is paid: Dr 2160 / Cr Bank. | Treated as income or as a reduction of cost. |
| Tenant Security Deposits (liability) | A deposit is received: Dr Bank / Cr 2140. | Refunded or applied at the end of the tenancy. | Recognised as rent or as owner money. |
| Owner Receivable / owner payable | Charges to an owner exceed collections on their behalf. | The owner is paid out or pays in. | Netted invisibly against the business’s own revenue. |
The contractor billing guide walks the first two through a worked example; the owner statements guide covers how an owner’s balance is derived from six sources rather than stored.
Project cost: expense account plus project dimension
The seeded chart has no work-in-progress asset account, and that is a deliberate starting position rather than an oversight. A certified contractor bill posts its debit to a cost-of-sales or expense account — 5100 by default — carrying the project on every line. The project’s accumulated cost is therefore a question the ledger answers by dimension (cost of sales, filtered to Project A) rather than by account (a “WIP — Project A” balance).
Whether that cost should instead be carried as an asset until units are sold is an accounting-policy decision, and one the chart can accommodate: add a WIP account under current assets and post to it through a manual journal. What the product will not do is make that decision for you — see what BuilderOne does and does not do about WIP.
Designing your own: five rules
- Separate control accounts from posting accounts. Receivables, payables and investor equity should only ever be moved by the documents that own them; a manual journal to a control account is a reconciliation break waiting to happen. BuilderOne restricts ungoverned manual posting to control accounts for exactly this reason.
- One account per kind of obligation, not per counterparty. “Retention Payable — ABC Contractors” multiplies with every contract; one Retention Payable account with the contractor on the document does not.
- Put projects, properties and departments on the line, not in the code. Dimensions filter; accounts classify. Mixing them is how a chart reaches four hundred accounts nobody can map to a statement.
- Give migration its own equity account. Opening balances loaded at cutover need a balancing side that is obviously transitional — Opening Balance Equity — so it can be cleared, not hidden in retained earnings.
- Keep the seeded codes stable. Module defaults, report mappings and other companies in the same system depend on them; add new accounts at free codes and remap a module rather than renumbering.
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.
