Skip to main content

The Machine Shop Bookkeeping Guide: Job Costing, WIP, and Real Margins

8 min readMike ThriftMike Thrift
The Machine Shop Bookkeeping Guide: Job Costing, WIP, and Real Margins

A job shop owner runs ten jobs a month. Nine of them clear a healthy 22% margin. The tenth — a "quick favor" for a longtime customer with tight tolerances and a rushed quote — eats 40 hours of setup and rework that nobody billed for. At the end of the month, the shop's bank balance looks fine, so the owner assumes everything is fine. It isn't. That one job just wiped out the profit from three of the good ones, and because the shop was pricing off a flat "shop rate per hour" instead of what each job actually consumed, nobody saw it coming until the accountant pulled the numbers apart months later.

This is the single most common failure mode in machine shop and CNC job shop finances: the business is profitable in aggregate, invisible in the details. You can be running a full shop, hitting revenue targets, and still slowly losing money on a third of your jobs — because your bookkeeping tells you what you spent, not what each job actually cost you to make.

Why "Check the Bank Balance" Doesn't Work for a Job Shop

Most small manufacturers start out tracking the business the way a service business would: revenue in, expenses out, and a bank balance that trends up or down. That works fine for a business with one product line and predictable costs. It falls apart the moment you're quoting dozens of distinct jobs a month, each with its own material, machine time, setup complexity, and finishing requirements.

A machine shop doesn't have "a cost." It has a cost per job, and that cost is made up of several components that behave differently:

  • Direct labor — the machinist's hourly rate times the hours actually spent on that job
  • Labor overhead — payroll taxes, workers' comp, and benefits, calculated as a percentage of labor hours
  • Shop (machine) overhead — depreciation, maintenance, power, tooling, and floor space tied to the specific machine or work center used
  • General and administrative overhead — sales, quoting, scheduling, and admin costs, allocated proportionally across jobs
  • Materials and outside services — raw stock, purchased components, and any outside processing like heat treat, plating, or anodizing, billed at actual cost

When shops only track the first and last of these — labor and materials — they're missing the two categories that quietly determine whether a job was actually profitable: overhead and the machine time it consumed. A five-axis mill sitting idle between setups costs the business real money even when no material is being cut. If that cost isn't allocated to the job that caused it, it either gets absorbed into "general overhead" (where it disappears into a rounding error) or it gets spread evenly across every job (where it systematically overcharges simple work and undercharges complex work).

The Case for Activity-Based Costing Over a Flat Shop Rate

The traditional shortcut is a single blended shop rate: one dollar-per-hour number applied to every job regardless of which machine it ran on or how much setup it required. It's simple, and it's wrong in a specific, predictable way — it subsidizes your worst jobs with the margin from your best ones.

Activity-based costing (ABC) fixes this by tracking cost drivers instead of a single average. Instead of one shop rate, you build a machine-hour rate for each distinct work center — your CNC mills, your lathes, your grinders, your inspection department — based on that machine's actual depreciation, maintenance, tooling, and power draw divided by its available hours. A part that spends six minutes on a $40,000 mill and two hours on a $400,000 five-axis machining center should not be priced the same as a part that spends the reverse. When you allocate overhead by activity instead of by a flat average, you start to see which jobs are quietly subsidizing which — and which customers you're effectively paying to work for.

This doesn't require enterprise software. A spreadsheet with a machine-hour rate per work center, updated quarterly as your overhead numbers change, gets most shops 90% of the benefit. The bar to clear isn't sophistication — it's simply tracking cost by job and by machine instead of by month and by bank account.

Tracking Material From Raw Stock to Finished Part

The second blind spot is inventory. A machine shop's material moves through three distinct states, and each one needs to be visible in your books, not just your head or a whiteboard on the shop floor:

  1. Raw materials — bar stock, castings, plate, and purchased components sitting in the cage, not yet allocated to a job
  2. Work in process (WIP) — material that's been pulled for a job and has direct labor, machine time, and overhead accumulating against it, but isn't yet a finished, inspected part
  3. Finished goods — completed, inspected parts waiting for shipment or pickup

The reason this matters isn't academic. Scrap and rework happen at the WIP stage, and if you're not tracking cost accumulation by job as it moves through the shop, a scrapped part just evaporates as an unexplained material variance at month-end instead of showing up as "Job #4471 lost $340 in stock and 3 hours of machine time to a tool chip." One of those tells you what happened and lets you fix your process. The other just makes your numbers look a little worse for reasons nobody can explain.

Practically, this means your chart of accounts should separate raw materials, WIP, and finished goods as distinct categories rather than lumping everything into a single "inventory" or "cost of goods sold" bucket, and your job costing should update WIP in near-real time as labor, machine hours, and material are consumed — not retroactively, once a month, from memory.

Pricing Jobs So You Actually Know Your Margin

Once you have machine-hour rates by work center and clean job costing, pricing becomes a build-up instead of a guess:

Material (actual stock cost, including scrap allowance) + Labor (hours × loaded rate) + Machine time (hours × work-center rate) + Outside processing (actual vendor cost) + Allocated G&A + Target margin = Quote

The part people get wrong most often is setup time on complex geometries. A part with five setups and tight positional tolerances can easily take three or four times longer to set up than a simple prismatic part, and if your estimating process uses a rough per-part average instead of a real setup estimate, you'll systematically underquote your hardest jobs — the ones that should carry the highest margin, since they're the ones competitors are least equipped to run.

The fix is a feedback loop: after a job ships, compare actual hours and actual cost against the quote. Do this consistently and you'll find that a small number of jobs — often the same handful of part numbers or the same customer — account for most of your margin erosion. Shops that make a habit of reviewing their ten least profitable jobs each quarter tend to find the pattern quickly: it's rarely random. It's usually a specific tolerance class, a specific material, or a specific customer's revision habits.

Industry benchmarking gives a sense of the spread this creates. In Modern Machine Shop's Top Shops benchmarking survey, top-performing shops report roughly 72% spindle utilization compared to about 60% for typical shops, running newer equipment (average CNC age of 7 years versus 10). That gap between "top" and "typical" isn't mainly a talent gap — it's a measurement gap. Shops that know their real cost per machine hour make better decisions about which jobs to chase, which to walk away from, and where to invest in new equipment, because they can see the return instead of guessing at it.

Where Bookkeeping Fits Into This

None of this works if your underlying books can't answer "what did this job actually cost?" on demand. That means your accounting needs to support job-level cost tracking — tagging labor, materials, machine time, and outside services to a job or work order, not just a general ledger account — and it needs to keep raw materials, WIP, and finished goods properly separated so a scrap event shows up as a traceable variance instead of vanishing into a monthly rounding difference.

This is exactly the kind of structured, auditable record-keeping that plain-text accounting is well suited for. Beancount.io lets you track job costs, machine-hour allocations, and inventory stages as clearly tagged, version-controlled transactions rather than opaque entries buried in a proprietary database — so when you want to know whether Job #4471 actually made money, the answer is in your ledger, not in your memory. You can review the docs for how to structure a chart of accounts around job costing, or explore Fava for visualizing job and work-center profitability once the data is there.

Simplify Your Financial Management

Running a profitable machine shop isn't about working harder on the shop floor — it's about knowing which jobs are actually worth running. Beancount.io provides plain-text accounting that gives you complete transparency and control over your financial data, with the auditability to trace every dollar of cost back to the job that generated it. Get started for free and see why manufacturers are switching to plain-text accounting to finally see their real margins.

Share this article