Every number in Shopshot follows one rule: it must trace to a real order, reconcile to Shopify exactly, and never show fabricated confidence. We chose the boring path on purpose. Shopify's figures are the source of truth, and the profit math is built on top of that foundation, so you can click any number and drill to the orders behind it.
[Screenshot placeholder] An order's Financial Breakdown showing the line from Total sales (reconciles to Shopify) down to Net profit
The order of operations
Shopshot builds profit in a fixed sequence, the same at the order level and the store level.
Step | Line | How it is built |
1 | Total Sales | Gross Sales minus Discounts minus Returns, plus Taxes Collected and Shipping Charged. Reconciles to Shopify. |
2 | Net Sales | Total Sales minus taxes minus shipping charged. Matches Shopify's Net Sales definition. |
3 | Gross Profit | Net Sales minus order-level costs: COGS, shipping cost, payment fees, fulfillment. |
4 | Contribution Margin | Gross Profit minus Marketing Costs (ad spend and acquisition cost). |
5 | Net Profit | Contribution Margin minus Operating Expenses. |
Net Sales
Net Sales is Total Sales minus taxes minus shipping charged. Shopshot matches Shopify's own definition on purpose, so your store compares cleanly against benchmarks and against its own history.
Sales tax
Sales tax is stripped from the profit basis entirely. It is money you collect and pass on, not revenue you keep. Tax appears only where cash needs to reconcile against payouts. It never inflates or deflates profit.
Refunds vs returns
These are two different things and Shopshot keeps them separate. A refund is cash and reconciles to your Shopify payouts. A return is the sales portion of that refund only. A gross refund is shown as a parent figure with its components broken out, so cash movement and sales impact stay separate.
When returns are recognized
Returns are recognized on the processed date, when the refund clears, not on the original order date. This means a closed month never gets restated later.
Costs only reverse if the resource comes back
A cost reverses only when the underlying resource is physically recovered. Outbound shipping is sunk once a parcel is delivered, and a full refund does not zero out shipping you already paid. Acquisition cost is treated the same way: in the order waterfall it is marked as sunk, because ad spend does not return if an order is refunded.
COGS is snapshotted
Your COGS is captured when an order is ingested and stays attached to that order. Update a cost later and past orders keep the cost that was true when they happened. This prevents margin drift, where changing today's cost would silently rewrite last quarter's profit. See COGS.
One order, one resolved shipping cost
Each order gets exactly one shipping cost, chosen by a priority waterfall across your configured sources. The first available source wins. See Shipping Costs for the full order and what happens on partial coverage.
What we do not do
Shopshot does not use multi-touch attribution and does not guess at causality. Where a number cannot be known exactly, we say so rather than inventing a confident figure. No black boxes, no "trust us."
Common questions
Why is my Net Profit lower than my Shopify sales? Because sales are not profit. Shopshot subtracts the real costs Shopify's sales figure never included. See Understanding your Shopshot numbers vs Shopify.
Why didn't an old month change after I edited a cost? Because COGS is snapshotted at ingestion and returns are recognized when they clear, so closed months stay closed.
Does a refund give me back my shipping and ad spend? No. Outbound shipping is sunk once delivered, and acquisition cost is sunk once spent. A refund reverses the sale, not those costs.
Next step
Now see how this plays out against Shopify's own dashboard, so you can explain any difference with confidence. → Understanding your Shopshot numbers vs Shopify
Related
