The situation
Each month Stafford's accounting team builds consolidated reports for dozens of property entities by hand. They collect a trial balance for each entity, map every account to a cash-flow category, roll balances forward, and assemble the statements in Excel. It is repetitive, it takes skilled accountants' time, and one wrong cell can quietly throw off a whole report.
The actual problem
The request was
“Make the monthly close less manual and less error-prone.”
Discovery showed
The reports are rules applied to files the accountants already save. That is an automation problem, not an interpretation problem, so the numbers should come from deterministic code that checks itself, with a person approving anything a rule does not cover.
Automation is often a better fit than AI. Many industries moved past manual work straight to AI strategy without the automation step in between, even when the underlying problem is still a manual, repeatable process. Here AI belongs in building the system, not in the arithmetic.
What I learned
- Worked from the real accounting workflow, sample spreadsheets, business requirements, security rules, and the decisions Stafford has already made.
- Mapped the inputs and outputs: trial balances per entity per month, the prior-year rolling trial balance, the budget, and the chart of accounts with its cash-flow category table.
- Defined the accountant's controls: the tool computes a default, and she can override items such as Repair Reserve, Principal Payment, the account mapping, and opening balances, with the calculated value shown next to the override.
- Designed a parallel run: Stafford closes by hand, the tool runs the same month, and every line is compared.
How I framed it
Exhibit
How a Run Is Designed to Work
- 01
Upload
Property accounting files go in through a secure web portal
- 02
Check
Expected property and period confirmed, file scanned for malware, history recorded
- 03
Pin
Approved files and rules fixed to that run so inputs cannot change mid-run
- 04
Reconcile
A Python engine validates the data, applies approved rules, and produces the Excel outputs
- 05
Review
Anything no approved rule covers goes to an exception queue with file, worksheet, and cell evidence
- 06
Approve
An authorized person controls final approval and release
AI cannot invent a value, approve an accounting judgment, or release a package.
Exhibit
How the Build Is Controlled
- 01
Small phase
One scoped change at a time
- 02
Own branch
Each phase has its own branch and pull request
- 03
Automated tests
Interface, accounting engine, database rules, security controls, and the full workflow
- 04
Independent review
A second AI tool reviews the work and compares it with the source requirements
- 05
Explicit approval
Nothing is merged, deployed, or applied to the database without it
Exhibit
Where Things Stand
- 01
Accounting engine
- Status
- Built, in parallel-run validation
- Notes
- Reads the Excel files, validates, applies approved rules, runs the tie-outs, and produces the reports
- 02
Accountant overrides
- Status
- Built
- Notes
- The calculated default shows next to each override
- 03
Run button on the review site
- Status
- Next
- Notes
- So Stafford can run it without me
- 04
Secure upload portal, malware scan, MFA
- Status
- In build, production gated
- Notes
- Separate authorization, migration, deployment, and verification gates still apply
- 05
September parallel run
- Status
- Results pending
- Notes
- Every line compared against the manual close
| Status | Notes | |
|---|---|---|
| 01Accounting engine | Built, in parallel-run validation | Reads the Excel files, validates, applies approved rules, runs the tie-outs, and produces the reports |
| 02Accountant overrides | Built | The calculated default shows next to each override |
| 03Run button on the review site | Next | So Stafford can run it without me |
| 04Secure upload portal, malware scan, MFA | In build, production gated | Separate authorization, migration, deployment, and verification gates still apply |
| 05September parallel run | Results pending | Every line compared against the manual close |
What we built
- 01A deterministic Python engine that reads the Excel trial balances, validates the data, applies approved rules, and produces the balance sheet, the month and year-to-date cash flows, and the rolling trial balance.
- 02Four tie-outs on every run, with failures that point to the entity, the statement, and the amount.
- 03A review path: a new account missing from the chart is parked on a review line, missing trial balances are listed, and anything unresolved stops the run or goes to a person.
- 04Accountant-controlled overrides, with the calculated value shown next to each one.
- 05Automated tests for the interface, the accounting engine, the database rules, the security controls, and the complete workflow.
- 06The stack: Next.js, React, and TypeScript for the portal; Supabase for the database, authentication with authenticator-app MFA, and file storage; Vercel for hosting; Python for the engine; and AWS services for file scanning and restricted processing.
My role
- Product
- Owned the requirements, the scope, the accounting-policy boundaries, and every approval decision.
- Build
- Directed AI coding tools: v0 for the first interface, Codex for much of the detailed engineering and testing, and Claude Code and GitHub Copilot for handoffs and independent code review.
- Controls
- Required a branch, a pull request, automated tests, review, and explicit approval for every phase.
- Validation
- Designed the parallel run against Stafford's manual close.
The outcome
- Not yet measured. The parallel run on the September close is the proof point, and the results will be added here.
- What is already true: the tool checks itself on every run, flags anything unusual instead of guessing, and keeps the accountant in control of the judgment calls.
What I'd do differently
I use AI more like a technical team than a chatbot: it challenges the work, finds gaps, and tests failure conditions, while I keep the requirements, the accounting-policy boundaries, and the approvals. And I do not treat passing tests or completed code as proof that something is live.