Skip to content

Leases

Open lease

Overview

A Lease ties a Tenant to a Unit for a stated term at a stated base rent, with a stated deposit. Every lease references a Unit (required) — even a single-unit property needs one Unit to hold a lease. The Lease record drives three automations:

  1. Rent schedule generation — a nightly cron pre-provisions the next few months of RentSchedule rows for each active lease; you can also provision on demand from the Rent Schedule tab.
  2. Scheduled escalations — pre-planned bumps stored on the lease apply automatically via a nightly cron.
  3. Monthly rent invoice generation — on the 1st of each month a cron turns due RentSchedule rows into actual Invoices.

Each lease has its own detail page with four tabs: Overview, Rent Schedule, Rent History, and Documents.

The lease detail header shows a small summary card with:

  • baseRent
  • Rent due day (day of month)
  • Status: Pending / Active / Ended / Terminated
  • Start date and End date (End is ”—” when month-to-month)
  • Rollover type (Fixed term / Month-to-month)

The header carries no action buttons — deposit actions live in the Overview tab. Leases are edited (including changing their status) from the Leases list; there is no Edit or Terminate button on the detail page itself.

Tabs

Overview

Shows the Security deposit panel: the held amount plus three buttons — Record intake, Compute annual interest, and Dispose deposit. All three are disabled until the lease has a non-zero deposit. See Deposit flows below.

Rent Schedule

Shows every RentSchedule row on the lease. Columns: Period start, Period end, Amount, Status (Pending / Invoiced / Paid / Partial / Waived), and Invoice (a link once one is issued).

A row’s amount snapshots baseRent at generation time. Pending, not-yet-invoiced rows are repriced when a Rent Change or escalation applies, so future figures track the current base rent while already-invoiced periods stay historically accurate.

Provision next 3 months

Runs the schedule generator for this lease on demand, seeding the next three months of rent periods. Useful during onboarding so rows appear without waiting for the nightly cron.

Generate due invoices

Runs the rent-invoice generator for this lease’s due rows on demand — handy for backfills or when the monthly cron was skipped. Idempotent: already-invoiced rows are left alone.

There is no per-row “skip” action in the current version.

Rent History

A chronological table of Rent Change records on the lease (mid-lease increases, decreases, and renewals). Columns: Effective date, Type (increase / decrease / renewal), From, To, Notice form, Status (Draft / Scheduled / Applied / Rescinded), and — for Scheduled rows — Apply now and Rescind actions. A New rent change button opens the rent-change dialog.

Escalations (see below) are applied by a cron rather than shown as rows in this table.

Documents

Generic attachments panel — lease PDF, addenda, signed renewals, inspection reports. Max 10 MB per file; a MIME allowlist (PDF, common image types, Word/Excel, plain text) is enforced.

Escalations

Escalations are pre-planned bumps stored inline on the lease (distinct from the RentChange records shown on the Rent History tab). Types:

Typevalue meansExample
fixed-amountAbsolute dollars addedvalue: 50 → +$50
percentagePercent increasevalue: 3 → +3%
manualNew absolute rentvalue: 2100 → baseRent becomes $2,100
cpi-linkedTreated as percentage in v1; operator enters realised CPIvalue: 2.8 → +2.8%

The daily cron sweeps leases with any scheduled escalation whose effectiveDate has arrived, applies them oldest-first (so multiple past-due escalations compound correctly), flips the entry to applied, and reprices unissued RentSchedule rows.

The current lease form does not expose an escalation editor — escalations are set through the API and applied by the cron. For mid-lease increases and renewals you enter in-app, use Rent Changes on the Rent History tab.

Deposit flows

The three buttons in the Overview tab move the deposit through its lifecycle. Intake and disposition post journal entries through the shared posting helper (idempotent on source).

Record deposit intake

Posts on move-in:

Dr Cash (chosen cash account)
Cr Tenant deposits held (workspace default or lease's held-in account)

Both lines tagged with propertyId, unitId, and leaseId. Safe to re-run — idempotent on lease:<id>:intake. The first intake also caches the deposit-liability account on the lease.

  1. Click Record intake on the Overview tab.
  2. Enter the Cash account ID the deposit is going into (paste the Chart-of-Accounts account ID — a picker ships in a later phase).
  3. Confirm. The amount defaults to the lease’s deposit; the deposits-held account resolves from the lease’s held-in account or the tenantDepositsHeld workspace default.

Compute annual interest

Pure helper — computes the annual interest at the supplied rate and shows the number in a toast. No JE is posted; you post it manually once reviewed.

  1. Click Compute annual interest.
  2. Enter the rate % (e.g. Ontario statutory rate, landlord policy).
  3. Review the calculated amount, then post a manual JE (Dr Interest expense, Cr Tenant deposits held).

Deposit disposition

Run at move-out to allocate the deposit between deductions (cleaning, damages, unpaid rent) and the tenant refund. Posts a single JE:

For each deduction:
Dr Tenant deposits held
Cr <target account the user picked>
If refund > 0:
Dr Tenant deposits held
Cr Cash

All lines carry propertyId, unitId, and leaseId so the Property P&L picks up any writedowns. The result is shown as an on-screen summary (no PDF).

  1. Click Dispose deposit on the Overview tab.
  2. Set the Disposition date and an optional Memo.
  3. Add deduction rows: description, target account ID (Chart-of-Accounts ID), and amount.
  4. Enter the Refund amount (suggested = held − deductions). If it’s greater than 0, supply the Cash account ID the refund is drawn from.
  5. Click Post disposition. The whole JE posts atomically.

Overdue disposition widget: the Dashboard flags any lease ended (or terminated) more than 10 days ago with deposit > 0 and no disposition JE — using endDate when set, falling back to updatedAt so month-to-month roll-offs without an explicit end date still get caught.

Actions

Create a lease

  1. From the Leases list, click New Lease.
  2. Pick the Property, then the Unit (the unit list filters to the chosen property), then the Tenant. All three are required.
  3. Enter Start date, optional End date (leave blank for month-to-month), Rollover, Status, Base rent, Rent due day (1–31), and Deposit.
  4. Click Create lease.

RentSchedule rows are not created instantly on save — they’re provisioned by the nightly cron or on demand via the Rent Schedule tab’s Provision next 3 months button. Record the deposit separately via the intake button on the Overview tab.

End or terminate a lease

There is no dedicated Terminate flow. To end a lease, edit it from the Leases list and set its Status to Ended or Terminated. Already-issued rent invoices are preserved regardless.