Take a real month: $412,000 in revenue, a blended ROAS the ad platforms report as 4.1x, and an average order value that has been climbing for two quarters. On paper, that is a good month. None of those three numbers says anything about whether the business made money, because none of them subtracts what it cost to make, ship, and sell a single unit.
Revenue is what came in. ROAS is what the ad platform thinks it earned back. AOV is a price average. Profit is what is left after the cost of goods, the payment processor's cut, the box, the label, the return, and the ad spend that earned the sale are all taken out, and that number lives nowhere on a standard ecommerce dashboard unless someone deliberately built it there.
- Revenue, ROAS, and AOV are all reportable straight from platform exports. Real profit per order requires cost data, COGS, shipping, fulfillment, fees, returns, none of which Shopify or an ad platform tracks for you automatically.
- A contribution margin waterfall (CM1, CM2, CM3) turns "did we make money" into three separate, answerable questions instead of one vague one.
- The catalog-wide average almost always hides the real story: a handful of SKUs usually carry the account's entire profit while others sell briskly at a loss.
Why the dashboard you already have stops short
Every ecommerce platform ships a version of the same three numbers by default: revenue, sessions or conversion rate, and some flavor of ROAS. That is not an accident. Revenue and ad-platform ROAS are the two numbers a platform can calculate entirely from data it already has, its own order export and its own ad account. Neither Shopify nor Meta nor Google Ads has any idea what your product costs to make, what your 3PL charges per unit, or what percentage of orders come back.
Shopify's own profit reporting is the clearest illustration of this. Shopify's documentation on profit reports confirms gross profit and margin are only calculated for the specific products and variants that have a cost recorded, and the cost field itself is a manual entry, typed in per variant or bulk-imported. Skip that step for a product, which most stores do for at least part of their catalog, and that product is simply excluded from the profit report or shows an understated margin next to the SKUs that do have a cost entered. The platform is not hiding your margin from you. For any product without a recorded cost, it never had the number in the first place.
What real profit reporting actually requires
Getting from "revenue and ROAS" to "profit per order" means pulling in four categories of cost that live outside your analytics stack entirely:
- Cost of goods sold, what you actually paid the manufacturer or supplier per unit, entered per SKU and kept current as suppliers change prices.
- Payment and platform fees, the percentage-plus-flat-fee that Shopify Payments, Stripe, or a marketplace takes off every transaction before it ever reaches your bank account.
- Shipping and fulfillment, the outbound label cost, pick-and-pack fee, and packaging, which vary by weight, destination, and carrier and rarely match the flat shipping rate you charge the customer.
- Returns and refunds, both the lost revenue and the cost of processing, restocking, or writing off the returned unit.
None of these four show up in a GA4 or ad-platform export. They live in your supplier invoices, your 3PL's billing portal, and your payment processor's statement, which is exactly why most stores never connect them to a per-order profit number even when the raw data technically exists somewhere in the business.
The contribution margin waterfall: CM1, CM2, CM3
Once cost data is in place, the standard way operators turn it into a usable number is a contribution margin waterfall, three stages instead of one blended "profit" figure:
- CM1 (gross margin): net revenue minus cost of delivery, meaning COGS plus payment fees plus fulfillment. This answers whether the product itself is profitable to sell and ship, before any marketing cost enters the picture.
- CM2: CM1 minus ad spend. This is the number that answers whether the product is profitable to acquire a customer for, and it is the figure most weekly and monthly decisions should actually be made against.
- CM3 (net profit): CM2 minus operating expenses. This is the number that reconciles to the bank account, and it matters most at the monthly or quarterly close rather than in a weekly campaign review.
Collapsing all three into one "profit" line is exactly what most spreadsheets and off-the-shelf dashboards do, and it is why a founder can stare at a single margin percentage and still not know which lever to pull. A CM1 problem means the product or the fulfillment setup is the issue. A CM2 problem means acquisition cost is the issue. A CM3 problem might not be a unit-economics issue at all, it might be overhead. Three different problems, three different fixes, one collapsed number that cannot tell them apart.
Why the catalog average lies to you
Profit reporting only earns its keep once it runs at the SKU level, not just the store level. A blended store-wide margin of 24% can describe a catalog where two hero products carry a 55% contribution margin and a dozen slower SKUs sell at break-even or a loss, quietly dragged along by the winners. Average the whole catalog together and that split disappears into one comfortable-looking number.
A SKU-level margin is still only as trustworthy as the revenue underneath it, and that is where reporting quietly breaks first. In one reconciliation we ran, summed platform-attributed revenue exceeded the store's actual banked revenue by roughly 40% in the same window, traced to duplicate order IDs claimed as separate conversions by more than one ad platform at once. If a number that basic did not reconcile at the store level, splitting it out per SKU only spreads the same error across more rows. Revenue has to reconcile before cost data is worth adding on top of it.
There is no single "good margin" to benchmark a SKU against, either, which is exactly why the per-SKU view matters more than a blended target. NYU Stern's Aswath Damodaran publishes net margins by US industry, updated regularly, and retail alone splits into bands as different as Retail (Building Supply) at roughly 7.8% net margin, Retail (General) at roughly 5.6%, and Retail (Grocery and Food) at roughly 1.3%. If net margin swings that widely between retail categories at the industry level, a single blended margin target for an entire multi-category catalog was never going to mean much. The question has to be asked per SKU.
Build it yourself, buy a tool, or audit first
A quick search for "ecommerce profit reporting" mostly surfaces dedicated profit-tracking apps, and several of them do the job well: pulling COGS, fees, and ad spend from Shopify and the major ad platforms into one calculated margin view. For a store with clean product costs and reconciled order data, that can be the fastest path to a usable number.
The catalog-average problem above is the reason that is not always the right first move. If your store's revenue, your ad platforms' reported revenue, and your spreadsheet's revenue already disagree with each other, bolting a profit-tracking tool on top just gives three conflicting numbers a fourth, more confident-looking home. The tool will faithfully calculate a wrong number, because it inherits whatever reconciliation problem was already there.
That is the gap our ecommerce reporting audit is built to close first: mapping which of your current numbers reconcile, which decisions your reporting genuinely cannot support yet, true profit per order, per-SKU profitability, channel-level CAC against real margin, and what it would take to build a single, trustworthy profit view on top of a warehouse rather than a fourth disconnected app. It is a fixed-scope diagnostic, not an open-ended engagement, priced from $500 and delivered in one to two days once access is granted, with the fee credited toward the build if you move forward within 60 days.
If reconciliation is not the issue and the numbers already agree, our reporting metrics guide covers which short list of figures, MER included, actually belongs on the dashboard once the underlying data can be trusted.
The checklist to run before you trust any profit number
Work through these in order. Each one either passes or points straight at the next fix to make.
- Does store revenue match platform-reported revenue for the same window? If not, fix reconciliation before touching cost data at all. Our ecommerce reporting audit walks through exactly how that gap gets found.
- Is cost per item entered and current for every active SKU? A stale or missing cost field silently understates COGS for every order of that product until someone updates it.
- Are payment fees, shipping cost, and fulfillment cost captured per order, not estimated as a flat percentage? Flat-rate estimates hide the SKUs where real fulfillment cost runs well above the shipping fee charged to the customer.
- Is ad spend allocated to the SKU or campaign that earned it, not averaged across the whole catalog? Blended ad-spend allocation is what makes a losing product look profitable and a winning one look mediocre.
- Can you name your three least profitable SKUs by contribution margin, not by units sold or revenue? If the honest answer is no, the dashboard you are looking at is still a revenue report wearing a profit report's label.
A store that passes all five has a profit number worth making decisions on. A store that fails the first one should stop there, because every other fix built on top of unreconciled revenue just moves the same error into a more convincing-looking dashboard.

