The challenge
A national retail chain held around 3,000 lease documents — master leases, amendments, supplementary agreements and renewals — and a large share of them were scans rather than native PDFs. The structured records meant to represent that portfolio were incomplete and inconsistent: rent, escalation, term, security deposit and renewal options were missing in some records and wrong in others. Everything downstream inherited those gaps. Rent schedules were re-keyed from summaries rather than derived from the agreements, expiry planning ran off dates nobody could trace back to a clause, and answering a question about the portfolio meant opening documents one at a time.
What we built
A pipeline that reads every agreement, classifies it as a master lease, an amendment or a renewal, links it to the store it belongs to, and maps it to the target schema field by field. Month-by-month rent schedules are computed from the lease terms themselves, with compound escalation and partial-month handling rather than a flat annual figure. Reviewers work in a split-screen view — the source document on one side, the extracted fields on the other — so a value is confirmed against the page it came from, and approved values are written back through the API.
The result
The portfolio becomes queryable rather than merely filed. Rent schedules derive from the agreements instead of re-keyed summaries, mismatches against the existing records surface field by field rather than as a vague sense that the data is unreliable, and anything a lease does not state is marked not stated rather than guessed. Every write-back carries an audit trail back to the document, the page and the reviewer who approved it.

