Shopify records what your customers paid, to the cent and on the right day. What it cannot record is what you paid: your supplier prices as they changed through the year, your 3PL's rate card, what each payment provider keeps, and what you spent on Meta yesterday. Four costs, none of which has a place to live in your store admin, and together they are usually the difference between a healthy looking revenue chart and a business that is barely profitable.
What Shopify is genuinely good at
This is worth saying first, because the argument is about scope and not about competence. Orders, line items, discounts, shipping charged, taxes, refunds and payment transactions are all in Shopify, they are accurate, and they are attached to the right dates. Everything a profit statement needs on the revenue side is already in your store, and any tool that claims otherwise is selling you something.
The gap opens on the cost side, and it is structural rather than an oversight. Shopify is a commerce platform. Your carrier contract, your gateway rates and your ad accounts are not its business, and it has never pretended they were.
Cost one: what the goods actually cost you
Shopify holds a cost per item on every variant, and it is genuinely useful. Two things stop it being enough. The field is optional, so most catalogues have gaps, and nobody goes back to fill it in for the products that were added in a hurry. And it holds one value with no dates on it. Shopify captures the cost as the sale happens, so changing the field today does not rewrite yesterday's report, which is better behaviour than the spreadsheet most merchants start with. What it cannot do is hold two facts at once, or put a cost into a sale that went out without one.
The second limitation is quiet rather than dramatic, and it compounds. A sale that shipped before you filled the field in can never be costed afterwards, so the products you documented last are the ones your margin history will never cover. The fix is effective dating: a cost carries the day it starts applying, so April's orders keep April's cost, and a cost entered late can still be dated to when it was actually true. There is more on the mechanics in what Shopify's COGS report leaves out.
What happens to a missing cost differs from tool to tool, and that is the trap. Shopify leaves those sales out of its profit reports rather than costing them at zero, which is the honest choice, but it means a margin percentage computed over part of your sales sits beside a revenue chart covering all of them. The moment the same data reaches a spreadsheet, a blank becomes a zero and the variant reports a 100% margin, which does not look like an error, it looks like your best product. The only safe treatment is to count the affected units and name them.
Cost two: getting the parcel to the customer
This is the cost merchants underestimate most, because it is not one cost. A single order carries a shipping charge from the rate card for its destination zone and parcel weight, a pick and pack fee with a base per order and a rate per additional item, the packaging itself, packaging EPR fees on the materials in it, and, if it comes back, a return label and a handling charge.
On the example store used throughout this site, an apparel catalogue doing about €10,6M a year, those five components came to €1.046.422,49 over fourteen months, which is 8,44% of net revenue. The shipping rate card was €722.229,64 of it, pick and pack €205.316,50, packaging €60.794,25, EPR fees €10.574,95, and return processing €47.507,15.
None of that is in Shopify, because none of it is Shopify's. It is in a PDF from a 3PL, and it is charged per parcel rather than per order, which matters the first time an order ships in two boxes.
Cost three: being paid
Every gateway charges a percentage of the amount plus a fixed fee per transaction, and the rates differ by provider, by card type, by country and by what you negotiated. Shopify shows you the payout, not the rule, which means you cannot answer the two questions that matter: what is my blended rate across the four ways customers pay me, and what would it be if the mix shifted.
Two details make this harder than a single rate can express. An order split across two payment methods is charged by both providers. And a refund does not give the fee back: it was charged on the original transaction and it stays charged. If you want to see what your own mix costs you, there is a Shopify payment fees calculator that does the blended arithmetic.
Cost four: finding the customer
Shopify has no idea what you spent yesterday on Meta, Google or TikTok, and it never will. It also has no idea about the influencer on a monthly retainer or the affiliate payout, which is usually a meaningful share of spend in a growing store and never appears in an ad platform at all.
Pulling the ad platforms' own numbers into a sheet does not solve it either, because each platform reports revenue it can plausibly claim, and those claims overlap. Add three platforms' reported revenue together and you will often clear your actual Shopify revenue. The spend figures, however, do not overlap: a euro spent is spent once. That is why blended ratios built on your own revenue and your own spend are the honest version.
What the four do to the picture
Here is the same example store, first as Shopify would show it and then all the way down.
| Line | Amount | Where the number comes from |
|---|---|---|
| Gross revenue | €15.194.923,20 | Shopify |
| Returns | €730.522,43 | Shopify |
| VAT | €2.064.285,92 | Shopify |
| Net revenue | €12.400.114,85 | Shopify |
| Cost of goods | €4.866.067,47 | Your supplier prices, dated |
| Logistics | €1.046.422,49 | Your 3PL and carrier contracts |
| Payment fees | €426.721,51 | Your gateway rates |
| Marketing | €3.144.072,34 | Your ad accounts, plus retainers |
| Overhead | €534.946,76 | Your fixed costs |
| EBITDA | €2.381.884,28 | Only after all five |
€15,2M of gross revenue became €2,38M of profit, which is 15,7% of the revenue figure and 19,21% of net revenue. Everything between the fourth row and the last is invisible to a store admin, and the four costs in the middle are four times the size of the overhead most merchants worry about.
Why the spreadsheet stops working
Almost every merchant tries the spreadsheet first, and it is the right instinct. It works for a few months and then fails for three reasons, always the same three.
- It is rebuilt by hand, so it is a few weeks behind, and a profit number that arrives on the 20th cannot change a decision made on the 3rd.
- It prices old orders at today's costs, because a cell holds one value, so history quietly rewrites itself every time a supplier price changes.
- Refunds land in the wrong month. A refund booked back against the original order makes a closed month keep moving, and nobody trusts a report that changes after they read it.
The third one is worth its own read, because it is a decision every merchant makes implicitly and almost none makes deliberately: which day a refund belongs to.
What a complete answer needs
Keep the raw data and the cost rules apart, and compute the statement from both. The orders, refunds and payments come from Shopify unchanged. The cost rules are yours, each carrying the date it takes effect. The statement is derived from the two every night, which means it is never stale and a cost correction reprices exactly the days it should and no others.
You do not need all four costs on day one to get value. Shopify alone gives you everything from GMV down to net revenue and net average order value correctly. Add product costs and you have what is CM1. Add logistics and payment fees and you have CM2. Add ad spend for CM3, and overhead for EBITDA. Anything still missing should be flagged rather than counted as zero, because a gap you know about is worth more than a number you cannot trust.
That is what profit tracking for Shopify is for: not a better revenue chart, which you already have, but the four costs Shopify has no field for, put in the right place on the right day.