Verdant Ledger
A developer paying 18 contractors out of monthly construction-loan draws was finding cap overages after the money had already gone out.
- Client
- Residential developer, renovation and small multifamily
- Year
- 2026
- Duration
- 12 weeks + 30-day hypercare
- Team
- 2 engineers, 1 designer, 1 PM
- Role
- Product, design & engineering
- Type
- Systems
- Approach
- Microsoft Graph · Azure Document Intelligence · LLM orchestration · Dropbox

Month-end invoice queue. Projects, vendors and amounts are placeholders.
Starting point
The client runs a handful of renovation and small multifamily projects at a time, funded by construction loans that draw monthly. Contractors email invoices to a shared inbox, or to whichever project manager they last spoke to. The budget lived in a Dropbox spreadsheet per project. Building the month-end draw package took a PM about two days, and a contractor going past their signed maximum usually showed up after the payment.
How an invoice moves
Microsoft 365 mailboxes are read through Graph, deduplicated by message ID, and archived untouched. Azure Document Intelligence pulls fields from invoices and insurance certificates. An LLM then classifies each invoice by project, unit and category (operating, capital or CAM), splits multi-project invoices, and writes a short plain-English summary that the approver sees marked as a draft. It also stitches together email threads across mailboxes, so an invoice can be matched to the bid it's billing against, like "Option B" from a thread three weeks earlier.

Pipeline as delivered: intake, extraction, AI reasoning and checks, human approval, system of record.
Checks before a person sees it
Every invoice runs through 11 checks: cumulative spend against the contract cap, a warning at 90%, duplicates, insurance certificate present and current, W-9 on file, price against the bid, statement-versus-invoice mismatches, missing fields, and any change to a vendor's bank details, which always escalates. Invoices that only link to a payment portal can't be read, so they're flagged for manual entry, not dropped.
What the AI can't do
Nothing is written until someone approves it. Invoices sit in a staging state machine (pending, flagged, approved, posted), and amounts over a set threshold need a second approver. Approval writes the line into the Dropbox budget tracker, files the PDF in the project folder, and adds an entry to an append-only audit log. The model sits behind an interface so it can be swapped without touching the checks.
Results after 90 days
91% of invoices are matched to their estimate automatically. The checks held 14 invoices that would have pushed a contractor past their signed maximum before any payment went out. Month-end draw prep is down from about two days to half a day. QuickBooks write-back was scoped out of v1 and is planned for phase 3.
Scope
- Microsoft 365 intake via Graph, shared inbox plus PM mailboxes
- Invoice and insurance-certificate extraction with Azure Document Intelligence
- LLM classification, thread matching and summaries behind a confidence gate
- 11 validation checks, including bank-detail change detection
- Approver dashboard, change-order logging and second-approver threshold
- Dropbox budget-tracker write-back, PDF filing and expiry reminders
- Append-only audit log and 30 days of post-launch support