An Australian rental SaaS with agent, tenant and admin portals, Stripe billing and dispute resolution.
Built by us
Proptech
Australia
Next.js
Supabase
Stripe
The problem.
LeasePilot is a SaaS product we designed and built ourselves. It gives rental agencies tenant history they can trust, and lets tenants keep their own rental record.
What we built.
Eight modules on one schema: an agent dashboard, a tenant portal, an admin panel, Stripe billing with seat limits, PDF export, dispute resolution, team members and a support centre.
0 of 8 modules on the schema
Agent dashboard
Tenant portal
Admin panel
Stripe billing, with seat limits
PDF export
Dispute resolution
Team members
Support centre
Tenancy and role modelSettled in phase one
The dispute module runs a mediated thread with evidence uploads, a 7-day response window and a 14-day hard limit before a dispute closes.
Tenant portal
Dispute thread
Billing
Admin panel
The decision that mattered.
The tenancy and role model was settled in phase one.
Every later module plugged into it without touching login or data ownership, which is why the later phases moved fast: Stripe billing went from nothing to working in a day, and the final phase took about two weeks.
Phase 1Tenancy and role model settled
8Modules on one schema
1 dayStripe billing, from nothing to working
2 weeksRoughly, for the final phase
What we’d do differently.
Two things we’d change if we started again.
Notifications
Notifications were built into each action separately, so every new module repeated the same email logic, and the dispute auto-close rules ran as a check on page load. Today we’d add an event layer in phase one, with one worker handling email, auto-close and the audit trail.
TM-2026-XXXXXXLeasePilot record IDs, still carrying the old name
Brand values
The rename from Tenantmark to LeasePilot left a TM- prefix in record IDs, because brand values were hard-coded.
Stack and scope.
What it runs on. For your build, we work in whatever stack fits.
Web app
Next.jsReactServer Actions
Data and logins
SupabasePostgreSQLRow-level security
Payments
StripeSeat limits
Email and documents
ResendPDF export
Planning a product with more than one kind of user? Start with the data model.