What every construction invoice must include
1. Invoice number and dates
- Invoice number (INV-001, INV-002…) so both sides can track and reference it
- Invoice date and the billing period it covers
- Due date, stated plainly so "net 15" isn't left to interpretation
2. Who and what: parties, project, contract reference
Your company name and contact, the client's name and billing address, the project or property address, and a reference to the original contract (its date and number). This ties the invoice to the job it belongs to and keeps a clean paper trail when there's more than one project with the same client.
3. Itemized work done this period
Break out what you actually completed since the last invoice, grouped the way you priced the job: labour, materials, and subcontractors. Specific line items ("rough-in plumbing, 80% complete") beat a single lump number. An itemized invoice gets paid faster because the client can see what they're paying for instead of guessing.
4. Prior billed, this period, and holdback
Show the running math: total contract value, amount billed to date before this invoice, the amount for this period, and any retainage or holdback withheld (often 10%). The client should always see where the contract total stands, not just this one invoice in isolation. Getting holdback wrong is one of the most common ways contractors either over-bill or leave money on the table.
5. Amount due, terms, and payment methods
A single, unambiguous amount due after holdback, the payment terms, and how you accept payment (e-transfer, card, cheque, cash). Spell out any late-payment terms here too. The easier you make it to pay, the sooner you get paid.
Progress invoice vs final invoice
A progress invoice bills for the portion of the job completed during a period. It's the same document each cycle, updated for the new work done, prior amounts billed, and holdback withheld. A final invoice closes out the job: it bills the remaining balance, releases the accumulated holdback, and should reflect any approved change orders. Confusing the two is how contractors forget to release holdback or forget to bill the last change order.
A free template to start with
You don't need to build this from scratch. A simple invoice template, whether a PDF, a Word doc, or a spreadsheet, with the fields above will get you billing today and immediately beats a scribbled figure on a text message. Keep a blank copy handy so month-end billing takes minutes instead of an evening.
Where a static template falls short
A template is a real step up from nothing, but a fillable PDF still has limits:
- You retype everything by hand. Parties, contract number, and every line get re-entered each period.
- It isn't tied to your schedule of values or budget. Nothing checks that this invoice lines up with what the job is actually worth or how far along it is.
- It doesn't track what's been paid. Prior billed, holdback held, and outstanding balances all live in your head or a separate spreadsheet, which is exactly where errors and missed collections creep in.
The template solves the blank-page problem. It doesn't solve the did-this-actually-get-paid problem.
From template to system
The next step up is an invoice that draws from the job itself. Instead of retyping line items and hunting down prior amounts, the invoice pulls from your live budget and the draws you've already billed, so the math on holdback, prior billings, and amount due is done for you, and paid-versus-unpaid is tracked automatically as payments come in. That's billing handled as part of a connected cash-flow workflow rather than a folder of disconnected PDFs.
TradesMetrics builds each invoice from the job's live budget and prior draws, tracks paid and unpaid on its own, and keeps holdback straight across the whole job. Start with a free template if you like, then see how progress billing and draw schedules remove the re-typing entirely.
The fastest way to see the difference is to price a real job. Try the free estimating tool, then watch that estimate become a live budget that your invoices draw from inside TradesMetrics.