Somerset West, Western Cape, South Africa

Case Study · Our Own Product · Fintech Platform

PropWise

Drop an FNB bank statement PDF and every transaction is parsed, classified against 76 SA-specific property categories, allocated to the right property, and charted, across trusts, companies and personal names. No AI API calls. No data leaves the server.

ClientInternal product
Status● In build ~75%
Running on5 properties · 2 entities · 193 real transactions
Engine11 parsers · 76 categories · self-checksumming
AudienceSA landlords, then agencies (white-label)

The bank statement import is the product

Landlords with units spread across trusts, companies and personal names reconcile FNB PDFs by hand, one line at a time, guessing which property each R99 bank fee belongs to. PropWise reads the PDF, classifies every line, allocates it, and validates its own output against the statement’s printed turnover totals as a checksum. Everything else on this page exists to make what comes out of that import useful.

📄 FNB PDF in11 regex parsers76-category classifierproperty allocation✓ checksum vs printed totals

Working Slice · The Classifier

Type a bank line. Watch a rule claim it.

These are seven real production rules, in real priority order: first match wins, and the amount-range rule only fires when no keyword hits. Try “Magtape Debit Sbsa Homel”, or an amount between 9000 and 9500 with no description.

#matchkeyword / rangecategory
1containsSbsa Homelbond_payment
2containsBody Corpbody_corp_levy
3containsMonthly Account Feebank_charges
4containsPrivate Propertyadvertising
5starts_withFNB App Paymentrental_income
6containsCashfocusagent_commission
7amount_rangeR9,000 – R9,500rental_income

The rules are user-configurable in Settings, so the parser learns each landlord’s recurring lines. Regex over AI on purpose: zero per-document cost, no rate limits, and no statement ever leaves the server.

Working Slice · Lease Health

The RAG dot every screen shares

Healthy90 days remaining

More than 60 days is green, 30 to 60 amber, under 30 or expired red, vacant grey. Map pins, property cards, kanban tiles and the tenant ribbon all read this one status.

Working Slice · Cashflow

Money as it moved, not as it was meant

Grouped by transaction date after advance rent payments made months show R0. Demo data; the production chart runs the same Recharts config on the real 193 transactions.

Why generic bookkeeping loses

It knows what a sectional title levy is

The entity tree

Organisation Family trustPersonal name Property · 80A Station RdProperty · Unit 12Property Tenant + lease

SA landlords hold property under trusts, companies, CCs and personal names, and SARS wants financials per entity. The hierarchy is the data model, not a report filter.

76 categories, tax flags included

rental_income body_corp_levy ✓ bond_interest ✓ municipal_rates ✓ agent_commission ✓ maintenance ✓ personal_drawing ✗

Every category carries a deductibility flag for IRP6 provisional tax. A levy is deductible; a personal drawing is not. Tax season becomes a filter, not a forensic project. ✓ marks deductible.

The Tour · Captures Landing Soon

One screen, one claim

SCREENSHOT: Statement review: every parsed line with its category badge
Statement review: every parsed line with its category badge

The signature screen

Drop a PDF, review a classified statement

The review dialog lists every parsed transaction with its auto-assigned colour-coded badge, inline overrides for category, property and tenant, and a summary bar checking total credits, debits and net against the statement itself.

SCREENSHOT: The dashboard: kanban, rent hero cards, cashflow, activity
The dashboard: kanban, rent hero cards, cashflow, activity

Ten seconds, whole portfolio

One screen answers the morning questions

How much rent is in, what is overdue, which leases are expiring: the tenant ribbon, portfolio kanban, hero stat cards and cashflow chart put the entire multi-entity portfolio on one dark screen, filterable by entity and period.

SCREENSHOT: Cashflow tooltip: income, expenses and net for the month
Cashflow tooltip: income, expenses and net for the month

Accurate to the rand

Hover any month, see the truth

Nov: income R 27 800, expenses R 10 908,97, net R 16 891,03. ZAR-formatted, transaction-date-grouped, and matching the bank because the parser checksums itself against the statement’s printed totals.

AI-native

Ask your portfolio a question

💬 “What did the trust spend on levies in Q1 2026?”
Claude · via the PropWise MCP connectorBody corporate levies for Q1 2026 across the trust’s two sectional title units: R 8 040 (Jan R 2 680, Feb R 2 680, Mar R 2 680), all flagged tax-deductible. Shall I export the supporting transactions?

The MCP API (code complete, pending deployment) exposes the portfolio to Claude with per-key permissions: query cashflow, list overdue rent, or log a plumbing expense against a property by talking. Demo conversation; figures fictional.

Design decisions

External AI classification APIsRegex rules engine

Zero per-document cost, no rate limits, no statement leaves the server. SA documents are predictable enough that regex wins.

Flat property listOrganisation → Entity → Property → Tenant

Trusts and companies need per-entity tax reporting. The hierarchy went into the data model.

Income / expense / other76 SA categories with tax flags

IRP6 needs deductible vs not. The category system carries the metadata.

Cashflow by rent periodCashflow by transaction date

Advance rent made paid months show R0. Charts now reflect bank movement, not accrual intent.

Edge Functions for CRUDPostgREST direct, Edge only for MCP

Faster, simpler, and the API layer stays reusable for the future mobile app.

Google MapsLeaflet + OpenStreetMap + Nominatim

Google charges per map load. Pins on free tiles do the job.

Next.js 15 · TypeScript · Tailwind v4 · shadcn/ui (23 components) · Supabase: Postgres + Auth + Storage + RLS · Zustand · TanStack Query · Recharts · Leaflet · pdf-parse · Geist

More screens

SCREENSHOT: Properties map: RAG lease markers across the Western Cape
Properties map: RAG lease markers across the Western Cape
SCREENSHOT: Properties cards with rent and status dots
Properties cards with rent and status dots
SCREENSHOT: Per-property financials: yield, transactions, mini cashflow
Per-property financials: yield, transactions, mini cashflow
SCREENSHOT: Expense breakdown donut with income toggle
Expense breakdown donut with income toggle
SCREENSHOT: Portfolio kanban: landlords, properties, tenants
Portfolio kanban: landlords, properties, tenants
SCREENSHOT: Document inbox: classified, matched, one click to file
Document inbox: classified, matched, one click to file
SCREENSHOT: Prospects: paste an enquiry, get a structured lead
Prospects: paste an enquiry, get a structured lead
SCREENSHOT: Login with the blue-to-emerald wordmark
Login with the blue-to-emerald wordmark
SCREENSHOT: Settings: MCP API keys for the Claude connector
Settings: MCP API keys for the Claude connector
193real transactions, 12 months
76categories with tax flags
11document parsers
5 + 2properties across entities
0AI API calls per document
R0per-statement processing cost

Built as a white-label commercial product for landlords and estate agents, not a personal tool. Every fix permanent and systemic; the FNB parser is sacred and working.

Still reconciling statements by hand? We build engines for that.