Somerset West, Western Cape, South Africa

Property management, simplified.

A white-label platform that turns South African landlords’ bank statements, municipal bills and leases into clean books, tax-ready reports and a live view of every lease.

Visit letto.co.za Now in beta

The Letto dashboard: landlords, properties and the month’s income at a glance
Role
Product design, UX and full-stack build
Timeline
December 2025 to present
Platform
Responsive web app, white-label ready
Status
Live in beta at letto.co.za
Built with
Next.js 16, TypeScript, Supabase, Postgres with RLS, Tailwind v4, shadcn/ui, Zustand, Recharts, Leaflet, MCP, Vercel

Property admin that runs itself.

Letto is a property management platform for South African landlords and letting agencies. It reads bank statements, bills and leases, books every rand to the right property, and turns it all into live dashboards and tax-ready reports.

The problem
Landlords run their portfolios across bank PDFs, municipal bills, levy statements, spreadsheets and WhatsApp threads. Getting it ready for tax time is manual, slow and easy to get wrong.
What we built
A complete SaaS platform: a smart document inbox, bank statement import with a rules engine that learns, lease tracking, multi-entity books, reports, white-labelling and an AI-ready MCP server.
What we delivered
End to end. Product strategy, branding, UX and UI design, data architecture and the full-stack build, from first sketch to a live product.

A landlord’s books live in six different places.

Every month the same paperwork arrives from different directions. None of it talks to each other, and all of it has to line up when the tax year closes.

  1. Bank statementsPDFs from FNB, Standard Bank, ABSA and Nedbank
  2. Municipal billsWater, electricity, refuse and rates
  3. Body corporate leviesMonthly and special levies per scheme
  4. Bond statementsInstalments and outstanding balances
  5. Leases and depositsTerms, escalations and deposit rules
  6. Spreadsheets and chatsNotes, receipts and WhatsApp threads

One source of truth.

  • Rent paid, due and overdue from one record
  • Every transaction allocated to a property
  • Reports built from the same numbers
  • Each entity keeps its own books

Built for South African rules: ZAR formatting, Rental Housing Act deposits, IRP6 categories, POPIA, body corporate levies and the big four bank formats.

Everything a landlord needs, in one place.

Sixteen features built around the real admin of running rental property in South Africa, from the first bank statement to the tax return.

Smart document inbox
Drop any PDF. It is read, classified, matched to a property and filed.
Bank statement import
FNB, Standard Bank, ABSA and Nedbank statements parsed line by line.
Rules engine that learns
Five match types, and every manual fix can become a rule.
Split allocations
One payment shared across properties, tenants and leases.
Lease tracking
Terms, deposits, escalations and expiry alerts in one place.
Portfolio map
Every property on a map, colour-coded by lease health.
Rent status
Paid, due and overdue from a single record, always in sync.
Multi-entity books
Trusts, companies and personal holdings kept separate.
Reports and exports
Profit per property, category breakdowns, CSV and PDF.
Tax-ready categories
Grouped for IRP6, with tax-deductible flags per category.
Accountant access
Invite by role, with read and export rights only.
Maintenance requests
Log, assign and track repairs per property.
White-label branding
Logo, brand colours and a custom domain per organisation.
Agency tier
Agents only see the landlords assigned to them.
AI-ready MCP server
38 secure tools so Claude can work with the portfolio.
Activity log
Every change recorded, so nothing goes missing.

Also: dark and light mode, fully responsive, ZAR and South African date formats, row-level security on every table, Rental Housing Act deposit rules.

Bank statements in. Categorised books out.

Upload a statement from any of the big four banks. Letto parses every line, then a priority-ordered rules engine sorts it into a category. Correct one transaction and Letto offers to turn the fix into a rule.

Raw statement lineMatched ruleCategory
#Monthly Account Feecontains "#Monthly Account Fee"Bank charges
Magtape Debit Sbsa Homelcontains "Sbsa Homel"Bond payment
Body Corp Levycontains "Body Corp"Body corporate
Payshap Creditcontains "Payshap Credit"Rental income
Private Property Licontains "Private Property"Advertising
POS Purchasecontains "POS Purchase"Other expense
Five match types
Contains, starts with, exact, regex and amount range. Rules run in priority order and the first match wins. A rule can also auto-allocate to a property or tenant.
Big four bank formats
FNB, Standard Bank, ABSA and Nedbank. Each bank has its own parser tuned to its statement layout, and duplicate transactions are flagged on import.
Learns from corrections
Recategorise a transaction by hand and Letto offers to create a rule, so the same line is classified automatically next month.

Every lease, colour-coded at a glance.

The dashboard pairs headline numbers with a map of the portfolio. Each property pin carries a traffic-light status, so expiring leases and vacancies stand out before they cost money.

  • GreenMore than 60 days left on the lease
  • Amber30 to 60 days left, time to renew
  • RedUnder 30 days or already expired
  • GreyVacant, or no active lease
Letto properties page: filters by lease status and a map with colour-coded property pins
On the dashboard: income, expenses and net, the portfolio map, lease status, recent transactions and the activity feed.

