Ask a small-business owner what their gross margin is and you will usually get one confident number — "about 40%" — which is the average. Averages are where pricing problems hide: the 60% jobs subsidize the 15% jobs, the blend looks healthy, and the losing jobs keep getting quoted because nobody ever put them side by side.
Margin is not one number; it is a distribution over the jobs and products you actually sell, and once a quarter you owe that distribution forty-five minutes.
Full page (tables, ritual, worked example): Gross Margin by Job — the quarterly pricing review
The one table — and the floor that decides what earns a question
One row per job type or product line (not per invoice — per kind of work):
- Revenue — what customers actually paid, discounts included. The quoted price is a hope; the invoice is the fact.
- Direct cost — materials, subcontractors, the labor hours the job consumed (from timesheets, not from the quote's estimate), freight, card fees. Overhead stays out — rent does not belong in a job's margin.
- Gross margin — dollars and percent, both. Dollars tell you what the job contributes; percent tells you how hard it worked for that contribution.
Then one rule keeps the 45 minutes to 45 minutes:
- Set the floor once: a target margin per row type — 50% on service labor, 30% on product resale — agreed with the annual budget, not renegotiated quarterly with your own anxiety.
- The threshold: any row more than 5 margin points below its floor gets a written one-line cause and a one-line action. Everything else is noise this quarter.
- Every below-floor row gets a name, not a mood: "emergency installs — 18% vs 50% floor — after-hours labor not quoted" is a finding. "Installs feel thin" is a complaint.
The two drifts — and which lever each one pulls
Every margin miss is one of two drifts:
- Price drift — revenue is the problem: discounts granted to win, scope that grew past the quote, a rate set two years ago. The lever is the price increase letter, a tighter quoting rule, or a scope-change clause — never silent absorption.
- Cost drift — direct cost is the problem: a supplier's price crept up, overtime ate the install, freight went from free to $40 a carton. The lever is renegotiation, a second quote on the offending line, or a materials surcharge on the next quote.
Test before you pull: take the row's price per unit and cost per unit and compare each against last quarter. The one that moved is the drift. Pulling the price lever for a cost problem poisons the customer relationship for nothing.
The quarterly ritual — forty-five minutes, the week after quarter close
- Pull closed revenue and closed costs from the books — not the pipeline, the closed jobs.
- Build the table — one row per job type, the three columns, margin percent beside floor. Fifteen minutes, and faster every quarter because the shape never changes.
- Mark every row past the threshold — healthy quarters show two to four. More than six means the floors are fantasy or the coding is drifting — fix the instrument before trusting the reading.
- Write the one-liner per row: which drift, then which action. "Maintenance contracts — 31% vs 50% — price drift; 4% increase letter at renewal, March."
- Close the loop: price actions into the renewal calendar with a date; cost actions to a named supplier conversation; anything structural into the decision log — keep, reprice, or retire.
The three honesty rules
- Labor at true cost, not at quote. The quote assumed eight hours; the timesheet says fourteen. Job margin computed from the quote is a forecast wearing a result's clothes.
- Never average your way past a loser. A blended 41% can contain a 12%. The blend is for the bank; the distribution is for you.
- Every review ends in a decision or a date. A row below floor for three quarters with no action is not a finding anymore — it is a subsidy you operate on purpose, and it should be written down as one.
The five traps
- The blend that hides everything. One margin number for the whole business. The mix of jobs is the margin; the average is a costume the mix wears.
- Revenue masquerading as profit. The biggest job by revenue is often the thinnest by percent.
- The hero job at zero margin. The work you do "as a favor." Name it, floor it, or retire it — sentiment is a supplier you pay in hours.
- Repricing the losers, never the winners. The rows holding 65% drift to 45% unnoticed. The floor works both ways — that is where the pricing power is.
- Review without a lever. Reading the table, sighing, closing the laptop. A margin review that produces no letter, no negotiation, and no decision line was forty-five minutes of theatre.
Worked example — the signage shop's two free jobs
A twelve-person signage company ran a blended gross margin of 41% and considered itself healthy. The quarterly table told a different story: after-hours emergency installs at 12% (floor 50%) and large-format printing at 18% (floor 35%). Emergency installs quoted day rate but consumed overtime at 1.5× (price drift); media costs had risen twice in eight months while the price list had not moved since 2023 (cost drift). The actions: a scope-change clause and a 1.5× after-hours rate on the quoting template, a 6% price move on large-format at the next customer notice, and the media line re-quoted to a second supplier. Next quarter's table: installs 44%, large-format 33%, blended margin 41% → 46% — roughly $2,100 a month recovered on the same revenue, for one hour of reading and two letters.
Where this sits in the system
- The budget vs actuals monthly review is where a margin problem first shows up as a variance — this page is where it gets traced to the specific job and lever.
- The debtor days review is the cash-side twin: margin earned late is margin financed by you.
- The 13-week cash flow forecast is where the recovered dollars become visible weeks before the P&L can show them.
- The month-end close produces the numbers this table reads.
Kits (the paid tools behind the free advice): The First 30 Minutes (free) · Ops Starter Kit $14 · Ops Starter Kit Vol. 2 $27 · Ops Mega Bundle $49.
Cross-posted; canonical at hive80-lab.github.io/ops-notes.
Top comments (0)