Your gross margin was 54% three months ago. This month it's 48%. Sales didn't drop -- if anything, revenue is up. Your bookkeeper says "COGS went up," which you already knew, because that's the only thing that could have moved. What you don't know is which cost, by how much, and whether it's a one-month blip or the new normal.
That's the question that actually matters, and it's not one a P&L answers by itself.
The Real Problem: "COGS Went Up" Is Not a Diagnosis
Most gross margin conversations stop at the total. Total revenue, total cost of goods sold, one percentage. When the percentage moves, the instinct is to explain it with whatever story comes to mind first -- "materials prices are up everywhere," "we had a big job this month," "labor's been tight." Sometimes that story is right. Often it isn't, and the owner ends up managing the wrong problem for two or three months before the real one shows up in a bank balance.
A gross margin analysis that's actually useful does two things a single percentage can't: it names which account moved, in dollars and as a share of revenue, and it separates a level shift (this account is now running higher every month) from a one-month event (a bulk purchase, a rate change that reverses, an unusual job).
QuickBooks and Xero will show you the COGS total. Neither will bridge the change into named accounts automatically, and neither will tell you whether last month's jump is durable. That's a manual pull -- Trial Balance for the current and prior period, broken out by account -- or a tool built to do that pull for you.
What a Margin Bridge Actually Does
A margin bridge takes revenue and COGS from your Trial Balance for two periods and calculates, per COGS account, how much that account's share of revenue changed. Materials at 21% of revenue last month, 25% this month -- that's a 400 basis point move, and it's the kind of shift that's easy to miss when you're only looking at the bottom-line percentage.
Done properly, it also pulls the largest single General Ledger line inside a flagged account, so you're not just told "materials moved," you're shown the invoice, the vendor, and the date that did the most work -- when one line genuinely dominates the account's activity. When it doesn't -- when the increase is spread across several normal-sized purchases instead of one anomaly -- a margin bridge worth using says so, instead of picking a number and pretending it's the answer.
Getting the Export Right: QuickBooks and Xero
The bridge is only as good as the two exports behind it, and most of the ways this goes wrong happen before a single formula runs -- at the export step, in QuickBooks or Xero, before the data ever reaches a spreadsheet.
What you actually need: a Trial Balance for two periods (last month and this month, or last year and this year if you're checking a year-over-year move), broken out by account, on the same accounting basis both times. Plus, if you want to trace which invoice moved a flagged account, a General Ledger detail export for that one account covering the period in question.
| Platform | Report to pull | Where to find it | Setting to check |
|---|---|---|---|
| QuickBooks Online | Trial Balance | Reports -> Business overview -> Trial Balance | Accounting method: Accrual (unless your books are cash-basis all the way through -- match whatever you normally review) |
| QuickBooks Desktop | Trial Balance | Reports -> Company & Financial -> Trial Balance | Set the date range to the exact month; QB Desktop defaults to fiscal year sometimes |
| Xero | Trial Balance | Accounting -> Reports -> Trial Balance | "Show accounts even if zero balance" -- otherwise a new COGS account with a partial month of activity can silently drop off the export |
The trap that catches the most people: exporting a "Profit and Loss" instead of a Trial Balance. A P&L shows the same COGS accounts, but usually pre-summarized into fewer lines than the chart of accounts actually has, and it can bury sub-accounts inside a parent total. A Trial Balance shows every account QuickBooks or Xero actually tracks, at the balance level, which is what a margin bridge needs to catch a sub-account move that a summarized P&L would hide inside its parent line.
Two periods, one basis. Pull last month's Trial Balance and this month's Trial Balance the same way, with the same accounting method (accrual or cash) both times. A bridge run on an accrual Trial Balance for one period and a cash-basis Trial Balance for the other will show a "move" that's really just a basis mismatch -- nothing actually changed, the export just measured two different things.
When you need the General Ledger detail too. Once the Trial Balance comparison flags an account -- Materials moved from 21.5% to 25.0% of revenue, say -- the next question is whether one invoice explains most of it. That's a General Ledger (QBO: Reports -> Accountant reports -> General Ledger; Xero: Accounting -> Reports -> General Ledger) filtered to that one account and that one month. Pulling the full GL for every account, every month, is unnecessary and slow; pulling it only for the flagged account, only for the month in question, is the fast version of the same check.
Multi-entity and class-tracked books. If the business runs multiple locations, classes, or entities inside one QuickBooks or Xero file, export the Trial Balance at the consolidated level unless the question is specifically about one location's margin -- mixing a consolidated revenue number with a single-location COGS export (or the reverse) will produce a bridge that looks calculated but means nothing, because the two halves of the ratio no longer describe the same business.
A five-minute sanity check before you paste anything in: does the Trial Balance's total revenue line match what you already know the business did in revenue that month? Does total COGS look like the right order of magnitude? If either number is obviously wrong -- a zero, a number ten times too large, a number that's missing a location -- the export itself has a problem, and no amount of correct bridge math will fix a bad input. This is the same discipline as checking your work before you start; a wrong export produces a confident-looking wrong bridge just as easily as bad bookkeeping does.
A Worked Example
Say Materials was 21.5% of revenue last month and 25.0% this month, with revenue holding roughly steady around $115,000-$120,000. That's a swing worth naming, not just noting.
| Last month | This month | Change | |
|---|---|---|---|
| Revenue | $116,000 | $118,300 | +2.0% |
| Materials (COGS) | $25,000 (21.5% of revenue) | $29,600 (25.0% of revenue) | +350 basis points |
| Largest single Materials line | -- | $13,100, one vendor, one date | 44% of this month's Materials total |
Because that one line is only 44% of the account's activity, no single invoice explains the full move -- the increase is spread across several ordinary purchases, which points toward a durable shift (a price increase, a new baseline) rather than a one-time event. If that same line had been 90% of the account's total, the story would point the other way: one purchase, worth a direct conversation with that vendor, not a trend.
These figures are a worked illustration, not a benchmark for your business -- typical ranges vary enormously by industry and should be read as a pattern to apply, not a number to match.
What This Does NOT Do
A margin bridge cannot tell you whether a COGS account moved because of price (your supplier raised rates), volume (you bought more because you sold more), or mix (you sold a different combination of jobs or products this month, some of which just cost more to deliver). Separating those three requires unit-level and quantity data -- a Trial Balance and General Ledger export doesn't carry that, and any tool that claims to split price from volume from mix off dollar totals alone is asserting more than the data supports.
What it can do is narrow the search: it tells you which account to go look at, and whether the move is a one-time event or a new baseline. From there, the price-versus-volume-versus-mix question is a conversation with whoever runs sales or operations, not a spreadsheet output.
It also won't fix a books-mess problem. If your Trial Balance itself doesn't tie out -- if postings land in the wrong period, or COGS gets miscoded to overhead -- a margin bridge will faithfully bridge bad numbers into a confident-looking wrong answer. Clean books are the precondition, not the output.
When Gross Margin Analysis Isn't the Right Starting Point
If the business is profitable on paper but the bank account is tight, that's usually a cash-timing problem, not a margin problem -- accounts receivable, inventory, and debt principal live on the balance sheet, not in gross margin. If you're not sure the numbers themselves are trustworthy yet -- postings look off, reconciliations aren't current -- a books cleanup comes first; a margin analysis run on unreliable data just produces a confident-looking wrong answer. And if the real question is "is this specific job or customer profitable," that's job costing, not a company-wide margin bridge -- the same total gross margin can hide one job subsidizing another, the same pattern that shows up when a business looks busy without the profit to match.
The Decision Path
Margin moved and you don't know why: pull two periods of Trial Balance revenue and COGS by account. If one account's share of revenue moved more than a few percentage points, that's your lead. Check whether the shift shows up in the trailing few months (a durable change) or looks like an outlier against them (closer to a one-time event). Only after you've named the account and the pattern does it make sense to ask whether price, volume, or mix is behind it -- and that answer comes from a conversation, not a formula.
FAQ
What's a good gross margin for a small business?
It depends entirely on the industry -- a services firm and a materials-heavy contractor have nothing in common on this metric. What matters more than the absolute number is the trend: is this month's margin consistent with the last several, or is it an outlier that needs an explanation.
Why did my gross margin drop when sales went up?
Usually because a COGS account grew faster than revenue did -- materials, labor, or subcontractor costs rising as a share of each sales dollar. It can also reflect a mix shift: more of this month's revenue came from a lower-margin product or job than usual.
Can QuickBooks or Xero show me this automatically?
Both will show total COGS and total revenue by period. Neither bridges a margin change into named accounts or separates a one-time event from a durable shift without a manual pull or a purpose-built report.
Is a margin bridge the same as a full profitability analysis?
No. A margin bridge explains what moved in gross margin at the account level. It doesn't replace job costing (profitability by job or customer) or a full financial statement review.
Next Step
If gross margin moved and the story you've been told doesn't quite add up, the first move is naming the account, not guessing at the cause. Margin Bridge is a $14.99 workbook that does exactly that from a Trial Balance and General Ledger export you already have -- paste it in and it reconciles every named COGS account's move against the total margin change, with the price/volume/mix limitation above disclosed in the workbook itself, not just this article.
If the deeper question isn't which account moved but whether the business is generating cash at all, the profit-cash diagnostic at GetAFractional is the better starting point -- see also the profit-cash pillar guide for the fuller breakdown of that question. A margin bridge answers "what moved," not "are we actually building cash."
This article is informational and does not constitute financial, legal, or tax advice. Consult a qualified professional for decisions specific to your situation.