Job costing
Estimated vs actual revenue, material, labor, and gross margin — for every millwork project. Labor rolls in from time tracking automatically. Material from a line-item expense ledger. Margin in a single number, color-coded the way a shop owner reads it.
Free for the first 35 shops. No card. Set up in 10 minutes.
The problem every shop owner has
Most millwork shops bid in their head, track hours in a spreadsheet, and never close the loop on whether the bid was right. The kitchen you thought was a 22% margin job might have been 14% by the time the install crew finished punch list. The next bid uses the same numbers anyway, because there's nowhere to see the truth.
Fabrica fixes that. Every project has a Job costing card that shows you what you bid, what actually happened, and the variance — for both labor and material. So the next bid is informed by the last ten jobs, not by a guess.
A real Job costing card from a Fabrica project page
How job costing works in Fabrica
When you create the project, enter estimated labor hours and estimated material cost. Fabrica multiplies hours by your shop's hourly rate (set once in Settings, default $75/hr) to get estimated labor dollars. Total estimated cost = labor + material.
Workers log time entries per project, categorized as Shop / Install / Drawings / Admin / Finishing. Each entry has its own hourly rate captured at the time it was entered, so historic cost stays accurate even if rates change.
The expense ledger on each project takes vendor, amount, date, and category (Material / Equipment / Subcontractor / Other). Drops in a few seconds per receipt. The total feeds Actual material cost automatically.
Estimated vs actual on revenue, material, labor (hours and dollars), and gross margin. Green when you're under budget; amber when you're over. Variance badges flag deltas over $50 or 0.5h. Gross margin is computed against collected revenue, not billed — so the number reflects cash, not invoices in flight.
Why this is hard in everything else
| Tool | Tracks bids | Tracks actual labor | Tracks actual material | Shows margin per project |
|---|---|---|---|---|
| QuickBooks | ✗ | ✗ | By account, not by job | ✗ |
| Generic CRM (HubSpot, Pipedrive) | ✓ | ✗ | ✗ | ✗ |
| Spreadsheet + Dropbox | If you remember to update it | If you remember to log it | If you remember to add it up | Quarterly, in retrospect |
| Fabrica | ✓ Per project, in the pipeline | ✓ Time entries by category | ✓ Per-project expense ledger | ✓ Live, on every project page |
The reason Fabrica can do this is because the same database knows the bid (Estimate), the contract (Deal), the labor (TimeEntry), the material (DealExpense), and the invoice — so the math is just a few joins. Spreadsheet stacks fall apart because no single sheet has all four.
Job costing FAQ
Yes — when you log a time entry, the rate is set per-entry. The shop default (Settings → Shop hourly rate) is just the fallback. You can also set a rate per worker if you want, or override on individual entries.
You can backdate entries to any past day. Just put the right date when you create the entry. The Job costing math will pick them up immediately.
Yes — log them as expenses with category "Subcontractor." Same vendor, amount, date fields. They roll into Actual material cost on the Job costing card. If you'd rather see them broken out separately, that's coming soon.
After. We compute gross margin against collected revenue, not billed. So a $200k project where you've received $130k and the rest is in retainage shows margin against the $130k — closer to the cash reality.
Today: not in a single report — you'd look at each project's Job costing card. We're building a cross-project margin comparison view (a kind of "your portfolio at a glance") for shops with 6+ months of history. If you want early access let us know.
Fabrica is free for the first 35 millwork shops. No card. 10-minute setup. Job costing live on day one.