React · Financial modeling
Backlog and Percentage-of-Completion Forecast
A driver-based forecast for a project business recognizing revenue over time: bookings, completion rate, cost-to-complete drift, and margin feed a quarterly backlog roll-forward, with scenarios and a two-way sensitivity grid. The arithmetic runs in the browser, so the model can be interrogated rather than read.
- Scenario switching
- Two-way sensitivity
- Backlog roll-forward
What it demonstrates
- Revenue as an output, not an input
- Nothing here forecasts revenue directly. Bookings enter backlog, a completion rate converts open backlog, and revenue falls out of the conversion. That is what percentage-of-completion recognition does at portfolio level, and it is why changing a driver changes the shape of the forecast rather than just its level.
- A roll-forward that ties
- Each quarter opens where the last one closed, and opening plus bookings less revenue recognized equals closing on every column. It is the structure a reviewer can foot, which is the point of showing it as a schedule rather than a chart.
- Cost drift lands on margin, not revenue
- An increase in estimated cost at completion cannot change a contract's price, so it compresses margin on everything still open. The model separates margin at completion from realized margin and shows the gap the drift opens between them.
- Scenarios move drivers together
- Base, upside, and downside set all four drivers at once, and the downside deliberately pairs weaker bookings with cost overruns rather than flexing each driver symmetrically, because on a project book those arrive together.
- The ratios the business is run on
- Book-to-bill and backlog coverage in quarters are derived alongside the schedule, because neither is readable off a roll-forward at a glance and both are what a project business is actually steered by.
- Stated simplifications
- One portfolio completion rate stands in for per-contract cost-to-cost percentages, and the model says so on screen rather than leaving a reader to infer it. Modeling each contract's own estimate at completion would be more faithful without changing the shape of the answer.
Interactive
The model
Drivers
new orders per quarter
% of open backlog / qtr
% over estimate
% before drift
- Book-to-bill
- 1.12x
- Backlog coverage
- 6.9 qtrs
Opening backlog $42.0M. A single portfolio completion rate stands in for per-contract cost-to-cost percentages, which is the usual simplification at this altitude.
FY27 revenue
$30.1M
↑ 11.9% vs FY26
Realized margin
29.8%
1.2 pts lost to drift
Closing backlog
$52.2M
from $42.0M opening
Backlog roll-forward · $ thousands
| Line | FY26 Q1 | FY26 Q2 | FY26 Q3 | FY26 Q4 | FY27 Q1 | FY27 Q2 | FY27 Q3 | FY27 Q4 |
|---|---|---|---|---|---|---|---|---|
| Opening backlog | 42,000 | 44,100 | 45,885 | 47,402 | 48,692 | 49,788 | 50,720 | 51,512 |
| + Bookings | 8,400 | 8,400 | 8,400 | 8,400 | 8,400 | 8,400 | 8,400 | 8,400 |
| − Revenue recognized | (6,300) | (6,615) | (6,883) | (7,110) | (7,304) | (7,468) | (7,608) | (7,727) |
| Closing backlog | 44,100 | 45,885 | 47,402 | 48,692 | 49,788 | 50,720 | 51,512 | 52,185 |
| Revenue | 6,300 | 6,615 | 6,883 | 7,110 | 7,304 | 7,468 | 7,608 | 7,727 |
| − Cost of revenue | (4,425) | (4,647) | (4,835) | (4,994) | (5,130) | (5,246) | (5,344) | (5,427) |
| Gross profit | 1,875 | 1,968 | 2,048 | 2,116 | 2,173 | 2,222 | 2,264 | 2,299 |
| Realized margin | 29.8% | 29.8% | 29.8% | 29.8% | 29.8% | 29.8% | 29.8% | 29.8% |
Sensitivity · two-year gross profit, completion against cost drift
| Cmpl ╲ Drift | 0.0% | 0.8% | 1.8% | 2.8% | 3.8% |
|---|---|---|---|---|---|
| 11.0% | $14.4M | $14.1M | $13.8M | $13.5M | $13.2M |
| 13.0% | $16.1M | $15.8M | $15.5M | $15.1M | $14.8M |
| 15.0% | $17.7M | $17.4M | $17.0M | $16.6M | $16.2M |
| 17.0% | $19.1M | $18.7M | $18.3M | $17.9M | $17.4M |
| 19.0% | $20.3M | $19.9M | $19.5M | $19.0M | $18.6M |
The centre cell is the live case. Reading across a row shows why drift is the driver worth watching: cost over estimate lands entirely on margin, so it moves gross profit without moving revenue at all.