Year-end, without the shoebox.

Reports come straight from the allocated ledger: income against expenses, profit per property and spend by category, grouped the way a South African tax return asks for it. The accountant can be invited straight in.

Income vs expenses
Monthly, by entity or portfolio
Per-property profit and loss
Income, bond, levies, net and yield
Category breakdown
Where the money actually goes
IRP6 categories
Grouped for provisional tax
Tenant payment history
Paid, late and missed months
CSV, PDF and accountant pack
One click exports
Letto reports page: total income, expenses and net profit with a grid of report types

Accountant access

Invite by email with a role. Invites expire after seven days, and an accountant gets read and export rights by default.

RoleEditDeleteInviteExport
OwnerYesYesYesYes
Accountant (invited)NoNoNoYes

Built for how South Africans actually own property.

Properties sit in trusts, companies and personal names, each with its own bank account and tax number. Agencies want all of it under their own brand. Both live in the data model, not bolted on later.

Trust
Trustees, registration and tax numbers, and its own bank account.
Company
Directors, members, VAT and registration numbers on record.
Personal and co-owned
Properties in a personal name, with co-owners where they apply.
Switching
Move between one entity and the whole portfolio from the sidebar. Every number filters with it.

White-label, per organisation

Logo, custom domain, plan and trial, and brand colours stored per organisation.

  • Primary #0F172A
  • Secondary #3B82F6
  • Accent #10B981

Agency tier: agents only see the landlords assigned to them, enforced in the database with row-level security.

Letto settings page with profile fields and the danger zone

A real backend, not a spreadsheet with a skin.

Next.js on Vercel in front, Supabase behind it. Every table is locked to its organisation with row-level security, and money has one source of truth.

Frontend

  • Next.js 16, App Router
  • TypeScript
  • shadcn/ui and Tailwind v4
  • Zustand and TanStack Query
  • Recharts and Leaflet

Hosting

  • Vercel
  • Server routes
  • Deployed from GitHub

Supabase

  • Postgres with RLS
  • Auth and invitations
  • Storage buckets
  • Edge Functions

AI layer

  • MCP server
  • 38 scoped tools
  • Audit log
One source of truth for rent
Paid, due and overdue come from the rent payment record, never from calendar maths.
Allocations win
A transaction split across properties reports by its allocations, not the raw bank line.
Database safety nets
Triggers fill rent periods automatically, so a missed field cannot break the dashboard.
Categories live in data
Every category is a database row per organisation. Nothing is hard-coded.

Fintech calm, with South African detail.

A dark-first theme with a light mode, built on shadcn/ui and Tailwind v4 tokens. Colour always carries meaning: blue for action, green for money in, red for money out and risk, amber for attention.

A house with a keyhole: the key to letting, in one simple shape. The lowercase wordmark keeps it friendly next to the dense, number-heavy screens.

Surfaces and text

  • Background #0A0F1C
  • Sidebar #0D1321
  • Card #111827
  • Raised #1E293B
  • Text primary #F1F5F9
  • Text secondary #94A3B8
  • Text muted #64748B

Meaning

  • Blue, action #3B82F6
  • Green, income and healthy #10B981
  • Red, expense and risk #EF4444
  • Amber, attention #F59E0B
  • Purple, data and AI #8B5CF6
  • Brand gradient #3B82F6 to #10B981

Type

Geist SansInterface and headings. Light, Regular, Medium, SemiBold, Bold.

R48,600.00Geist Mono for figures, dates and codes.

Transaction categories

Rental incomeDeposit receivedBond paymentBody corporateBank chargesInterest chargedAdvertisingAccounting feesMaintenanceInsuranceUtilitiesTransfer inTransfer outUnknown

Every category is a database row with its own colour, icon and tax flag, so organisations can extend the list.

Designed and built end to end.

We run every build through WAID, our own project platform, with an AI-assisted pipeline: Claude plans each change and handles the database, Claude Code builds it, and a person signs off before anything ships.

  1. Ticket on WAIDOne change per ticket, with its build brief
  2. Plan and databaseClaude plans and runs tracked migrations
  3. BuildClaude Code works through the Todo column
  4. ReviewA person signs off every change
  5. ShipMerged and deployed on Vercel

From beta to a paid product.

Letto is free while in beta. The planned tiers price by unit count, so the cost grows with the portfolio rather than with features.

  • Starter

    R99/month

    1 to 5 units. For a landlord with a flat or two.

  • Growth

    R199/month

    6 to 20 units. For a growing portfolio across entities.

  • Portfolio

    R299/month

    21 to 50 units. For serious portfolios and small agencies.

Lease agreements from Word templates
Merge fields and a signature pad
Duplicate payment detection
Cancel, merge or add new on import
Agency tier
Agent invitations, client assignment and agent views
MCP phase 2
Document ingestion, bulk invoice allocation, contracts and statements

Designed and developed by Dezignza

Branding, product design and full-stack development, from the database to the last pixel.

Visit letto.co.za Start a projectBack to portfolio