Building a Shopify P&L
A store P&L runs from gross sales down to net profit through three checkpoints: gross profit, contribution margin and net profit. It differs from an accounting P&L by separating variable from fixed costs rather than grouping by expense type, because that split is what makes the statement usable for pricing and acquisition decisions.
Written by Atul Tirkey · Co-founder, NetNet
Updated September 6, 2026 · 4 min read
A profit and loss statement for a store is a specific document with a specific job: showing where money went between the customer paying and the business keeping what was left.
That is a different job from the P&L an accountant files, which is why running the business off the filed version tends to disappoint. Both are correct. They are answering different questions.
What a store P&L needs that an accounting P&L does not
An accounting P&L groups costs by category. Revenue, cost of sales, gross profit, then a long list of operating expenses in roughly alphabetical order, and a bottom line.
That structure satisfies a filing requirement. It also puts your shipping costs, your Meta spend and your accountant’s own fee in the same block, as though they were the same kind of money. They are not: two of them change when you ship more orders, one does not.
A store P&L reorganises the same figures by behaviour rather than by type. Costs that scale with order volume sit above the contribution margin line. Costs that do not sit below it. Nothing is invented or removed — the bottom line matches — but the middle of the statement now answers questions the filed version cannot.
The structure, top to bottom
Gross sales. Product revenue before anything comes off.
Less discounts, less returns → net sales. This is the revenue line everything below is measured against, and the denominator for every percentage on the statement.
Less cost of goods sold → gross profit. The pricing and sourcing verdict.
Less shipping, payment fees, packaging and fulfilment → contribution margin. The unit economics verdict, and the ceiling on customer acquisition cost.
Less advertising, less operating costs → net profit. The business verdict.
Three subtotals, each answering a question the others cannot. The discipline that makes it work is resisting the urge to add more: a statement with nine subtotals has none, because nobody knows which one to look at.
Choosing the rows
Between the subtotals, list costs at the granularity where you could act on them.
“Fulfilment — $18,900” is one row and tells you nothing. Split into shipping labels, packaging, and pick-and-pack, and a rise becomes attributable. Split further into eleven sub-lines and the statement becomes an inventory of receipts nobody reads.
The workable rule: a row earns its place if you can imagine doing something differently in response to it moving. Rows that fail that test belong grouped into “other operating costs” with the detail available underneath.
Percentages of net sales beside every value are not optional. A cost that grew 12% while revenue grew 20% got cheaper, and only the percentage column shows it.
The three checkpoints, and who reads them
Each subtotal has a natural audience, which is a useful way to decide whether the statement is doing its job.
Gross profit is for whoever owns pricing and sourcing. It moves when supplier costs change, when the product mix shifts, or when discounting deepens. It does not move because shipping got more expensive, which is precisely why it is separated from the lines that do.
Contribution margin is for whoever owns acquisition. It is the ceiling on what a customer can cost, and it is the number that should sit next to cost per acquired customer in every marketing conversation. A media buyer working from gross profit will systematically overpay, because the fifteen or twenty points between the two layers are real money that has already been committed.
Net profit is for whoever owns the business. Hiring, taking a salary, financing, and whether the current size is worth running at all.
When a store reports only one profit number, all three audiences end up using it, and at least two of them are using the wrong one. The most common version of this is a marketing team optimising against gross margin — the orders look profitable at the layer they are watching and lose money two layers down, where nobody is looking until month end.
Cadence and comparison columns
Monthly is the natural cadence for the full statement, with two comparison columns: prior month and the same month last year.
The prior-month column catches drift. The year-ago column catches seasonality that the prior month reads as a trend — a December-to-January decline is not a collapse, and a statement without the year-ago column invites treating it as one.
Weekly P&Ls are usually a mistake. Variable lines are meaningful weekly, but fixed costs land in lumps, so a weekly bottom line mostly measures which invoices happened to arrive. Watch contribution margin weekly and the full statement monthly.
Reconciling against your accountant’s version
The two statements should agree at the bottom and differ everywhere else. When they do not agree at the bottom, four causes account for most of it.
Inventory treatment. You expensed stock when purchased; they capitalised it until sold. This is the single largest reconciling item in most stores.
Refund timing. You attributed refunds back to the original order’s month; they recorded them when issued.
Owner compensation. You included a market-rate salary as a cost; their statement shows what was actually drawn.
Accruals. They spread annual invoices across the year; your management view may not.
None of these are errors. Write the differences down once, keep the list beside the statement, and the reconciliation takes minutes each quarter rather than becoming an annual argument about which number is real.
Software that produces this statement
Building the statement by hand once is worth doing; maintaining it monthly is what usually stops. Best Shopify P&L software compares the tools that generate it from your own cost configuration, and states where a spreadsheet is still the better answer.
A full month, top to bottom
One month for a store doing roughly $128,000 in gross sales, with every line a merchant would recognise from their own accounts.
- Gross sales
- $128,400
- Net profit
- $7,200
- Share kept
- 5.6%
| Line | Relative size | Amount |
|---|---|---|
| Gross sales | $128,400 | |
| Discounts | $9,600 | |
| Returns and refunds | $7,300 | |
| Net sales | $111,500 | |
| Cost of goods sold | $42,100 | |
| Gross profit 62% of net sales | $69,400 | |
| Shipping and delivery | $14,800 | |
| Payment and gateway fees | $3,300 | |
| Packaging and fulfilment | $4,200 | |
| Contribution margin 42% of net sales | $47,100 | |
| Advertising | $24,600 | |
| Operating costs | $15,300 | |
| Net profit 6.5% of net sales | $7,200 |
Three checkpoints, three different verdicts. A 62% gross margin says the pricing works. A 42% contribution margin says fulfilment is under control. A 6.5% net margin says the fixed cost base is heavy for this revenue. Each one points at a different lever, which a single profit number cannot do.
Where the numbers come from
Every figure above traces to a specific field in a specific system. These are the ones that matter, and where each one goes wrong.
| Figure | Source | Where it breaks |
|---|---|---|
| Gross sales, discounts, returns | Shopify order and refund records for the period | Refunds are dated when issued, so returns against earlier months land in this one unless reattributed. |
| Variable cost lines | Carrier invoices, gateway payouts, 3PL statements | These arrive on their own billing cycles, which rarely align with a calendar month boundary. |
| Operating costs | Bank statements and recurring supplier invoices | Annual charges billed in one month distort it unless spread across the twelve they cover. |
What this does not tell you
- This is a management statement, not a statutory one. It will not satisfy an auditor, it ignores depreciation and accruals, and the inventory treatment is deliberately simplified for operating decisions.
- A single month is a poor unit for judging fixed costs, because annual invoices and bulk stock purchases land unevenly and swing the bottom line without anything having changed operationally.
Frequently asked questions
How is a store P&L different from an accounting P&L?
An accounting P&L groups costs by type — cost of sales, then all operating expenses together. A store P&L splits them by behaviour: costs that scale per order above the contribution margin line, fixed costs below. The split is what makes it useful for pricing and acquisition decisions.
Should shipping revenue appear as income on a P&L?
It can, provided the shipping you paid appears as a cost. The simpler treatment for a management statement is to net them into one delivery line, since what matters operationally is whether shipping made or lost money.
Where does inventory belong on a store P&L?
Only the cost of goods actually sold appears here. Stock bought and not yet sold is an asset, not a cost. Expensing purchases on the month they were paid for is the most common error and makes seasonal buying look like a collapse.
What comparison columns should a P&L have?
Prior period and the same period last year, each with the percentage of net sales beside the value. Percentages are what make two differently sized months comparable, and most drift is visible in the percentage long before the absolute number looks wrong.
Keep reading — Profit fundamentals
Shopify net profit
The bottom line of the statement.
Shopify profit tracking
Keeping the statement current between month ends.