Neil McKay

Independent · 2019–present · Operations tooling and AI

Running a property portfolio like a product

For the last several years I've been the operator of a family real estate portfolio: about twenty properties across California and Switzerland, held through several LLCs and trusts, run day to day by four property management companies. I treated it as a design problem, then built the system to run it, with Claude doing much of the heavy lifting.

Role
Operator, designer and builder
Users
Family owners with mixed financial backgrounds; me as operator; property managers; attorneys, accountants and brokers
Scale
About 20 properties, 2 countries, 4 management companies, roughly 16,000 documents
Tools
Python, SQLite, spreadsheets, Claude (Cowork, custom skills, an MCP server)

The problem

Every month, four management companies sent reports in four formats: scanned PDFs, spreadsheets, text PDFs and email. Maintenance history lived in invoices and inspection reports scattered across years of folders. Owners were asked to make six-figure decisions from long email threads.

Four scanned Polaroids from 1996 of a seismic retrofit: new steel beams and posts under a two-storey apartment building, with handwritten labels
A typical record: 1996 Polaroids of a seismic retrofit, scanned into a folder. Address removed.

Nobody, including me, could quickly answer simple questions: how old is that roof, what did this building net last quarter, what did we decide last meeting and who's doing it?

Approach

I started where I would on any product: the people and the decisions they need to make. Owners need a few clear decisions a month, with the trade-offs laid out. The operator needs every source in one place, with problems surfacing on their own. Managers and advisors need clear, consistent requests.

Then I mapped how information actually flows, and built the smallest tool for each step, adding AI wherever it removed repetitive work.

From monthly manager reports to family decisions Sources4 managers, advisors Inbox + intakeroute, OCR, parse, flag Portfolio databaseone schema, every source Registersassets, P&L, data gaps Decision one-pagersoptions, costs, a clear ask Family meetingeach item: decision or update Outcomesin progress, resolved, open Actiontasks and follow-ups Claude assists at every step after the sources: intake, scanning records, drafting one-pagers and updates.

Key ideas

One inbox, many formats

Managers' reports go into a single inbox. Routing rules know which company covers which property. Scripts read scanned statements with OCR, parse spreadsheets and text PDFs, and load everything into one database. Each run ends with a short report: what came in, where it was filed, and anything that looks wrong, like rent showing past due that might be a real delinquency or just a timing artifact.

An asset register, ranked by risk

Every building system gets a record: what it is, when it was installed, its warranty, and the invoice or inspection that proves it. Where the record is missing, a data-gaps tracker says where to look, ranked by safety and insurance risk first.

Data gaps tracker: building systems grouped into safety and insurance risk, records to request from the manager, and items confirmed this month, each with what's missing, where to find it and a priority
The data gaps tracker, with properties and details changed. The real one covers every property and system.

Decisions, not spreadsheets

Owners don't get spreadsheets. They get one-pagers: a sale candidate, a keep-or-sell question, a heating system replacement. Each lays out the options and costs and ends with a clear ask. Meeting agendas label every item as a decision or an update, and an outcomes page records what happened to each one, so nothing quietly falls off the list.

A decision one-pager for a heating replacement: where things stand, two estimates with the cost per owner, and a boxed ask for the meeting
A decision one-pager. Property, figures and details changed.
Agenda itemTypeOutcome
Counteroffer on a property saleDecisionIn progress
Change of LLC managerUpdateResolved
Listing agreement for a second saleDecisionIn progress
Funding a heating system replacementDecisionStill open
The meeting pattern, with details generalized.

AI as a teammate, not the decider

Claude handles the work that used to eat my evenings: processing the monthly intake, scanning years of documents for maintenance records, drafting one-pagers, owner statements and the monthly update. I built custom skills for recurring jobs and an MCP server that connects my task manager, so follow-ups land where I'll act on them. People make the decisions; the system makes sure they have what they need.

Outcome

The monthly intake that used to mean opening dozens of PDFs is now one drop into an inbox and a report to read. Owners make decisions in a structured meeting with the facts in front of them, and every open item has a status and an owner.

Looking back

I rebuilt the database more than once as the questions changed. The lesson I'd take to any operations tool: settle the data model with the people who'll ask the questions before building screens, and design so someone other than the person who built it can run it.

This is the work I want to do for others now: tools for the people who keep complex physical operations running.