Mortgages
Overview
A mortgage tracks a secured loan against a property. The record stores lender, original principal, current balance, rate, frequency, payment amount, start date, and the linked accounts (principal / interest / escrow). One property can carry multiple mortgages — primary plus a second mortgage, a refinance, or a HELOC.
Mortgages are managed from the Mortgages subsection on the Property detail Overview tab. There is no standalone Mortgages list page — they always live in context of their property.
UI elements
Opens the New Mortgage form.
Row action (shown only for Active mortgages). Opens the Record Payment dialog described below.
Fields
| Field | Notes |
|---|---|
| Lender | Free text. |
| Original principal | Loan amount at origination. |
| Current balance | Live principal balance — auto-decremented by the principal portion of every recorded payment. |
| Rate | Annual interest rate (%). |
| Compounding | monthly (default) or semi-annually-not-in-advance (Canadian residential standard). Affects interest split. |
| Frequency | monthly / semi-monthly / bi-weekly / weekly. |
| Payment | Scheduled amount per period. |
| Start date | Origination / first payment date. |
| Principal account | Liability account the outstanding balance lives in. |
| Interest expense account | Expense account interest is posted to. |
| Escrow account | Optional — used for tax/insurance reserve payments. |
| Status | active / paid-off / closed. |
Payment split computation
computePaymentSplit is a pure function: given the current balance, annual rate, compounding basis, and payment amount, it splits a single payment into principal / interest / (optional) escrow.
- Monthly compounding: period rate =
annualRate / 12. - Semi-annual not in advance (the Canadian convention for residential mortgages): period rate =
((1 + annualRate/2)^(2/paymentsPerYear)) - 1. Different payment frequencies (weekly, bi-weekly, semi-monthly) use the correct per-period conversion.
Interest is always balance * periodRate, rounded to cents. Principal is payment - interest - escrow, clamped to not exceed the current balance.
Record Payment dialog
Opens from the mortgage row’s Record payment button. Shows the computed split before posting — the user can tweak any field before clicking Post.
- Click Record payment on the mortgage row.
- Confirm the Payment date (defaults to today).
- The dialog computes Interest, Principal, and optional Escrow from the mortgage settings and current balance. Override any value if the lender statement differs.
- Pick the Cash account the payment is drawn from.
- Optional: enter a Memo (becomes the JE memo).
- Click Post payment. A JE posts atomically:
Dr Mortgage principal (liability) — principal portionDr Interest expense — interest portionDr Escrow (if any) — escrow portionCr Cash — totalAll lines carry propertyId so Property P&L picks up the interest expense under the right property.
Counter increment: mortgage.paymentsMade and mortgage.currentBalance are only updated when the JE helper reports the entry was actually new ($__wasNew === true). Re-running the dialog with the same sourceId is a no-op — no double-count, no double-decrement.
Auto-close: when currentBalance hits 0 (or goes negative — clamped), status flips to paid-off.
Actions
Add a mortgage
- On the Property detail Overview tab, click Add mortgage.
- Fill lender, original principal, rate, compounding, frequency, payment, start date.
- Pick the Principal (liability), Interest expense, and optional Escrow accounts. Defaults come from the COA wizard.
- Click Save.
Refinance
v1 has no built-in refinance flow. To model a refinance:
- Mark the old mortgage as Closed (status edit).
- Create a new mortgage with the new lender, balance, rate, and payment.
- Post a journal entry to square the balance transfer (Dr old mortgage liability, Cr new mortgage liability).
A dedicated refinance flow is on the post-v1 list.
Related
- Property detail
- Chart of accounts
- Property P&L — interest expense rolls into this report