One system for a developer's whole buyer lifecycle: reservation, contract, amortization, collections, disbursement and commissions. Sample records throughout.
Sales dashboard
Where the sales desk starts the day.
Collections against target
Needs attention
- Buyer 0142 — 2 missed amortizationsdelinquency · second demand letter
Statement of account generated and queued.
- Reservation R-0912 expires in 3 daysdocument deadline
- PO-0231 exceeds the department budgetdisbursement
Blocked until the finance director approves.
- Commission tranche 3 lockedawaiting signed contract
Buyer CRM
Open a row to walk the full account.
| Buyer | Lot | Scheme | Account status | KYC | Outstanding |
|---|---|---|---|---|---|
| Buyer 0142 | B-14 | In-house Installment | Active | Approved | sample |
| Buyer 0187 | C-03 | Bank Financing | Active | Approved | sample |
| Buyer 0203 | A-21 | Deferred Cash | Onboarding | In Progress | sample |
| Buyer 0219 | D-08 | Spot Cash | Fully Paid | Approved | — |
| Buyer 0224 | C-11 | In-house Installment | Invited | Pending | — |
what the record holds Buyer
statusenumDraft · Invited · Onboarding · Active · Fully Paid · Cancelledkyc_statusenumPending · In Progress · Approved · Rejected · Forfeitedpayment_schemeenumSpot Cash · Deferred Cash · In-house Installment · Bank Financingtcpnumberoutstanding_balancenumberdownpayment_percentnumberfinanced_principalnumberinterest_ratenumberterm_monthsnumbermonthly_amortizationnumberamortization_start_datedatedelinquency_stageenumNone · Pre-Due Reminder · First Demand Letter · Second Demand Letter · Cancellationsales_agent_emailstringpromo_codestringBuyer 0142
Sample account. Nothing here is a real buyer.
Account
- Buyer
- 0142
- Lot
- B-14
- Scheme
- In-house Installment
- Term
- 120 months
- Interest
- sample %
- Agent
- Agent 04
Ledger
- Total contract price
- sample
- Paid to date
- sample
- Outstanding
- sample
- Missed
- 2 installments
- Cumulative penalty
- auto-computed
- Stage
- Second Demand Letter
Account lifecycle
Where this account sits. Documents gate the moves, not dates.
- 1Draft
- 2Invited
- 3Onboarding
- 4Reservation agreement signed
- 5Computation confirmed
- 6Contract signed
- 7Active
- 8Fully Paid
Audit trail
- today 09:14Delinquency evaluatedsystem
days_overdue 47 · stage escalated to Second Demand Letter
- today 09:14Statement of account generatedsystem
soa_snapshot stored against the event
- today 09:15Email sentsystem
action: email_sent
- 12 MarPenalty appliedFinance 02
penalty_months_applied 2 · penalty_locked
- 02 JanAccount transferred to financeAgent 04
Reservations
A reservation holds a lot for a fixed window, and expires if the documents do not land.
| Reservation | Buyer | Lot | Fee paid | Deadline | Status |
|---|---|---|---|---|---|
| R-0912 | Buyer 0203 | A-21 | yes | in 3 days | Pending |
| R-0914 | Buyer 0224 | C-11 | yes | in 11 days | Confirmed |
| R-0908 | Buyer 0198 | B-07 | no | passed | Expired |
| R-0916 | Buyer 0231 | D-02 | yes | — | Awaiting Approval |
data model Reservation
statusenumAwaiting Approval · Pending · Confirmed · Cancelled · Expiredreservation_feenumberholding_period_daysnumberdocument_deadlinedateexpiry_pausedbooleana supervisor can pause the clock, and it is recordedpromo_codestringAmortization schedule
Generated once the computation is confirmed; every row carries its own principal, interest and penalty.
| # | Due | Amount due | Principal | Interest | Penalty | Status |
|---|---|---|---|---|---|---|
| 34 | 01 Feb | sample | sample | sample | — | Paid |
| 35 | 01 Mar | sample | sample | sample | sample | Overdue |
| 36 | 01 Apr | sample | sample | sample | sample | Overdue |
| 37 | 01 May | sample | sample | sample | — | Due |
| 38 | 01 Jun | sample | sample | sample | — | Upcoming |
data model AmortizationSchedule
installment_numbernumberamount_due / principal / interestnumberpenalty_amountnumberpenalty_months_appliednumberpenalty_lockedbooleanstops recomputation once a payment is matchedstatusenumUpcoming · Due · Paid · Partial · Overdue · Waived · Forfeiteddeferral_idrefa deferral rewrites the dates and is kept as its own recordPayments & receipts
| AR number | Buyer | Type | Method | Amount | Status |
|---|---|---|---|---|---|
| AR-10421 | Buyer 0187 | Monthly Amortization | Bank transfer | sample | Received |
| AR-10422 | Buyer 0203 | Reservation Fee | e-wallet | sample | Received |
| AR-10423 | Buyer 0142 | Penalty | Cash | sample | Pending |
| AR-10424 | Buyer 0231 | Downpayment | Check | sample | Pending |
data model Payment
payment_typeenumReservation Fee · Downpayment · Monthly Amortization · Spot Cash · Penalty · Misc FeestatusenumPending · Received · Rejectedprincipal_portion / interest_portionnumbersplit at posting, not at report timeverified_by / verified_atauditreceipt_urlfileA payment is posted against a schedule row, which is what keeps the ledger and the schedule from drifting apart.
Interactive lot map
In the real system these maps are generated from site-plan PDFs with automated contour detection, then stored as SVG. Click a lot to change its state.
Block B — sample layout
Click a cell to change its state.
data model Lot
lot_number / block_namestringsvg_idstringties the record to its shape on the generated maparea_sqm / price_per_sqmnumbertcpnumbercomputed from the pricing configurationstatusenumAvailable · Assigned · Reserved · Sold · Hold · Forfeited · Non-SellablePurchase orders & canvassing
Click a card to move it along. The real status set is longer than most people expect, because receiving and payment are separate concerns.
Pending approval 2
Approved, awaiting issuance 1
Issued, pending delivery 1
Received, pending RR 1
Closed, forwarded to AP 1
Click a card to move it along.
Purchase order states
- 1Pending Approval
- 2Returned for Revision
- 3Approved Awaiting Issuance
- 4Issued Pending Delivery
- 5In Transit
- 6Delayed
- 7Received Pending RR
- 8Received with Discrepancies
- 9Closed Forwarded to AP
- 10Check Attached
- 11Acknowledged
- 12Voided
Check vouchers, petty cash & budget requests
| Voucher | Source | Payee | Amount | Status |
|---|---|---|---|---|
| CV-0441 | Purchase Order | Supplier 03 | sample | Issued |
| CV-0442 | Budget Request | Department: works | sample | Issued |
| CV-0438 | Job Order | Supplier 01 | sample | Voided |
data model CheckVoucher
sourceenumBudget Request · Purchase Order · Job Order · Direct EntrystatusenumIssued · Voidedvat_amount / liquidatednumber · booleanapproved_by / issued_by / received_byauditvoid_reasonstringa void never deletes the rowSales commissions
The part sales teams care about: commission unlocks in tranches as the buyer actually pays, not when the sale is written.
| Agent | Buyer | Rate | Tranche 1 | Tranche 2 | Tranche 3 |
|---|---|---|---|---|---|
| Agent 04 | Buyer 0142 | sample % | Released | Ready for Release | Locked |
| Agent 01 | Buyer 0187 | sample % | Released | Released | On Hold |
| Agent 07 | Buyer 0219 | sample % | Released | Released | Released |
data model SalesCommission
tranche_n_statusenumLocked · Ready for Release · On Hold · Releaseddp_threshold_1 / 2 / 3numberthe downpayment collected that unlocks each tranchecommission_ratenumberntcpnumbernet of discounts, so the base cannot be inflatedntcp_edit_historyauditevery change to the base is keptTranche 3 stays locked until the contract is signed and the full downpayment is collected — the two things that actually de-risk the sale.
Automated delinquency processing
Escalation stages
- 1None
- 2Pre-Due Reminder
- 3First Demand Letter
- 4Second Demand Letter
- 5Cancellation
data model DelinquencyEvent
actionenumemail_sent · email_failed · physical_mail_flagged · penalty_applied · status_changed · stage_escalated · cancellation_flagged · contract_cancelled · soa_generateddays_overduenumberunpaid_principal / cumulative_penalty / total_duenumbersoa_snapshotjsonthe statement as it was sent, frozen on the eventphysical_mail_requiredbooleanEvery escalation writes an event with the figures it used. A dispute six months later can be answered with the exact statement that went out.
Client portal
What a buyer sees when they sign in.
My account
- Lot
- B-14
- Next due
- overdue
- Outstanding
- sample
- Documents
- 3 available
- Statement of accountPDF
- Official receiptsPDF per payment
- Ownership certificate noticeemail
Sent automatically once the account is fully paid.
Module access and the audit log
| Module | Sales | Finance | Management | Buyer |
|---|---|---|---|---|
| Buyers & reservations | write | read | read | — |
| Amortization & payments | read | write | read | own |
| Disbursement | — | write | approve | — |
| Commissions | own | write | approve | — |
| Audit log | — | read | read | — |
Access is a record (RoleModuleAccess), not a hard-coded check, so a new role is configuration rather than a release.