Contract review for revenue and lease audit
LLM extracts and tests key terms against accounting treatment across full contract population, using tools like Trullion or Kira.
Finance processPlanBudgetInvoiceCollectPayCloseReportAudit
By Don, DoneThat’s AI coach · updated
What a complete finding looks like
A usable contract-review finding names the clause, names the booked treatment, and states whether they agree. If the clause is not in the contract, the field stays empty. The model does not invent a renewal option, a termination fee, or a performance obligation so the row looks complete.
The output is evidence for the accountant, not a posted entry. Contract-reading tools (Trullion, Kira, and similar) and the systems that hold lease or revenue books (Workday, SAP, and similar) can sit in the same workflow. None of them replace the person who owns the ASC 606 or ASC 842 conclusion.
A complete finding typically carries:
- Contract identifier and executed version date
- Term extracted, or an explicit blank
- Pin cite: section, exhibit, or amendment
- Booked treatment from the subledger or lease/revenue module
- Result: agree, exception, or insufficient evidence
- Accountant disposition: accept, adjust, or follow up
Empty is a valid result. A blank renewal field is stronger support than a guessed option that makes the lease term match the books.
Extract the clause, or leave the field empty
Population testing for revenue and lease audit means every in-scope contract gets the same term list. Typical extracts include commencement, term, renewal and termination options, payment schedule, variable consideration, distinct performance obligations, residual value guarantees, lease versus non-lease components, and modification language.
Each extract needs a cite the reviewer can open without searching the PDF again. "Section 4.2 of the 12 March 2024 master services agreement" is a cite. "Looks like a two-year term" is not.
When the clause is missing, do not flag a mismatch against a term the contract never stated. Record that the term is not present, and stop. Filling a renewal option so the extracted lease term matches the booked right-of-use asset is a control failure that looks like completeness.
Practical extraction rules:
- Read the executed agreement plus in-scope amendments only.
- Quote or tightly paraphrase the operative sentence.
- Record exhibit and amendment order when later paper overrides earlier paper.
- If two clauses conflict, extract both with cites and mark the conflict unresolved. Do not pick a winner.
- Leave the field empty if neither the base contract nor the amendments contain the term.
Keep the clause column separate from the books column. Trullion, Kira, and similar products help read contracts at population scale. Workday, SAP, and similar products store what was booked. Use each as a source for its own column. Do not treat either column as GAAP.
This extract is the input to later measurement work, including a lease accounting agent that proposes lease measurement and an ASC 606 revenue recognition split that allocates transaction price. A missing cite produces a measurement you cannot defend.
Test extracted terms against booked treatment
Once the clause is cited, compare it to how the contract was booked. Pull commencement, term, payments, classification, and component split from the lease or revenue subledger. Compare field by field.
Agree means the booked field is supported by the cited clause. Exception means the booked field contradicts the cited clause. Insufficient evidence means the clause is blank, or the booked field cannot be traced to a system report.
Do not convert a blank extract into an exception against a term you invented. If the contract is silent on a renewal option, the question is whether the booked lease term assumed one anyway. That finding is "books include a renewal not found in the agreement." Support is the empty extract plus the booked term field, not a fabricated option.
Walk the comparison in this order:
- Identity: right contract, right legal entity, right modification set.
- Dates and term: commencement, end date, renewals, terminations.
- Cash: fixed, in-substance fixed, variable, incentives.
- Units of account: lease components versus services, and performance obligations.
- Classification and method, if those fields are in scope: operating versus finance, over time versus point in time.
Keep the two sources visible in the workpaper so a reviewer can see which system said what. Mixing them into a single "AI result" column is how cites disappear.
One warehouse lease, from clause to exception
A warehouse lease is booked with a ten-year term. The right-of-use asset includes a renewal. The executed lease, Section 2.1, states a five-year initial term. Section 2.3 grants a five-year renewal only if the tenant delivers written notice 180 days before expiry. The document set has no notice.
Correct extract: initial term five years, citing Section 2.1; renewal option exists and is conditional, citing Section 2.3; "notice exercised" stays empty because notice is not in the file. Correct comparison: the booked ten-year term is not supported by an exercised renewal. Finding: exception on lease term, citing Sections 2.1 and 2.3, and citing the subledger term field.
The accountant then decides whether reasonably certain exercise can still be supported by evidence outside the contract, such as significant leasehold improvements or a documented intent memo. The model does not decide that, and it does not post a remeasurement.
Three wrong turns on the same facts. The model writes "renewal exercised" because the books show ten years, then flags nothing (circular). The model invents "automatic renewal" because many warehouse leases renew (fabrication). The model posts a right-of-use adjustment into Workday or SAP (treating the finding as posted).
The same comparison logic applies to revenue contracts: extract the fee table and acceptance language with cites, compare to the booked performance-obligation split, and leave the accountant to apply the distinct-goods-or-services test. Measurement detail belongs with the ASC 606 revenue recognition split, not in the extract row.
Failure modes that look like progress
Flagging without a clause. A dashboard of exceptions with no pin cite cannot be reviewed. If the model cannot point to a section, it has not extracted a term. Route those rows to insufficient evidence, not to exception.
Treating the finding as posted. A match-and-exception table is a workpaper. Until an accountant signs the disposition and someone with posting rights books it, the subledger is unchanged. Closing with open findings that live only in the review tool produces a file that looks finished and a general ledger that is not.
Inventing a renewal option. Completeness pressure is the usual cause. The term list includes renewal, the contract is silent, and the model fills "one five-year option, reasonably certain." That sentence mixes a fact that is not in the agreement with an accounting conclusion. Split the work: facts from the contract (blank or cited), judgments from the accountant.
Watch also for amendments merged in the wrong order, a draft tested instead of the executed copy, and a match on customer name when two legal entities share a parent.
A workpaper review LLM can check that every exception has a cite, a booked field, and a disposition. It cannot supply a missing clause. Once the procedure is stable, describe it in SOX control narrative drafting. The narrative is not a substitute for the test.
Who posts the adjustment, and what stays in the file
Accounting owns the adjustment. The reviewer, or the model, prepares the exception. The lease or revenue accountant decides measurement, including reasonably certain renewal, distinct performance obligations, and the variable consideration constraint. Someone with posting access books the entry. The workpaper keeps the cite, the booked values before and after, and the name of the person who disposed the row.
Keep in the file:
- Population definition and contract versions tested
- Extract table with cites and blanks preserved
- Booked-treatment extract from the subledger
- Exception list with dispositions
- Evidence that blank fields were not overwritten
Do not file as support: unsourced model commentary, a vendor confidence score without the clause, or a "corrected" term the accountant never adopted.
The job is finished when every in-scope contract has either a cited term or an explicit blank, every booked field in scope has been compared, and every exception has an accountant disposition. Reading the full population is the point. Filling empty cells so the grid looks complete is not.
Is this worth automating for you?
Whether this pays back depends on how much time it takes your team today. Most teams estimate that from memory, and the estimate is usually wrong in one direction or the other.
DoneThat reconstructs where the time actually went, with no timers to forget, so you can measure the baseline before committing to a project and check the gain afterward.
Measure the baseline first