Enabling double-entry accounting
By default, Habitia tracks rent and work-order costs in a simple way — enough to know who owes what and where your money went. Double-entry accounting is the optional upgrade for landlords who want a proper general ledger: every payment posts to two accounts (debit and credit), and you can produce Trial Balance, P&L, and Balance Sheet reports.
You don’t need this if you don’t already use double-entry accounting elsewhere. Habitia’s regular ledger and reports work fine without it.
Open Settings → Accounting.
Note: Only an admin can enable, disable, or seed the chart of accounts.
When to enable it
- You have an accountant who insists on double-entry books.
- You’re consolidating Habitia with an external general ledger (e.g., QuickBooks export).
- Your portfolio is large enough that you need formal financial statements for taxes, lenders, or partners.
If none of those apply, skip this tab.
Two-step setup
1. Seed the Chart of Accounts
If this is the first time you’re touching Accounting, the Seed Chart of Accounts button is the only action you’ll see. Click it.
Habitia creates a default chart of accounts — a standard set of accounts (Cash, Rent Income, Maintenance Expense, Security Deposits, etc.) tagged with the codes the system needs to post entries correctly.
After seeding, the Chart of accounts section below the status card shows every account with its code, type, and current balance (zero on day one).
2. Enable Accounting
After the chart is seeded, the Enable Accounting button appears. Habitia checks that all required account codes exist; if any are missing, an amber banner lists them — you can re-seed to fix.
Click Enable Accounting. Status flips to Enabled and the green checkmark appears.
From this moment on, every payment, charge, late fee, and credit posts to the general ledger automatically.
What posts where
A few examples of how a transaction breaks into the two-sided entry:
- Rent payment by ACH → debit Cash (operating account), credit Rent Income. With Processor clearing on (Settings → Accounting), a card, ACH or ATH Móvil payment debits Stripe Clearing (1150) or ATH Móvil Clearing (1160) instead, and the money reaches the bank account only when the payout does: debit Bank, credit the clearing account. See Money still with the processors.
- Processing fees you absorb (Stripe and Habitia fees when a lease or your org is set to landlord-pays, and the ATH Móvil fee, which ATH always deducts before depositing) → the entry splits: debit Cash for the net that reached the bank, debit Payment Processing Fees (5310) for the fees, credit Rent Income for the full rent. When the tenant pays the fees on top, nothing is booked — the fees never touched your money. The Payments page shows “net … after … fees” on those rows.
- Security deposit received → debit Cash, credit Security Deposits Held (a liability).
- Maintenance work order paid → debit Maintenance Expense, credit Cash.
- Deposit disposition finalized (at move-out) → debit Security Deposits Held for the deposit applied, credit Rent Income / Late Fees / Deposit Recoveries for each deduction, credit Deposit Refunds Payable for what you still owe the tenant back. If the damage exceeded the deposit, the shortfall debits Accounts Receivable. Reopening the disposition voids the entry.
- Owner service charge (inspection fee, tenant placement, …) → debit Due to Owners, credit Service Fee Income. No cash moves — the fee is retained from collected rent, and the books now show it as your earnings.
- Deposit refund paid (after the disposition is finalized) → debit Deposit Refunds Payable, credit Cash. Recorded from the turnover’s Deposit tab.
The “Cash” side above is Bank — Operating by default. With trust accounting on, client money posts to Bank — Trust (or the deposit escrow account) instead, based on where each payment actually landed.
You don’t see these entries by default — they live in the general ledger view. Habitia exposes them in Reports → Accounting. Each report there — Trial Balance, P&L, Balance Sheet, and the Journal — downloads as a PDF from the button next to its heading, ready to hand to your accountant.
Money still with the processors
A card or ACH payment is not in your bank on the day the tenant pays. Stripe holds it and pays out later, in batches, net of fees; ATH Business deposits the day’s payments the next business day. Until then, booking the receipt straight to the bank overstates your cash and leaves the bank statement with one payout line where the books have many receipts.
Processor clearing (Settings → Accounting, admin only) fixes both. When it is on:
- A card, ACH or ATH Móvil receipt debits 1150 Stripe Clearing or 1160 ATH Móvil Clearing. Income, deposits held and fees are booked exactly as before; only the cash side waits.
- Stripe payouts clear themselves. When Stripe reports a payout to your bank, Habitia lists the payments in it and moves the ones it booked to clearing into the bank account that rail lands in: debit bank, credit 1150. A refund or chargeback on such a payment had already credited 1150, so the payout nets out. Receipts booked before you turned clearing on are left alone, never counted twice, and anything Stripe paid that Habitia cannot match is shown as Unmatched on the payout row rather than invented. This needs your Stripe webhook to receive payout events for connected accounts; if the listing fails, the payout waits in Failed postings and is retried.
- ATH Móvil deposits are recorded by you. ATH has no settlement notification, so under Reports → Accounting → Bank Rec the Money still with the processors card shows the 1160 balance and a form to record each bank deposit (amount, date, reference). Each one posts debit bank, credit 1160 and can be voided.
- The Trust Summary lists what the processors still hold, so a trust account that looks short on rent day is explained. That money is in no leg yet: it cannot pay an owner until it arrives.
Turning clearing on stamps a start date; receipts dated before it stay where they were booked. Turning it off books new receipts to the bank again and leaves the clearing balances in place until their payouts are recorded.
Handing the books to your accountant
Under Reports → Accounting → Journal, three export buttons take the date range you set on the filters (or all time):
- Journal CSV — one row per journal line: date, entry, status, source, memo, who posted it, account code and name, debit, credit, and the property, unit, lease, tenant or vendor the line belongs to. Opens in any spreadsheet and imports into any ledger system.
- General ledger CSV — the same lines grouped by account, each account starting with its opening balance for the period, a running balance on every line, and a closing balance. This is the account-by-account view a CPA reads.
- QuickBooks IIF — a General Journal import for QuickBooks Desktop. It lists the accounts first (as code · name, so they stay unique) and then one block per entry, debits positive and credits negative. Voided entries and their reversals are both included, marked [VOID], so the file matches the books line for line.
For an outside accountant who should see everything and change nothing, the Accountant (read-only) permission group gives read access to the chart, journal, reports, payments and owner ledgers with no write anywhere. The original Accountant group keeps its write access for an in-house bookkeeper.
Managing the chart of accounts
Under Settings → Accounting → Chart of Accounts, an admin can Add account (a numeric code that is not in use, a name, a type, and optionally a parent of the same type) and, on any row, Rename or Deactivate / Reactivate. System accounts, the ones the engine posts to by code, can be renamed but never deactivated. An account with a balance or with active child accounts cannot be deactivated either; move the balance first. The posting engine refuses new lines on an inactive account, so deactivating is how you retire a code without losing its history.
The audit trail and how long it is kept
Every journal entry records who posted it (a user, or the system path that did, such as system: owner sweep or system: payment), when, and why (its memo). Voiding an entry requires a reason, which becomes the memo of the mirror reversal, and the original and the reversal point at each other. The Journal browser under Reports → Accounting shows all of this on each entry.
Nothing financial is ever expired or deleted by Habitia: journal entries and lines, payments, the tenant and owner ledgers, deposit dispositions, payouts, refunds and the period-close history stay for as long as the organization exists. The per-request activity log (who called which endpoint, from where) keeps ordinary events for 90 days, but any request that moved money or changed the books is marked financial and kept without expiry, so the trail is there for the statutory period: Hacienda generally asks for six years, the IRS for three to seven. Exporting the general ledger and journal for an accountant is on the roadmap.
Owner-balance adjustments can only offset against a fee given back, a service charge given back, a cost you absorb, or an advance settled by hand; retained earnings is never a manual plug. If a balance is wrong because a payment or expense is wrong, fix that row and the books follow.
The trial balance and account activity
The Trial Balance shows each account’s net balance in one column: the debit column when the account nets to a debit, the credit column when it nets to a credit. A bank account that took in $10,000 and paid out $4,000 shows $6,000 in the debit column, the way an accountant expects, and the two column totals must be equal. Switch to Activity to see the gross debits and credits that moved through each account instead; that view is handy for spotting how busy an account was, and its PDF is titled Account Activity. Both views take an as of date.
What the engine refuses
Every journal entry, whether Habitia posts it from a payment or you enter it by hand, is checked before anything is written. An entry is refused when it has fewer than two lines; when its debits and credits differ by even one cent (Habitia adds them up in whole cents, never in floating point); when a line names an account that does not exist, belongs to another organization, is inactive, or is a header account such as 1000 Assets, which only totals its children; when the posting path is not one the books recognize; or when the date falls inside a closed period. Nothing half-written ever reaches the ledger: on a replica-set database the entry, its lines and its status are saved in one transaction, and on a single server they are written in an order that leaves at most an invisible draft if the connection drops. Posted entries are never edited or deleted, only voided with a mirror reversal.
Disabling
Click Disable to turn double-entry off. Existing posted entries stay where they are; new transactions stop posting to the GL until you re-enable.
Note: Disabling doesn’t delete the ledger entries Habitia already posted. Books remain auditable for whatever period you had double-entry on.
Closing a period
When your books for a month, quarter, or year are final (typically after your accountant reviews them), close the period so nothing can quietly change it: in Settings → Accounting, under Period close, pick a cutoff date and click Close books through this date.
From then on, anything dated on or before the cutoff is locked platform-wide — you can’t post, edit, void, or delete payments, ledger entries, deposit dispositions, owner charges, or manual journal entries in the closed range. Attempts are refused with a clear message instead of silently desyncing your books.
Need to fix something in a closed period? An admin can click Reopen (or close through an earlier date), make the correction, and close again. Every change to the close date is kept in a Close date history under the Period close card, with who changed it and from what to what, so moving it back is never silent. For most landlords this is an annual ritual; some don’t close at all and just rely on the live trial balance.
Two things cannot refuse a closed period, so they date forward instead: online payments that Stripe or ATH Móvil confirm, and the nightly jobs that post rent charges and late fees. If one of those would land inside a closed month, Habitia dates it on the first open day and marks the row with the date it came from.
Closing the year
Closing a period locks it; closing the year is the accounting step on top of that, done once a calendar year has ended and your accountant has signed off. Under Settings → Accounting → Year-end close, each year with activity is listed with its income, expenses and net. Close year posts one entry dated 31 December that moves every income and expense balance for the year into 3900 Retained Earnings. After it, the balance sheet shows that result inside retained earnings instead of the Current-year earnings (not yet closed) line, while the P&L for the year still shows what it earned, because the closing entry is left out of the P&L on purpose. Years close in order and cannot be closed before they end; Reopen voids the closing entry (a reason is required) and must be done newest year first. The closing entry is the one entry allowed to carry a date inside a locked period, since 31 December is where it belongs.
Opening balances
If you ran your books elsewhere before Habitia, post your opening balances once from the same card: pick the day before Habitia took over, enter each balance-sheet account with its balance (assets as debits, liabilities and equity as credits), and Habitia plugs the difference to 3900 Retained Earnings so the entry balances. Income and expense accounts are not accepted there; they start from zero. Only one opening entry can be live; void it from the Journal (with a reason) to redo it.
Failed postings
Very rarely a payment saves but its journal entry does not (an account was deleted, a setting is missing). The payment is never lost: it appears under Failed postings on this page with the error, a Smart Alert is raised, and Habitia retries it every hour. Retry now runs the retry immediately. Only dismiss one if you booked it another way, for example with a manual journal entry.
What’s next
- Reports → Accounting — Trial Balance and the rest of the formal reports (once enabled).
- Understanding the ledger — the per-lease view that works with or without accounting on.