Job P&L — estimate versus actual

Quoted price and estimated costs from the estimate against actual labour, approved expenses and supplier material orders, with the margin computed.

What it is

A per-project P&L that finds the estimate by direct link, estimate_link_id or SmartBuild job id, pulls estimated material and labour from the snapshot, then prices actual labour from approved time entries by the crew's pay model and adds approved expenses and supplier POs.

Also called: did we make money on this job · job costing · margin per job · actual vs estimate

See it, piece by piece
01

Estimate against actual while the job is still open

The quoted price and the estimated material and labour come off the estimate; the actuals come off approved time, approved expenses and supplier orders for that project; the margin is computed from both. You find out the framing is running hot in week two, not from your accountant in March when the only thing left to do is remember it next time.

Labour & Costs — Project P&L
Project P&L
$20,555.00(24% margin)
Revenue $86,400.00
Actual cost $65,845.00
Labor: $38,220.00 / est $36,000
Expenses: $6,145.00
Materials: $21,480.00 / est $22,500
220
Hours
1,240
Units
$7,410.00
Expenses
$6,145.00
Approved
23 items
Cost by stage · approved actuals
Total $44,365.00
Posts & framing
Crew B · Day rates + shared surplus
96 hrs
$18,940
$17,600 lab · $1,340 exp
Roof steel
Ridge Overhead · Per unit
1,240 sheets
$11,905
$10,540 lab · $1,365 exp
Site prep & layout
Crew C · Hourly (T&M)
62 hrs
$8,930
$7,440 lab · $1,490 exp
Siding & trim
Kauffman Exteriors · Cost-plus (hours + materials)
38 hrs
$4,590
$2,640 lab · $1,950 exp
Concrete flatwork
Valley Flatwork · Lump sum / fixed bid
24 hrs
Lump sum
Costliest stage highlighted. Lump-sum crews are priced per crew, not per stage, so their labor shows in the project total above.
Revenue, actual cost and margin at the top; every stage below it with its crew and pay model. The real screen, drawn from the product’s own design system. Sample data — no customer information appears here.
02

Each crew is priced the way that crew is actually paid

Per-unit crews price units times rate. Hourly and cost-plus crews price hours times rate. A lump-sum crew contributes its agreed lump once, not once per timesheet row. Multiplying a fixed bid by the number of entries somebody submitted is how a job cost report quietly becomes fiction.

03

Only approved hours and receipts reach the actuals

Everything the portals submit lands as submitted and waits in one approvals screen, with a pending count in the nav so you know what is outstanding. Approving or rejecting flips the same rows the P&L reads. Nothing a crew types can move your job cost until a manager has looked at it.

Approvals
Approvals
Timesheets and expenses your crews and subs submitted, waiting on you.
7
pending
$1,104.60 in expenses
Wenger 40×60 Shop
Approve all (4)
Posts & framing
2026-08-24 · Crew B · 4 on site
32 hrs
Posts & framing
2026-08-25 · Crew B · 4 on site
30 hrs
materials · Zimmerman Supply
2026-08-25 · Crew B · Posts & framing
$486.20
fuel · Sheetz
2026-08-25 · Dwayne Esh · reimbursable
$78.40
Stoltzfus Equipment Storage
Approve all (3)
Roof steel
2026-08-24 · Ridge Overhead · 2 on site
620 units
rental · Keystone Equipment
2026-08-25 · Ridge Overhead · Roof steel
$540.00
Site prep
2026-08-26 · Crew C · 3 on site
18 hrs
Seven items waiting, grouped by job, with Approve all on each group. The real screen, drawn from the product’s own design system. Sample data — no customer information appears here.
04

Spend carries a job, a stage, a category and a receipt

Amount, category, vendor, company card or reimbursable, and a photo of the receipt, filed against the project and the stage it was incurred on. Receipts in a glovebox and a card statement in a different system are not a cost code, and reconstructing one from the other in January is not job costing.

05

It finds the estimate the customer actually agreed to

The P&L links to the estimate by direct project link, then by the project's estimate link, then by its SmartBuild job id. The revenue line is the number on the document the customer signed, not a figure re-typed into a costing sheet where it can drift.

How it works
  1. 1Revenue comes from the estimate's total_amount or the snapshot's grand total.
  2. 2Actual labour: per_unit crews price units x rate, hourly and cost-plus price hours x rate, lump-sum crews contribute their agreed lump once each rather than per entry.
  3. 3Actual expenses are approved labor_expenses; actual materials are supplier_orders totals for the project.
  4. 4margin = revenue - (labour + expenses + materials), with a percentage when revenue is positive.
Why we built it

Builders find out whether a job made money once the job is over, which is far too late to do anything about the one running now. Every job shows estimated against actual for labour and expenses as the work happens, so a stage running over surfaces while there are still stages left to adjust. Only approved entries count toward actuals, and a fixed-bid crew is counted once at their bid rather than multiplied by however many entries they happened to file.

The problem
  • Job margin only knowable in hindsight from accounting.
  • Actual labour cost not derivable from time data.
  • Fixed-bid crews double-counted per time entry.
Sound familiar?
What you get
Estimate against actual on the job itself, while it runs.
Every pay model priced correctly in the same total.
Only approved data affects the number.

See it on your own jobs

Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.

or keep browsing features →