Griffin Trygg
Get in touch

Underwriting & ResearchCorridor Ventures

Underwriting

Reads any rent roll or T12 and builds the model. I built it so we could stop paying RedIQ per deal.

A figure on a tall ladder wringing a cloud of loose pages into a neat ledger below

Why I built it

Every property manager sends a different file. Yardi, RealPage, Entrata, AppFolio, ResMan, MRI, and plenty of Excel that somebody built by hand. A parser I wrote for one would break on the next, and paying a service per deal adds up fast when most of the deals you look at don't close. I wanted one tool that could take whatever showed up and give me a clean, firm-standard view I could trust.

What it does

  • Upload any rent roll or T12 (xlsx, xls, csv or pdf) and get a normalized, firm-standard view.
  • Automatic tie-outs against the file's own totals, both across rows and down columns.
  • Rent roll dashboard: occupancy, unit mix, loss to lease, renovation status, and two-file trade-out comparison.
  • T12/T6/T3/T1 builds, a GPR waterfall, and a firm-wide chart of accounts every statement maps into.
  • A valuation model (cap-rate pricing, hold-period cash flow, renovation schedule, IO-then-amortizing debt, IRR, equity multiple, DSCR) pre-filled from trailing actuals.
  • Deal sharing with outside co-sponsors at view or edit level, and fixed-format Excel exports.

How it works

Claude only answers questions about structure. Which column is market rent? Does GL 6410 Pest Control belong under Contract Services? It never gets asked anything whose answer is a number. Every dollar on screen was read from a specific cell and added up in Python.

The first time a file layout shows up, Claude maps it and I confirm the mapping. After that the layout is cached. The second Yardi rent roll costs nothing in API calls and parses the same way as the first.

I store what the file said, not the metrics. A parse keeps the unit rows and GL lines, and everything else gets computed when you open the deal. A metric I add tomorrow works on every deal already in the database.

Calls I made

If Claude is wrong, I get a mislabeled column, not a wrong NOI

That was the whole reason for splitting the work this way. The tie-out catches a bad label before anyone builds a model on top of it.

Adjustments sit next to the original

When I normalize taxes, insurance or a management fee, the trailing actual stays where it was. Both numbers show, with a note on who changed what and why.

Assumptions come pre-filled in blue

Vacancy, bad debt, concessions and management fee come straight from the T12. Overriding one means you decided to, instead of typing a guess into a blank cell.