Workflow template for finance and accounting

Job cost review at completion

When a job closes, the controller gets one review that sets recorded labour, material, subcontract and overhead beside the estimate by cost code, shows each difference and what the job-cost records say about it, and lists the questions for the estimator and the job lead. Nothing is changed.

View this template on GitHub

Put this on your planBuild this in a sprint

Add it to a workflow in the Fully Powered Planner, beside the teams and roles that will run it. Book a fit call

The outcome

Every finished job gets an honest answer to one question: what did it really cost, against what we said it would? The review lines up the estimate, including the change orders that were approved, with every cost the job recorded, cost code by cost code and type by type. Each line shows the difference in money and as a percentage, and labour is split into extra or saved hours and a higher or lower rate, so the conversation starts from the right place.

Where a difference is big enough to matter, the review shows what the records themselves say: a pending change order on the line, and the notes written on the timesheets and invoices, quoted exactly. It never turns a note into a reason. The job lead says what happened on the job, and the estimator says what the estimate assumed.

The review is just as clear about what the records cannot show yet. A line with nothing recorded is never counted as a saving. A commitment not yet invoiced means the cost is not final, and the review shows what the job comes to if it is invoiced in full. Cost on a code the estimate never had, and cost with no code at all, are listed on their own rather than lost in a total. Everything ties back to the job-cost report.

The controller verifies the figures and approves the final cost. Nothing in the estimate, the rates or the cost records is changed, and the job is not closed by the review.

Who starts the work, and when

The controller of a job shop, contractor or project business starts it, or the operations lead or bookkeeper working for the controller, once a job's work is finished and its costs are posted. It runs before the controller signs off the job's final cost and before the estimator prices similar work again. It runs again, as a new version, when a late invoice arrives. The job lead, the estimator and the bookkeeper answer its questions.

What they supply

  • The estimate, as an export by cost code and cost type, with estimated hours on labour lines.
  • The job-cost export: every posted cost on the job, with its code, type, source, reference, hours on labour rows, amount and memo.
  • The change orders, each marked approved, pending or rejected.
  • The open commitments: purchase orders and subcontracts for the job, with the amount committed and the amount invoiced so far.
  • A short settings note: the job, its completion date, the currency, the control total from the job-cost report, the limits that decide which differences become questions, and who the job lead, the estimator and the records owner are.

Every export is read under stated default column headers. If one does not match, the work stops and asks which column is which.

What comes out

One review in a fixed order: the whole job by cost type, every compared line by cost code with labour split into hours and rate, the lines that could not be compared, the record flags (commitments not invoiced, late rows, pending and rejected change orders), numbered questions each addressed to a named role, and a tie-out that proves the figures add up. Empty sections say "None." The worked example uses an invented fabrication shop and shows the full inputs as well as the result.

An invented example

Illustrative example with invented data. The shop, the customer, the suppliers, the job and every figure below are made up for this page. They stand for a small steel fabrication and installation shop closing out one job in October 2026, and describe nothing that happened anywhere.

What the controller supplies

The estimate (default headers):

cost_code,description,cost_type,est_hours,est_cost
100,Shop drawings,labour,40,2400.00
200,Fabrication,labour,220,11000.00
200,Fabrication,material,,18500.00
300,Galvanizing,subcontract,,4200.00
400,Installation,labour,120,6600.00
400,Installation,material,,900.00
500,Crane,subcontract,,2800.00
900,Shop overhead,overhead,,6080.00

The job-cost export (default headers; a negative amount is a credit):

job,date,cost_code,cost_type,source,reference,vendor_or_employee,hours,amount,memo
J-2417,2026-09-08,100,labour,timesheet,TS-0908,Drafter 1,36,2160.00,
J-2417,2026-09-22,200,labour,timesheet,TS-0922,Shop crew,180,9000.00,
J-2417,2026-09-29,200,labour,timesheet,TS-0929,Shop crew,46,2300.00,rework beam connections after fit-up
J-2417,2026-09-30,200,labour,timesheet,TS-0930,Shop crew,36,2700.00,overtime to meet galv pickup
J-2417,2026-09-15,200,material,AP invoice,INV-5521,Supplier B,,17950.00,beams and columns per PO-3302
J-2417,2026-09-24,200,material,AP invoice,INV-5560,Supplier B,,2640.00,additional plate for revised stair landing
J-2417,2026-10-02,200,material,AP credit,CR-0117,Supplier B,,-210.00,return unused angle
J-2417,2026-10-06,300,subcontract,AP invoice,INV-7740,Supplier C,,3900.00,
J-2417,2026-10-13,400,labour,timesheet,TS-1013,Field crew,130,7150.00,
J-2417,2026-10-27,400,labour,timesheet,TS-1027,Field crew,12,660.00,return trip for punch list
J-2417,2026-10-14,400,material,AP invoice,INV-2290,Supplier F,,1020.00,
J-2417,2026-10-15,450,material,AP invoice,INV-2301,Supplier F,,385.00,field touch-up paint
J-2417,2026-10-16,,material,AP invoice,INV-8812,Supplier E,,240.00,freight
J-2417,2026-10-31,900,overhead,applied,OH-1031,,,7040.00,shop rate 16.00 per labour hour

