← All work

Vertical SaaSLive

Deedstead

Leasing, maintenance, accounting and bank reconciliation for owners whose properties sit in separate LLCs — with the rules that protect financial history enforced by the database, not by application code.

Scope
Product design, Data model, Full-stack build, Operations
Stack
Next.js, TypeScript, PostgreSQL
Deedstead — home page of the live product

The problem

Small multi-LLC portfolios fall between tools: too complex for spreadsheets, too small for enterprise property software. Their books also have to stand up per entity, which means history must not be editable after the fact — by a bug, a script or a well-meaning admin.

What we built

  • Leasing, tenants, maintenance and vendor bills per property and per LLC
  • Double-entry ledger with journal entries, reversals and period close
  • Bank statement import and reconciliation bound to its evidence
  • Append-only audit trail and a live pilot portfolio managed from the same screens

Engineering notes

Rules live where the data lives

Updating or deleting a posted journal entry, adding a line to it later, or committing an entry whose debits do not equal its credits is refused by PostgreSQL itself. The guarantee holds whether the write comes from the interface, a script or a console.

Corrections the way an accountant makes them

Mistakes are fixed with a reversing entry that leaves both records visible. Audit rows reject updates and deletes at the trigger level, underneath the application.

Closing the books actually closes them

After a period closes, writes dated on or before it are rejected. Reopening is possible, requires a reason and leaves an append-only record of who did it. A completed reconciliation locks the statement and every ledger line it was proved against.

By the numbers

116
database guards
86
distinct refusals
6
bank statement formats
165
tests passing

As published on deedstead.com