Billing¶
The Billing module handles invoices, payments, statements, and the financial side of running the estate.
What residents see¶
Residents have My Billing:
- Outstanding balance — total amount owed across all open invoices.
- Open invoices — each with its line items (service charge, parking, utilities, late fees), due date, and a Pay now button.
- Pay now offers MoMo (MTN, Vodafone, AirtelTigo via Hubtel or Paystack), card, bank transfer, or upload a payment receipt for manual reconciliation.
- Receipts — every payment with a downloadable PDF receipt.
- Statement — full transaction history for the unit, exportable as PDF for tax/audit purposes.
- Auto-pay — opt in to auto-charge a saved card or auto-debit MoMo on the due date.
What facility admins do¶
Generate invoices¶
Two patterns:
- Recurring (monthly / quarterly) — the system auto-generates invoices from your fee schedule on the configured cycle date.
- One-off — Billing → New Invoice → pick the unit → add line items → save. Useful for special charges (assessment, late fee, refund).
Fee schedules¶
Settings → Billing → Fee Setup holds your standard charges:
- Per-unit-type service charge (Studio: GHS X, 1 BR: GHS Y, etc.)
- Parking permit fees
- Amenity booking fees
- Utility pass-through rates
- Late-payment penalty (rate + grace period)
When you change a fee, future invoices use the new rate. Invoices already generated keep their original amounts.
Reconcile payments¶
Three categories of payment:
- Auto-reconciled — MoMo and card payments come back through the gateway webhook with the invoice reference, so they post directly against the matching invoice. No human action.
- Manual reconciliation — bank transfers don't always include the invoice reference. The Reconciliation tab shows unmatched bank payments next to open invoices, and you click to match them.
- Receipt upload — a resident has paid you cash or via offline transfer and uploaded a photo of the receipt. You verify the photo and click Approve to post it.
Payment gateways¶
CautaReside ships with two integrated payment gateways plus manual options. Pick one when you set up your subscription or accept a resident payment. Hubtel embedded checkout is the default for new facilities — it's the most universal and the best-tested path.
| Gateway option | Methods | When to use |
|---|---|---|
| Hubtel — embedded (default) | MoMo (MTN, Vodafone, AirtelTigo), card, QR, bank | The customer lands on Hubtel's hosted page and picks any method there. No phone-number input from your side. Best UX, widest coverage. |
| Hubtel — direct MoMo | MTN / Vodafone / AirtelTigo MoMo | Customer's phone receives an instant USSD push. Skip a step if you know they're paying via MoMo. |
| Paystack — card | Visa, Mastercard, Verve | Card-first; auto-renew works (Paystack stores the auth token, charges next cycle automatically). |
| Paystack — MoMo | MTN / Vodafone / AirtelTigo MoMo | Same telco coverage as Hubtel direct, billed through Paystack instead. |
| Paystack — bank | Direct bank transfer | Customer pays from their bank app; reconciles via Paystack's bank-rail. |
| Bank transfer (manual) | Wire / ACH | Resident pays into your facility's bank account; you reconcile in Billing → Reconciliation. |
| Invoice (Pay Later) (operator-managed) | None — customer pays via any out-of-band channel | For negotiated B2B / NGO contracts. The CautaReside operator issues the invoice; the facility activates immediately or after payment. |
Settlement timing¶
- Hubtel and Paystack typically settle within 24–48 hours
- Bank transfers can take 3–5 working days
- MoMo (via either gateway) usually settles same-day for MTN, next-day for Vodafone / AirtelTigo
Auto-renewal vs manual renewal¶
- Paystack card — auto-renews each billing cycle (Paystack charges the saved card)
- Hubtel (both flavours) and Paystack MoMo / bank — manual renewal required each cycle (no stored payment token)
- Invoice — manual renewal; the system raises a fresh invoice on the cycle date
Per-facility Hubtel credentials¶
Most facilities use the platform's shared Hubtel merchant account out of the box (no setup required). If you want your subscription billings to settle into your own Hubtel merchant — useful for larger estates managing their cash flow directly — ask the platform operator to enable per-facility Hubtel credentials in Settings; the option appears once it's switched on for your facility.
Late fees¶
Settings → Billing → Late-payment rules:
- Grace days — how many days past due before late fees start (default 14 days).
- Penalty rate — percentage applied to the overdue amount (default 5%).
- Compounding — flat one-time vs monthly compounding.
Penalties are calculated nightly and added as separate line items on the next invoice cycle.
Expense approval workflow¶
For facilities that want a second-pair-of-eyes on spend before it posts, Settings → Billing → Expense approval turns on a flagging gate. Two knobs:
- Required — when ON, any expense at or above the threshold amount is created with status pending instead of approved.
- Threshold (pesewas) — expenses below this amount auto-approve (small operating items don't queue up); expenses at or above flip to pending and wait for review.
A pending expense: - Doesn't post to the books or reduce any account balance. - Shows in the Billing → Pending Approvals queue. - Sends an email + push to mgmt with the submitter + amount + photo + description.
Mgmt opens the row → reviews the receipt photo + description → clicks Approve (posts immediately) or Reject with reason (notifies the submitter, no posting). A safeguard prevents submitters from self-approving — the approver must be a different user, even when both have the same role (the CautaReside operator can override for stuck queues).
Reports¶
Billing → Reports has: - Aging report (current, 30, 60, 90, 90+) — per currency when the facility transacts in more than one - Collection rate (% of invoiced collected within the cycle) - Per-unit balance summary - Payment method breakdown (what % via MoMo / card / bank, plus the gateway filter to slice by specific gateway when comparing Hubtel vs Paystack throughput) - Year-over-year revenue comparison - Trailing-12-months revenue series, per-currency
For HOA committees: Public Finances can be enabled (Settings → Billing → "Show financial summary to HOA committee"). When on, your elected committee members see the same reports without requiring a manager-level login.
Balance sheet¶
A facility-level balance sheet view lives at Billing → Balance Sheet (mgmt). Two presentation modes:
- HOA balance sheet tab (default) — operator-friendly summary with the standard assets / liabilities / equity sections, scoped to the facility's accounts. Auto-computes from billing + accounts entries.
- Full GAAP — enables when Settings → Billing → Balance sheet enabled is on. Adds the formal GAAP line structure with manual upsert affordances for adjusting entries (depreciation, accruals, prepayments). Useful for facilities that file standalone financial statements.
The "as of" date is pickable; downloadable as PDF for the audit pack.
Multi-currency¶
CautaReside is multi-currency-aware. Invoices are denominated in your facility's primary currency (typically GHS for Ghana), but the platform shows USD equivalents when relevant — useful for foreign tenants or international landlords.
The forex rate is set platform-wide by your CautaReside operator; ask them about your current rate if you need to know.
QuickBooks Online sync¶
If your facility uses QuickBooks Online for bookkeeping, you can connect it in Settings → Integrations → QuickBooks Online. The connection flow uses OAuth: click Connect, sign in to QBO in the popup, pick the company file, accept permissions. The connect status shows in the same card.
Once connected:
Outbound (CautaReside → QBO)¶
- Every charge / invoice posted in CautaReside enqueues a QBO invoice creation (fire-and-forget, retries with backoff). The QBO invoice number is stored back on the CautaReside record so you can pivot either way.
- Payments sync as bank deposits against the corresponding QBO invoice.
- Refunds sync as credit memos.
- Bulk imports (e.g. the period-open charge run) batch-enqueue rather than serialise to avoid rate-limiting.
Inbound (QBO → CautaReside)¶
A separate inbound webhook opt-in (Settings → Integrations → QBO → "Allow QBO to push updates back") enables an inbound feed:
- Payments recorded directly in QBO (e.g. from a deposit slip reconciled by the bookkeeper) post back to CautaReside against the matching invoice.
- Edits and voids in QBO propagate back, with the reason stamped on the CautaReside audit log.
CautaReside is the source of truth for resident-facing data; QBO is the source of truth for accounting periods. Conflicts (e.g. an invoice voided in CautaReside while QBO has it paid) raise a flag in the QBO sync diagnostic panel rather than auto-resolving.
Tax handling (Ghana)¶
For Ghana facilities, invoices automatically include the statutory tax breakdown (NHIL + GETFL + VAT). Tax-exempt facilities (registered charities, religious organizations) can flip the exempt flag in Settings → Billing — exempt invoices show a small green badge instead of the tax line.
Tips¶
- Auto-pay saves a lot of dunning effort. Encourage residents to enable it on the dashboard.
- Push and Telegram receipts reach residents fastest — they don't have to open the app to confirm a payment landed.
- Reconcile weekly, not monthly — manual reconciliation accumulates errors. A weekly pass catches misallocations while they're still fresh.
- Statement PDFs are accepted by most landlords for end-of-tenancy deposits — encourage residents to download theirs at lease-end.
Process flows¶
End-to-end procedures the billing team runs day-to-day. Steps are anchored to the actual UI labels.
Charge a unit (one-off invoice)¶
Resident owes a one-off cost — repair recharge, special assessment, late fee outside the normal cycle.
- Billing → Invoices → + New invoice.
- Pick the unit; owner + tenant fields auto-fill from the unit registry.
- Add one or more line items — pick a fee preset (matches your Fee Setup) or type free-text + amount.
- Set due date (defaults to billingPaymentDueDay of the next cycle).
- Optional: attach evidence (photo, contractor invoice PDF) if the charge is contestable.
- Issue posts the invoice and emails the resident; the line shows up on their portal immediately.
Record a payment manually¶
Resident paid via cash at the office, MoMo to your account, or any channel that didn't hit a webhook.
- Billing → Payments → + Record payment.
- Pick the unit, then select the invoice(s) the payment should clear (multi-select for partial / split payments).
- Enter the amount tendered and pick the payment method (Cash / MoMo / Bank transfer / Cheque / Other).
- For non-cash methods, capture the reference number (MoMo transaction ID, cheque number, etc.) — used during reconciliation.
- Save. The invoice flips to Paid (full) or Partial (short pay) and the resident gets an emailed receipt.
Send a dunning reminder¶
Invoice is past due and you want to nudge.
- Billing → Overdue filter, or pick a specific invoice → Send reminder.
- Choose the tone (Friendly / Standard / Final notice) — each maps to a templated email + push.
- Optional: attach a custom note.
- Send — the dunning event is logged on the invoice timeline so subsequent reminders show frequency / spacing.
Reconciliation (end of cycle)¶
- Billing → Reconciliation tab (visible when reconciliationEnabled is on).
- Pick the cycle (current month default).
- Each row shows expected (invoiced) vs received (payments). Variances are highlighted.
- Click a variance row to drill into the line items and locate the missed / over-paid invoice.
- Close cycle when the variance line is reconciled — locks the cycle from further edits and produces the cycle summary PDF for the audit pack.
Approve a flagged expense¶
When Expense approval required is on (see above), expenses at or above the threshold land in a pending queue.
- Billing → Pending Approvals.
- Open a row → review the receipt photo, category, description, amount, submitter.
- Action:
- Approve — posts immediately to the books; submitter is notified.
- Reject with reason — sends an email back to the submitter with the reason; no posting.
- You can't approve your own expense (same-person guard). Hand to another mgmt user or contact support for stuck queues.
Delete an invoice (with reason)¶
Operator-required: any deletion captures a free-text reason that sticks to the audit trail.
- Open the invoice in Billing → Invoices.
- Click Delete invoice → modal asks for a reason (mistakenly issued / duplicate / merged into another invoice / other).
- Reason is required. The deletion soft-deletes the row (it doesn't physically vanish — auditors can still pull the history with the reason inline).
The same reason-capture pattern applies to deleting line items on an otherwise-live invoice.
Petty cash¶
Petty cash lives under Billing → Petty Cash (visible once it's enabled for your facility and a custodian is assigned).
Open or replenish the float¶
- Billing → Petty Cash → + Top-up.
- Source the cash from a bank withdrawal or office vault and enter the amount tendered to the custodian.
- Capture the source reference (bank slip number, vault log entry).
- Save — the float balance increments and the top-up appears on the custodian's ledger.
Record a petty-cash expense¶
Custodian paid the gardener / bought emergency supplies / settled a small contractor invoice in cash.
- Billing → Petty Cash → + Expense.
- Pick a category (Repairs / Supplies / Transport / Refreshment / Other) and enter the amount.
- Snap the receipt — uploaded to Storage as evidence; required when amount is above the petty-cash variance floor.
- Add a one-line description that ties the expense to a recipient or job.
- Save. Float balance decrements; if it crosses the low-threshold % a top-up reminder is queued for the operator.
Period-end petty-cash reconciliation¶
- Billing → Petty Cash → Reconcile.
- Custodian counts the actual cash on hand and enters the figure.
- The system computes variance (expected − actual); under variance threshold it's logged as normal, over the threshold it requires a written explanation.
- Close period — the closing balance becomes the opening for the next period and the period closes for further entries (corrections require the period to be reopened by support).
Bank accounts¶
Bank accounts lives under Billing → Bank Accounts (mgmt-level). Used to register the facility's receiving accounts so payments can be tagged at recording time.
Add a bank account¶
- Billing → Bank Accounts → + Add account.
- Bank name + branch, account holder name, last 4 digits of the account number (only the last 4 are stored — full number is never persisted).
- Currency (defaults to GHS; pick USD / EUR for foreign-receiving accounts).
- Pick a purpose tag (Operating / Service charge / Reserve / Capital / Other) — drives the default receiving account dropdown when recording payments.
- Save. The account shows up in the Record-payment account dropdown immediately.
Mark a payment received via bank transfer¶
- Billing → Payments → + Record payment → method Bank transfer.
- Pick the receiving bank account from the dropdown.
- Enter the bank reference (transaction ID from your bank statement).
- Save. The payment is tagged to the right account, simplifying month-end reconciliation against the bank statement.
Bank statement reconciliation¶
- Billing → Bank Accounts → pick the account → Reconcile.
- Upload the bank statement PDF / CSV (the system parses GHS bank exports for the major banks).
- Each statement line auto-matches to a recorded payment by reference number; unmatched lines are highlighted.
- For unmatched lines, either link to an existing payment or + Quick-record to create the missing payment row inline.
- Close reconciliation when every statement line is paired — produces the period reconciliation report.
Auto-create billing accounts on new unit¶
Service charges, levies, and reminders are tied to each unit's billing account, so every unit you manage must have one. CautaReside has two helpers to keep your unit list and billing-account list in sync.
Settings toggle: auto-create¶
Settings → Auto-create billing account on new unit.
When ON, every unit added (via Settings → Units → "Add unit", or via bulk import) automatically creates a stub billing account for that unit in the same step. The stub has:
- Empty owner name / email / phone (fill them in via Billing → Accounts → row → Edit when you know the resident).
- Default Monthly payment plan and GHS currency (editable per account).
source = billing(won't conflict with a separate rental account on the same unit if you also use the rentals module).
When OFF (the default for backwards compatibility), unit creation and billing-account creation stay separate — you create accounts manually via Billing → Accounts.
One-click backfill for existing units¶
If your facility already has units without billing accounts (common after bulk-importing the unit list before configuring billing), the Billing → Accounts panel shows a banner at the top:
🧾 N units on this facility don't have a billing account yet. Create stubs now
One click creates stubs for every uncovered unit in a single transaction. The action is idempotent — running it a second time does nothing because the database blocks duplicate accounts on the same unit.
Onboarding prompt¶
New facility admins see a one-time modal on first dashboard load if their facility has any units without billing accounts. The modal offers the same Create-stubs action; Skip dismisses it for that facility on that browser. You can always re-trigger the same backfill from Billing → Accounts whenever you're ready.