The change orders (default headers):

change_order,cost_code,cost_type,hours,cost,status
CO-01,400,labour,16,880.00,approved
CO-01,400,material,,150.00,approved
CO-02,200,material,,1300.00,pending
CO-03,500,subcontract,,600.00,rejected

The open commitments (default headers):

commitment,vendor,cost_code,cost_type,committed,invoiced_to_date
PO-3302,Supplier B,200,material,17950.00,17950.00
PO-3310,Supplier C,300,subcontract,4200.00,3900.00
SC-0412,Supplier D,500,subcontract,2800.00,0.00

Settings: job J-2417, mezzanine and stair for Customer A (invented); completed 2026-10-31; amounts in the shop's own currency; files named "J-2417 estimate", "J-2417 cost detail to 2026-10-31", "J-2417 change orders" and "J-2417 open commitments"; control total from the job-cost report 56,935.00; limits 10 percent and 500.00. The job lead is the project manager who ran the job, the estimator priced it, and the bookkeeper owns the records. The review goes to the controller.

What comes out

JOB COST REVIEW AT COMPLETION: J-2417, mezzanine and stair for Customer A

For: the controller. Completed 2026-10-31. Amounts in the shop's own currency, to the cent; hours to two decimals. "Over" means recorded cost above the revised estimate; "under" means below. A line is asked about when its difference reaches both 10 percent and 500.00. A difference is a question, not a cause.
Files: estimate J-2417 estimate; job-cost export J-2417 cost detail to 2026-10-31, 14 rows; change orders J-2417 change orders; open commitments J-2417 open commitments.
Lines: 8 in the revised estimate. Compared: 7. Estimated, nothing recorded: 1. Recorded, not in the estimate: 1. Uncoded rows: 1. Lines over the limits: 3. Questions: 7. Rejected change orders not used: 1.

WHOLE JOB
Labour: estimate 20,000.00 + approved change orders 880.00 = 20,880.00 (396.00 h). Recorded 23,970.00 (440.00 h). 3,090.00 over, 14.8%.
Material: estimate 19,400.00 + approved change orders 150.00 = 19,550.00. Recorded 22,025.00. 2,475.00 over, 12.7%.
Subcontract: estimate 7,000.00 + approved change orders 0.00 = 7,000.00. Recorded 3,900.00. 3,100.00 under, 44.3%.
Overhead: estimate 6,080.00 + approved change orders 0.00 = 6,080.00. Recorded 7,040.00. 960.00 over, 15.8%.
Whole job: estimate 52,480.00 + approved change orders 1,030.00 = 53,510.00. Recorded 56,935.00. 3,425.00 over, 6.4%.
Open commitments not invoiced: 3,100.00 in 2 commitments. Recorded plus those commitments: 60,035.00, 6,525.00 over the revised estimate, 12.2%.
Pending change orders, not in any estimate figure above: 1,300.00 in 1.

