Construction bookkeeping is the month-end operational routine that keeps job costing, billing and WIP schedules accurate — chart of accounts, cost codes, timesheets, committed cost, and a reconciliation cycle built around jobs rather than the calendar. This guide covers the practical, recurring work. For the underlying concepts — job costing, WIP, holdbacks and revenue recognition — see construction accounting in Canada; for the mechanics of holdbacks and percentage-of-completion specifically, see holdbacks and percentage-of-completion.
Chart of accounts for contractors
Start from a standard small-business chart of accounts and add a job-costing layer underneath it:
- Direct costs — labour, materials, subcontractors and equipment — broken out from overhead, so job cost reports pull only the costs that actually belong to a job.
- Overhead — office rent, admin salaries, insurance, and other costs that support the business as a whole rather than any one job.
- Holdback receivable — a separate balance-sheet account from ordinary accounts receivable, so held-back revenue doesn't get treated (or collected against) like a normal invoice.
- Contract asset / contract liability (over/under-billing) — the account pair that carries the WIP over/under-billing position.
Every direct-cost transaction should carry a job reference. If the accounting system supports cost codes (see below), the transaction should carry that too.
Cost codes
Cost codes divide a job into components — sitework, framing, electrical, plumbing, finishing, and so on — so cost is visible at the level a contractor actually estimates and bids at. A job total tells you whether you made money; cost codes tell you where. Building or adopting a standard cost-code list (many contractors start from an industry-standard structure and adapt it) pays off the first time a bid comes in wrong and needs a root cause.
Timesheets to job cost
Labour is usually the largest, most volatile cost on a job, and it only becomes useful data if it is captured correctly:
- Every timesheet entry needs a job — and ideally a cost code — not just an employee and a date.
- Field-entered time (paper, app, or foreman-reported) needs a short lag between when hours are worked and when they hit the job-cost ledger; a two-week lag means two weeks of job-cost reports are wrong.
- Overtime, travel time and equipment-operator time often need separate coding, since they load differently onto job cost than straight time.
Purchase orders and committed cost
A purchase order (PO) or subcontract commits a job to a cost before an invoice arrives. Tracking committed cost — POs and subcontracts issued but not yet billed — alongside actual cost-to-date gives a forward-looking total job cost, which is the number a WIP schedule's estimated-cost-to-complete should really be built from. A job-cost report that only shows costs already invoiced will look better than reality right up until the outstanding invoices land.
Change orders need the same discipline: a change order is a new commitment (and often new revenue) that has to update both the committed cost and the contract value on the WIP schedule, not get tracked informally on the side.
Progress-claim paperwork flow
Getting paid on a construction contract usually runs through a defined paperwork sequence:
- Schedule of values — the contract broken into billable line items, agreed at the start of the job.
- Progress claim / draw request — submitted at agreed intervals, showing percentage complete against the schedule of values.
- Certification — on larger or commercial work, an owner's consultant or project manager certifies the claimed percentage before payment is approved.
- Payment, less holdback — the owner pays the certified amount, less the holdback percentage required under the applicable provincial legislation.
Bookkeeping needs to mirror this flow: the invoice raised should match the certified draw amount, and the holdback withheld should post to the holdback receivable account rather than simply reducing revenue.
Month-end WIP reconciliation
Every month, reconcile three things against each other, job by job:
| Reconcile | Against |
|---|---|
| Job-cost ledger (costs incurred to date) | The general ledger direct-cost accounts |
| Billings to date | Actual invoices issued |
| WIP schedule over/under-billing | Recalculated from current cost, committed cost, and billing data |
Doing this monthly, not just at year-end, is what makes the WIP schedule a management tool rather than a year-end accounting exercise — it surfaces a job going sideways while there's still time to react, rather than after the fact. See holdbacks and percentage-of-completion for the underlying percentage-of-completion calculation this reconciliation depends on.
Common errors that distort gross margin per job
- Miscoded costs — charged to the wrong job, or dumped into a generic overhead code instead of a specific job.
- Stale committed-cost estimates — change orders issued but not reflected in the job's committed cost or contract value.
- Late or misclassified timesheets — hours coded to the wrong job, wrong cost code, or not entered until well after the pay period.
- Holdback left in regular receivables — held-back revenue collected against like a normal invoice instead of tracked in its own account, which makes cash-flow projections wrong.
- Equipment cost never allocated to jobs — leaving true job profitability understated for equipment-heavy jobs and overstated for jobs that used little equipment.
Any one of these can make a losing job look profitable on paper, or the reverse, until the month-end reconciliation catches it.
How RN Canada helps
RN Canada sets up and maintains the chart of accounts, cost-code structure and month-end WIP reconciliation that Alberta and BC contractors need for accurate, job-level financials. Our founder, Ozgur Duymaz, holds a Ph.D. in accounting and finance and is a CPA (Canada), ACCA (UK) and CMA (US). See our bookkeeping, payroll and tax filing service or talk to us about your construction books.
This page is general information, not personalized advice. Speak to us about your specific situation.
Frequently asked questions
A construction chart of accounts adds a job-costing dimension underneath the normal account structure: direct costs (labour, materials, subcontractors, equipment) are broken out separately from overhead, and each direct-cost transaction is tagged to a job and often a cost code within that job. The chart itself may look similar to any small business's, but every direct-cost entry needs a job attached to be useful.
Cost codes break a job down into components — sitework, framing, electrical, finishing, and so on — so that cost is tracked at a level useful for estimating and bidding, not just at the whole-job level. Without cost codes, a contractor can see that a job made or lost money, but not which part of the job drove the result, which makes the next bid a guess rather than an estimate.
Every timesheet entry needs a job (and ideally a cost code) attached, not just an employee and a date. If field staff record hours against jobs accurately and promptly, job cost reports are current; if timesheets lag or get coded to a generic overhead code, job costing quietly breaks down and margin reports become unreliable exactly where they're needed most — on active jobs.
Committed cost is money a contractor has obligated through a purchase order or subcontract but hasn't yet been invoiced for. Tracking it alongside actual cost-to-date gives a forward-looking view of total job cost, which is what a WIP schedule's estimated-cost-to-complete figure should be built from — using only costs incurred to date understates what a job will actually cost.
It's the routine check that ties the job-cost ledger, the billing records, and the WIP schedule together every month: confirming costs incurred match the general ledger, billings match invoices issued, and the resulting over/under-billing position is recalculated and reviewed job by job. Skipping this monthly turns WIP into a year-end scramble instead of a management tool.
Miscoded costs (charged to the wrong job or to overhead instead of a job), stale committed-cost estimates that don't reflect change orders, timesheets coded late or to the wrong cost code, and holdback amounts left sitting in accounts receivable instead of a separate holdback receivable account. Any one of these can make a losing job look profitable, or the reverse, until it's corrected.