Phase 3 — TypeScript

Property Management System

A landlord owns 12 residential properties across Metro Manila with a total of 40+ units. She tracks rent collection in a notebook, sends payment reminders via text, and has no idea which units are profitable after maintenance costs. She needs a system that manages tenants, leases, rent collection, maintenance requests, and financial reporting across all her properties.

The hardest project. Multiple properties, multiple units per property, tenants with lease terms, recurring rent generation, payment tracking, maintenance workflows, and financial analytics per property and per unit. TypeScript is essential — the relationships between properties, units, leases, tenants, payments, and maintenance requests are deep enough that untyped code will break constantly. This is your portfolio centerpiece.

What to Build

Phases

1Data model with TypeScript interfaces: User (with roles), Property, Unit, Tenant, Lease, RentInvoice, Payment, MaintenanceRequest. Define types first. The relationship chain is deep: Property → Unit → Lease → Tenant, and Property → Unit → MaintenanceRequest. Think about how rent invoices are generated and linked.
2Backend: Property/Unit CRUD, tenant onboarding, lease creation with validation (can't lease an occupied unit), rent invoice auto-generation, payment processing with partial payment support, maintenance request workflow, financial aggregation endpoints. Fully typed.
3Landlord frontend: property overview, unit grid per property, lease management, rent collection tracker, maintenance queue, financial dashboard with charts.
4Tenant portal: lease info, payment history, submit/track maintenance requests.
5Tests: rent calculation edge cases (partial payments, mid-month move-ins), lease validation (overlapping leases on same unit), financial report accuracy. Deploy.

Decisions You'll Make

How to model the Property → Unit → Lease → Tenant chain (all separate collections with references? how deep do you populate?). How to handle rent generation (cron-like job on server start? generate on dashboard load? pre-generate for the month?). How to prevent leasing an already-occupied unit (validation + atomic check). How to calculate net income per unit (rent payments minus maintenance costs — aggregation pipeline). How to handle partial payments (a tenant pays 8,000 of 12,000 — how is that modeled?). How to type the financial calculations so rounding errors are impossible. How to share types between the landlord frontend and tenant portal.

Stack

TypeScript React Express or Apollo MongoDB Mongoose JWT bcrypt React Router React Query Redux Toolkit useReducer useContext Custom Hooks Vitest SuperTest Playwright React Testing Library Material UI ESLint