Most of the effort in automating revenue recognition does not go where people expect. Spreading a fee across a term is arithmetic, and the benchmark below shows several general-purpose AI agents doing it about as well as we do. The harder problem is getting the contract terms off the page accurately enough that the arithmetic is worth running. A billing cadence that comes back empty, or a cancellation clause on page four that nobody picked up, produces a schedule that is wrong and gives no sign of it.
We wanted numbers on that rather than an opinion, so we built a portfolio where every correct answer was known ahead of time and measured three things a finance team has to sign off on.
The portfolio
The corpus is 37 order forms, 18 master agreements and 10 amendments, covering 16 customers across eight European jurisdictions. It includes the things that make contract extraction awkward in practice: terms that start mid-month, a single combined fee that has to be split across performance obligations, order-level discounts, early terminations, metered usage lines, renewals that consolidate two or three expiring agreements, and one services line that is bundled into the subscription in one contract and severable in its twin.
The answer key was computed before the documents existed. We wrote the commercial terms first, derived the expected schedule from them, and rendered the PDFs from that ground truth, so nobody read a contract and typed in what it ought to produce. Across the portfolio that comes to $12,658,554 of recognizable revenue in 1,107 monthly entries.
Results
| System | Overall | Contract extraction | Revenue scheduling | Renewal reconciliation |
|---|---|---|---|---|
| Cadel · High | 96.2% | 98.1% | 95.7% | 95.8% |
| Claude Code · Sonnet 5 | 93.8% | 82.0% | 95.7% | 100.0% |
| Codex · GPT-5.6-sol | 93.7% | 84.1% | 96.7% | 94.1% |
| Claude Code · Opus 5 | 93.0% | 84.1% | 95.7% | 94.1% |
| Cadel · Medium | 88.1% | 97.5% | 80.9% | 100.0% |
| Codex · GPT-5.6-luna | 87.3% | 84.1% | 86.4% | 93.3% |
Contract extraction covers what the schedule is built from: term dates, quantities, rates, billing cadence, and the termination or cancellation clauses that change when revenue stops. Revenue scheduling is the recognition itself, measured on whether each dollar landed in the right period against the right performance obligation. Renewal reconciliation is contract succession: whether an arriving renewal was tied to the agreements it replaces and those agreements closed out.
The three columns behave differently, and the summary score hides that.
On the revenue schedule the leading systems are close together. Cadel · High, both Claude Code arms and Codex sol all land between 95.7% and 96.7%, with one of them slightly ahead of us. Given accurate inputs, spreading a fee over a term is tractable and several systems handle it well. Our own Medium tier does worse here, which is most of why it sits lower in the table.
Contract extraction is where the systems separate. The general-purpose agents scored 82% to 84%. Cadel · High scored 98.1%. That difference accounts for essentially all of the gap in the overall column.
Why the difference
An agent reading a contract without a brief does something reasonable: it finds what looks important. Cadel reads against a specification instead, which is a narrower and duller task. The fields are fixed by what ASC 606 needs, each one is validated before anything downstream consumes it, and a value that fails validation stops the contract rather than flowing into a schedule. Most of the misses we see in the agent output are individually small. A cadence left blank, a termination date that was on the page but not picked up. They become large once a schedule is built on them.
Everything after the reading step is deterministic. The model reports what the contract says and an ASC 606 engine produces every figure from there, so identical inputs give an identical schedule and the arithmetic can be audited line by line. The model is never asked what to book.
The alternative approach has a cost, and it shows up clearly in the strongest agent we tested. Claude Code · Sonnet 5 reached 93.8% overall. To get there it spent 4.6 times what a Cadel run costs and took 1.8 times as long, because it works through every contract, line and month itself rather than handing that to an engine. Its contract extraction still came in at 82%.
There is also the question of what happens when something is wrong. Cadel raises the contract, names the discrepancy and the amount, and routes it to a reviewer instead of posting it. Nothing in a general-purpose agent's output distinguishes the contracts it got right from the ones it did not.
How we measured
- Data: 37 order forms, 18 master agreements and 10 amendments, covering 16 customers across eight European jurisdictions. $12,658,554 of recognizable revenue in 1,107 monthly entries. The corpus is synthetic, with a fictional vendor. That is deliberate, because a benchmark built on real customer contracts cannot be published, cannot be re-run by a sceptical reader, and cannot be shown to be free of answers that leaked into a model's training data. This one regenerates from seed and its answer key is recomputed against the documents on every run. This is not a synthetic-only result: the same workflow runs in production on real customer contracts.
- The same inputs for everyone. Every system received the same PDFs and the same product catalogue, with no pre-parsing for anyone. Each was run over the identical portfolio with caching disabled and document contents varied so that nothing could be served from a previous run.
- One scorer for every system. The overall column weights revenue scheduling at 0.60, contract extraction at 0.20 and renewal reconciliation at 0.20, computed against the answer key that produced the documents.
- We report the mean. Reported scores are means across runs.