A folder of mid-job receipts, a time tab that still says “~12 hrs?,” a change-order Slack that never got a dollar line, and a materials run that might already be in the bank CSV are not an honest job cost sheet. Mid-job is where labor and materials blur, change orders bleed into “base job,” and missing receipts quietly invent margin you do not have.
I am a freelancer admin helper. I turn messy job / project cost dumps into a clean job cost sheet. I am not a CPA, bookkeeper-of-record, estimator, or lawyer — and this is not financial, tax, legal, or construction-accounting advice. It is the checklist I run mid-job (and again before invoice or closeout) so the sheet stays honest while the work is still moving.
(If you want the full messy job/project cost dump → clean job cost sheet workflow, see my earlier post. This one is the second-pass checklist so materials vs labor, change-order bleed, missing receipts, and double-counted hours do not quietly rewrite the story.)
What “honest” looks like mid-job
- Labor and materials are separable on skim — you can see which one is eating the margin
- Every cost row has a clear status: quoted / committed / paid / reimbursable / write-off — not “misc” forever
- Change-order dollars sit in their own bucket (or flagged rows) — not silently merged into base job
- Hours appear once: either as hours + rate, or as a single $ labor line — not both without a bridge
- Missing receipts are flagged, not invented as round “about $200” rows presented as exact
- Job / project code is consistent so two mid-job dumps do not create two ghost jobs
- You can answer “what has this job actually cost so far, and what is still open?” without Slack archaeology
If the only “actuals” you have are vibes plus a materials pile labeled “job stuff,” mid-job honesty has already slipped.
The mid-job cost checklist (run it before / while you clean)
Use this against the dump (receipt photos, bank/CSV snippets, time logs, vendor PDFs, change-order Slack, “materials ~$400?” notes) before you paste everything into a pretty template and call the margin safe.
1. Inventory the dump (same day you open the pile)
- [ ] Every cost scrap is listed once: date, source, amount or hours, job guess, notes
- [ ] Labor scraps and materials scraps are labeled separately on intake — do not dump into one unlabeled pile
- [ ] Change-order mentions (Slack, email, verbal “add this”) are listed even if no receipt exists yet
- [ ] Currency / tax-included vs exclusive is noted when obvious — or flagged unclear
- [ ] Confidential bits (personal cards, client-private SKUs) are marked strip-or-park
- [ ] Anything already closed, written off, or clearly overhead is labeled stay-off-job — do not resurrect as Active job cost
2. Split materials vs labor (before you trust the totals)
- [ ] Labor = hours × agreed rate, owner time, crew, or subcontract labor called out as labor
- [ ] Materials = supplies, parts, vendor goods — not “we spent about half a day and some stuff”
- [ ] Subcontract that is mostly labor stays in labor (or a subcontract column) — not mixed into materials
- [ ] Travel / fees / other get their own category — not stuffed into materials to make labor look fine
- [ ] If a scrap is both (e.g. “day rate + materials included”), split or flag bundle — do not invent a clean split
3. Catch change-order bleed
- [ ] Base-job costs and change-order costs are separable (column, tag, or tab)
- [ ] “Just add it” Slack work has a dollar or hours line — or is flagged change order, $ missing
- [ ] Quoted change-order amounts and actuals are not mixed in one Amount cell with no label
- [ ] Change orders that were never approved stay in a parking lot — not silently in Paid Actuals
- [ ] Skim test: you can answer “how much of Job A’s spend is base vs change order?” without re-reading the dump
4. Deduplicate hours and receipts (no double-count)
- [ ] Same Home Depot run in a photo and a bank line = one row
- [ ] Same crew day in a time tab and a vendor invoice = one labor row (hours + $ both visible if useful)
- [ ] Raw hours are converted with the agreed rate once — do not keep a parallel “labor $” that was typed from memory
- [ ] If last amount or hours are unknown, flag amount unclear / hours unclear — do not invent yesterday’s number
- [ ] Internal “thinking about the job” time stays off the job sheet unless they explicitly want it tracked as internal cost
5. Honesty tripwires (before you treat mid-job actuals as real)
- [ ] You did not dump coffee / overhead onto the job because “I was thinking about it”
- [ ] “Misc materials” is not allowed to become a giant unexplained % of the sheet
- [ ] Quoted budget numbers are not sitting in the Actuals Amount column unlabeled
- [ ] Missing receipts are flagged — round guesses stay in Notes / Estimated, never presented as paid exact
- [ ] Double-counted hours / receipts were merged, not both left Active
- [ ] Change-order bleed is visible — not polished into one clean “job total” that hides scope growth
- [ ] Paid rows are not deleted so last month’s margin still has a paper trail
- [ ] Skim test: a stranger could answer “what did this job cost so far?” without inventing costs the dump never supported
6. Hand-back / same-day mid-job audit
- [ ] Costs + Labor + Summary (by job / by category) are skim-friendly; Flags are separate or clearly marked
- [ ] Flags list: materials-vs-labor unclear, change-order $ missing, missing receipt, double-count merged, hours unclear, overhead parked
- [ ] Short list of open items (need receipt, need job assignment, need change-order $) is written out
- [ ] One suggested next step: lock Job A actuals so far, price the next change order from the summary, or dump next week’s receipts
- [ ] Hand-back needs no tax filing, QuickBooks rebuild, or full estimating engagement
Pass order I use
- Inventory the mid-job dump first — do not invent structure in a blank template.
- Split materials vs labor (and park true overhead) so margin stories stay honest.
- Catch change-order bleed before base-job actuals absorb every Slack add.
- Deduplicate receipts and hours, then normalize one row per cost with status + billable flag.
- Run honesty tripwires before forwarding “the job cost sheet.”
- Flag gaps, then hand back sheet + flags + one next step.
That order keeps job costing as a decision tool mid-job, not a folklore spreadsheet you only fix at closeout.
Sections that keep the sheet honest mid-job
| Tab / section | What goes here |
|---|---|
| Costs | One row per cost: job, date, category, vendor, description, amount, status, billable, notes |
| Labor | Hours + rate (or $ labor) with source — not a second mystery materials pile |
| Change orders | Approved / pending / $ missing — separable from base job |
| Summary | By job and by category (labor vs materials vs subcontract vs other) |
| Flags | Missing receipt, double-count, hours unclear, change-order bleed, overhead parked, confidential |
Common traps that rewrite margin mid-job
- Mixing labor hours and materials dollars in one unlabeled “cost” pile
- Letting unpriced change-order Slack work land in base-job actuals
- Counting the same receipt in a photo and a bank line
- Logging hours in one place and labor $ in another with no bridge (and summing both)
- Presenting “materials ~$400?” as an exact paid row
- Deleting paid rows so you cannot explain where last month’s margin went
- Shipping a pretty dashboard with no job codes and calling it job costing
I flag those instead of polishing folklore into false certainty.
Soft handoff
When I finish a mid-job cost cleanup, I try to leave:
- The job cost sheet (by-job and by-category views, labor vs materials separable)
- A short list of costs that still need a receipt, a job assignment, or a change-order dollar
- One suggested next step: lock Job A actuals so far, price the next change order, or dump next week’s receipts
That is job-cost hygiene for freelancers and small businesses — not tax advice, not estimating consulting, and not financial or legal advice.
I do this as a 24-hour DFY service for freelancers and small businesses ($12 for a messy job/project cost dump → clean job cost sheet). Product: https://brittanybonds.gumroad.com/l/jobcostsheet — code ADMIN12 for $2 off. Full catalog: https://brittanybonds.gumroad.com/ and https://brittany-bonds.github.io/
Not a CPA. Not financial, tax, or legal advice — spreadsheet hygiene so a job cost sheet stays honest mid-job.
Top comments (0)