Shopify Profit Tracking
Tracking Shopify profit continuously means four data flows arriving on their own schedules and being joined back to orders: sales and refunds from Shopify, costs from carriers and gateways, spend from ad platforms, and your own cost settings. What makes it tracking rather than reporting is that the number updates without anyone rebuilding it.
Written by Atul Tirkey · Co-founder, NetNet
Updated September 6, 2026 · 5 min read
Most stores do not have a profit problem. They have a latency problem.
The arithmetic is rarely wrong. What goes wrong is that it runs once a month, so every decision made in between is made against a number that was assembled weeks ago, from a period that has already ended.
What “continuous” actually requires
Continuous tracking is not a faster spreadsheet. It is a different arrangement, and it needs three things a monthly rebuild does not.
Data that arrives on its own. Orders, refunds, carrier charges, gateway fees and ad spend all have to flow in without anyone exporting a file. The moment a step requires a person, the cadence collapses to whenever that person has time.
A stable join key back to the order. Costs arrive from systems that know nothing about Shopify order numbers. Carrier invoices carry tracking numbers, gateway records carry transaction IDs, 3PL charges carry their own references. Keeping those keys attached as data lands is what makes attribution possible later.
Cost settings with effective dates. COGS, shipping rates and fee percentages change. Without a date attached, a supplier price rise silently recosts every historical order, and last quarter’s margin changes because you updated a number today.
Miss any of the three and you have faster reporting, not tracking.
The four flows and their cadences
Sales and refunds — effectively immediate. Orders can be processed as they land, which means revenue and cost of goods are known within seconds of a sale.
Ad spend — daily. Platforms restate the last few days as attribution settles, so the most recent figures are provisional by nature. Pulling more often than daily adds noise, not accuracy.
Carrier and gateway costs — days to weeks. Labels are billed on the carrier’s cycle, fees settle inside payouts, adjustments arrive later still. Recent orders are always partially costed and should be marked as such rather than presented as complete.
Your own cost settings — whenever they change, with the date they took effect.
The consequence is that a continuously tracked number is a blend: fully costed for older orders, partially costed for recent ones. That is not a flaw to be hidden. It is the honest state of the data, and showing which part is still settling is what stops people treating a three-day-old margin as final.
What to watch daily, weekly, monthly
Daily — contribution margin rate and cost per acquired customer, as rates rather than totals. These are the two numbers that move fast enough for a day to matter, and the two that give early warning of everything downstream.
Weekly — margin by product, by discount code and by channel. Weekly is the shortest window with enough orders in each bucket for a comparison to mean anything, and it is where mix shifts become visible.
Monthly — the full P&L, with fixed costs and comparison columns. Fixed costs arrive in lumps; looking at them more often measures invoice timing rather than performance.
The mistake is inverting this — watching net profit daily, where it is pure noise, and margin by product monthly, where the finding arrives too late to act on.
Thresholds worth alerting on
Alerts should fire on rates crossing lines, not on totals changing.
Contribution margin rate below a floor, set a few points under your normal operating range. This catches promotions running longer than intended and free-shipping thresholds set too low.
Acquisition cost above the margin it has to clear. The comparison that matters is CAC against contribution margin per order, not CAC against a target from last quarter.
A discount code performing below store-average margin. This is where the fortnight in the example above would have surfaced on about day two.
Orders shipping with no cost of goods attached. Uncosted orders count as pure margin and quietly inflate every number above.
Four alerts is close to the practical maximum. Beyond that they get muted, and a muted alert is worse than none because it creates the impression of coverage.
Marking what is still provisional
The hardest part of showing a live number is being honest about which parts of it have settled.
An order placed this morning has known revenue and known cost of goods, an estimated shipping cost, and no chargeback history at all. An order from three months ago has all of those resolved. Presenting both at the same confidence invites people to treat today’s margin as though it were final, then to be surprised when it drifts.
The workable convention is to show the figure with an indication of how much of the period is fully costed — how many orders still have estimated shipping, how much spend is still provisional. It costs one line of interface and it prevents the single most common failure of live dashboards, which is not inaccuracy but false certainty.
Why staleness costs more than imprecision
Given a choice between a number that is accurate to the cent and arrives in three weeks, and one that is within a percent and arrives today, the second is worth more — because a decision informed at the point it is made can change an outcome, and an audit of a period that has already closed cannot.
This is not an argument for tolerating sloppy inputs. Uncosted products and stale rates need fixing, and precision matters enormously for the P&L that goes to an accountant or a lender.
But the operational value of profit data is almost entirely a function of how quickly it can change what you do next. The example above cost $2,256 not because anything was calculated incorrectly, but because the correct calculation ran fourteen days after it would have been useful.
Which tools do this
Continuous tracking is a category rather than a feature, and the products in it meter and model costs differently. Best Shopify profit tracking apps ranks them against the criteria above and names what each one, ours included, is worse at.
What a fortnight of latency cost
A discount code that was set to stack with an existing promotion, running for fourteen days before anyone rebuilt the monthly file and noticed.
| Line | Relative size | Amount |
|---|---|---|
| Net sales on the code, 14 days | $18,400 | |
| Cost of goods sold | $7,360 | |
| Shipping, fees and packaging | $3,496 | |
| Contribution margin 41% — six points below the store average | $7,544 | |
| Ad spend driving the code | $9,800 | |
| Result over 14 days | −$2,256 |
Every individual number here was available on day one. Nothing was hidden and nothing was miscalculated. The loss existed only because the calculation ran monthly, so the pattern had fourteen days to compound before anyone was in a position to see it.
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 |
|---|---|---|
| Orders and refunds | Shopify webhooks, or a scheduled pull if webhooks are not available | Webhooks can be missed or delivered twice, so a periodic reconciliation pass is still required. |
| Carrier and gateway costs | Provider APIs or invoice imports, matched by tracking and transaction ID | These settle days behind the order, so recent periods are always partially costed. |
| Ad spend | Platform APIs, pulled daily per account | Platforms restate spend for the previous few days, so yesterday's figure is provisional. |
| Cost settings | Your own COGS, shipping rules and fee rates | These change over time and need effective dates, or historical orders get recosted at today's prices. |
What this does not tell you
- Continuous tracking makes recent periods visible, not final. Anything inside the last few weeks is still missing carrier adjustments and disputes, and reading it as settled invites overreaction to noise.
- More frequent measurement does not improve a number whose inputs are wrong. Uncosted variants and stale shipping rates produce a confidently incorrect figure faster, which is worse than a slow correct one.
Frequently asked questions
How often should profit actually update?
Sales and margin can update per order. Ad spend is realistically daily, since platforms restate recent figures. Carrier and gateway costs settle over days to weeks. The useful target is a number that is hours old at the top and honest about what is still provisional underneath.
What is the difference between profit tracking and profit reporting?
Reporting produces a figure for a closed period, on request. Tracking maintains the figure continuously so a problem surfaces while it is still happening. The same arithmetic, but one arrives in time to change the outcome.
What should trigger an alert?
Changes in rates rather than totals: contribution margin percentage falling below a threshold, cost per acquired customer rising above the margin it has to clear, or a discount code whose orders come in below the store's average margin.
Do I need software to track profit continuously?
Not necessarily, but a spreadsheet is only as fresh as the last time someone rebuilt it, which in practice is monthly. The threshold is usually multiple cost sources or enough refunds to keep reopening closed periods.
Keep reading — Profit fundamentals
Building a Shopify P&L
The statement this feeds each month.
Is my Shopify store profitable?
Reading the numbers once they arrive.