BY COST CODE
100 Shop drawings, labour: revised estimate 2,400.00 (2,400.00 + 0.00); recorded 2,160.00. 240.00 under, 10.0%.
- Hours: revised 40.00 h, recorded 36.00 h. Hours part 240.00 under (4.00 h fewer at the estimate's 60.00). Rate part 0.00 (average recorded rate 60.00).
200 Fabrication, labour: revised estimate 11,000.00 (11,000.00 + 0.00); recorded 14,000.00. 3,000.00 over, 27.3%. Over the limits.
- Hours: revised 220.00 h, recorded 262.00 h. Hours part 2,100.00 over (42.00 h more at the estimate's 50.00). Rate part 900.00 over (average recorded rate 53.44).
- In the records: 2026-09-30, timesheet TS-0930, 2,700.00: "overtime to meet galv pickup". 2026-09-29, timesheet TS-0929, 2,300.00: "rework beam connections after fit-up".
200 Fabrication, material: revised estimate 18,500.00 (18,500.00 + 0.00); recorded 20,380.00. 1,880.00 over, 10.2%. Over the limits.
- In the records: CO-02 pending, 1,300.00; if approved as stated, 580.00 over would remain. 2026-09-15, AP invoice INV-5521, 17,950.00: "beams and columns per PO-3302". 2026-09-24, AP invoice INV-5560, 2,640.00: "additional plate for revised stair landing". 2026-10-02, AP credit CR-0117, -210.00: "return unused angle".
300 Galvanizing, subcontract: revised estimate 4,200.00 (4,200.00 + 0.00); recorded 3,900.00. 300.00 under, 7.1%. Not final: PO-3310, 300.00 not invoiced.
400 Installation, labour: revised estimate 7,480.00 (6,600.00 + 880.00); recorded 7,810.00. 330.00 over, 4.4%.
- Hours: revised 136.00 h, recorded 142.00 h. Hours part 330.00 over (6.00 h more at the estimate's 55.00). Rate part 0.00 (average recorded rate 55.00).
400 Installation, material: revised estimate 1,050.00 (900.00 + 150.00); recorded 1,020.00. 30.00 under, 2.9%.
900 Shop overhead, overhead: revised estimate 6,080.00 (6,080.00 + 0.00); recorded 7,040.00. 960.00 over, 15.8%. Over the limits.
- In the records: 2026-10-31, applied OH-1031, 7,040.00: "shop rate 16.00 per labour hour".

NOT COMPARED
Estimated, nothing recorded: 500 Crane, subcontract: revised estimate 2,800.00. Not final: SC-0412, 2,800.00 not invoiced.
Recorded, not in the estimate: 450, material: 385.00. Rows: 2026-10-15, AP invoice INV-2301, 385.00: "field touch-up paint".
Uncoded rows: 2026-10-16, material, AP invoice INV-8812, Supplier E, 240.00: "freight".

RECORD FLAGS
Open commitments not invoiced: PO-3310 (Supplier C, 300 subcontract): 4,200.00 committed, 3,900.00 invoiced, 300.00 not invoiced. SC-0412 (Supplier D, 500 subcontract): 2,800.00 committed, 0.00 invoiced, 2,800.00 not invoiced.
Invoiced above a commitment: None.
Rows dated after completion: None.
Labour rows with no hours: None.
Pending change orders: CO-02, 200 material, 1,300.00.
Rejected change orders, not used: CO-03, 500 subcontract, 600.00.

QUESTIONS FOR THE CONTROLLER, THE ESTIMATOR, THE JOB LEAD AND THE RECORDS OWNER
1. 200 Fabrication, labour: recorded 14,000.00 for 262.00 h against a revised estimate of 11,000.00 for 220.00 h; 3,000.00 over, 27.3%, of which the hours part is 2,100.00 and the rate part 900.00. Job lead: what do you know about the cost on this line? Estimator: what hours and rate did the estimate use for fabrication labour?
2. 200 Fabrication, material: recorded 20,380.00 against a revised estimate of 18,500.00; 1,880.00 over, 10.2%; CO-02, 1,300.00, is pending on this line. Job lead: what do you know about the cost on this line, and what is the status of CO-02? Estimator: what quantity and price did the estimate use for fabrication material?
3. 900 Shop overhead, overhead: recorded 7,040.00 against a revised estimate of 6,080.00; 960.00 over, 15.8%. Controller: what basis applied this overhead, and did the estimate use the same basis?
4. 300 Galvanizing, subcontract, commitment not invoiced: PO-3310 (Supplier C) has 300.00 of its 4,200.00 not invoiced; the line is 300.00 under. Job lead: will more be invoiced on PO-3310, or will it be closed?
5. 450, material, not in the estimate: 385.00 on INV-2301, "field touch-up paint". Estimator: was this work in the estimate under another code? Job lead: what was this cost for, beyond the memo quoted?
6. 500 Crane, subcontract, nothing recorded: the revised estimate is 2,800.00 and no row is recorded; SC-0412 (Supplier D) has 2,800.00 committed and 0.00 invoiced. Records owner: is cost for this line posted elsewhere, or still to come? Job lead: will SC-0412 be invoiced, or closed?
7. Uncoded row, INV-8812: Supplier E, material, 240.00, "freight". Records owner: which cost code should this row carry?

TIE-OUT
Estimate: lines 52,480.00 + approved change orders 1,030.00 = revised estimate 53,510.00.
Records: 14 rows add to 56,935.00; control total 56,935.00; agree.
Difference: compared lines 5,600.00 + recorded, not in the estimate 385.00 + uncoded 240.00 - estimated, nothing recorded 2,800.00 = 3,425.00; recorded 56,935.00 less revised estimate 53,510.00 = 3,425.00.
By type: labour 3,090.00 + material 2,475.00 + subcontract -3,100.00 + overhead 960.00 = 3,425.00.
(Signed amounts: over is positive, under is negative.)

Every figure traces to J-2417 estimate, J-2417 cost detail to 2026-10-31, J-2417 change orders and J-2417 open commitments. The review changes no estimate, rate or record, and closes nothing.

How to read it

The job finished 3,425.00 over its revised estimate, but that is not yet its final cost. The crane subcontract has nothing recorded and a 2,800.00 commitment not invoiced, and galvanizing has 300.00 still to come; if both are invoiced in full, the job ends 6,525.00 over. That is why subcontract shows 3,100.00 under: the review counts nothing recorded as nothing, never as a saving, and asks about it.

Three lines pass both limits. Fabrication labour is the largest, and the review splits it into 42 extra hours and a higher average rate, then quotes the two timesheet notes as the records wrote them. It does not say the notes are the reason; the job lead answers that. Fabrication material has a change order still pending that would cover most of its difference if approved as stated. Shop drawings came in 10.0 percent under, but at 240.00 it is below the amount limit, so it is shown and not asked about.

The installation change order, CO-01, is already in the revised estimate, so installation is compared against 7,480.00 rather than the original 6,600.00. The touch-up paint and the freight row sit outside every line until the estimator and the bookkeeper answer. Nothing has been recoded, and the controller approves the final cost.

Where it fits

It sits beside three related workflow templates and does not replace them. Production cost variance sheet measures repeat production against standard costs at a plant; this one compares one finished job with its own estimate. Engagement margin review looks at fees, billing and margin on a services engagement; this one works on cost alone. Estimate basis pack records where an estimate's figures came from before the bid; this review is what the estimator reads after the job is done.

What has to change for your company

Map your own estimate, job-cost, change order and commitment exports to the default headers. Set the percentage and amount a difference must reach before it becomes a question. Name your job lead, estimator and records owner. Add equipment or any other cost type your job-cost system keeps. Confirm how overhead reaches your jobs: the review uses the overhead your records apply and never allocates any itself. Decide whether costs dated after completion count in this review or wait for the next version. It runs in ChatGPT, Claude, Copilot or Gemini, from files you supply; it needs no connection to your accounting system.

What has been checked

Fully Powered AI wrote this workflow template. It was editorially reviewed on 12 November 2026. It was tried on its invented example in Claude on 12 November 2026, and the record is published with it. It has not been tested in a client environment or as a packaged version in ChatGPT, Claude, Copilot or Gemini.

Testing in your environment means running it on two or three finished jobs your controller already knows well, with cases written in advance: an approved change order, a pending one, a line with nothing recorded, an uncoded row and a header that does not match. The controller recomputes the differences by hand before anyone relies on the review. Pilot acceptance-test preparation builds that test set, and what we test before we call an AI workflow ready shows the record we keep.

Who decides

People decide

Your people keep

  • The job's final cost, approved by the controller
  • What happened on the job, answered by the job lead
  • What the estimate assumed, answered by the estimator
By design

It does not

  • Changes no estimate, rate or cost record
  • Does not close the job
  • Never turns a record's note into a reason
  • Never counts a line with nothing recorded as a saving

Questions people ask

Who is it for?

The controller of a job shop, contractor or project business, or the operations lead or bookkeeper working for the controller, once a job's work is finished and its costs are posted.

What do I need to supply?

The estimate, the job-cost export, the change orders, the open commitments and a short settings note.

Does it change anything?

No. Nothing in the estimate, the rates or the cost records is changed, and the job is not closed by the review. The controller approves the final cost.

Does it say why a line went over?

No. It shows what the records themselves say and never turns a note into a reason. The job lead says what happened on the job, and the estimator says what the estimate assumed.

What has been checked?

Fully Powered AI wrote this workflow template and it was editorially reviewed. It was tried on its invented example in Claude on 12 November 2026. It has not yet been tested in a client environment.

The full workflow template

Everything above is the outline. The complete workflow template is the working version: the roles, the inputs, the procedure, the exceptions and stop conditions, the output format, the reviewer checklist, the acceptance tests, the instructions for an AI assistant and what to customize for your company. It comes with a download and the link to its folder in Fully Powered’s public repository.

View the full template

Free with an account. Sign in by email: no password and no card.

Next step

Put this workflow template to work for your team: on your plan, or built with you in a sprint.

Put this on your plan

Add it to a workflow in the Fully Powered Planner, beside the teams and roles that will run it.

Build this in a sprint

In a sprint, Fully Powered adapts this workflow template to your rules, proves it on your own work and puts it in the hands of the roles that own it.

Two ways to begin:

Rather talk it through first? Book a fit callDiscuss adapting this