Skip to content
All work

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

Scenario

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

Closing backlog by quarter
26Q126Q226Q326Q427Q127Q227Q327Q4

Backlog roll-forward · $ thousands

Quarterly backlog roll-forward and margin schedule: opening backlog, bookings, revenue recognized, closing backlog, cost of revenue, gross profit, and realized margin for each of eight quarters.
LineFY26 Q1FY26 Q2FY26 Q3FY26 Q4FY27 Q1FY27 Q2FY27 Q3FY27 Q4
Opening backlog42,00044,10045,88547,40248,69249,78850,72051,512
+ Bookings8,4008,4008,4008,4008,4008,4008,4008,400
− Revenue recognized(6,300)(6,615)(6,883)(7,110)(7,304)(7,468)(7,608)(7,727)
Closing backlog44,10045,88547,40248,69249,78850,72051,51252,185
Revenue6,3006,6156,8837,1107,3047,4687,6087,727
− Cost of revenue(4,425)(4,647)(4,835)(4,994)(5,130)(5,246)(5,344)(5,427)
Gross profit1,8751,9682,0482,1162,1732,2222,2642,299
Realized margin29.8%29.8%29.8%29.8%29.8%29.8%29.8%29.8%

Sensitivity · two-year gross profit, completion against cost drift

Two-year gross profit at each combination of quarterly completion rate and cost-to-complete drift. The live case is highlighted.
Cmpl ╲ Drift0.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.