Shopify Sales Analysis: How to Read Reports and Decide What to Do Next
Shopify sales analysis is the practice of breaking store revenue into products, variants, channels, and traffic sources, then deciding what to reorder, promote, pause, or fix. A store-wide total tells you that sales moved. The useful output is a SKU, a channel, and a next action.
According to Shopify, the main analytics features are available on any subscription plan. Staff still need Analytics permissions to open dashboards and reports. This guide is the sales-focused pass: which numbers to trust, which default reports to open, and how to diagnose a drop before you buy more traffic.
What Shopify sales analysis should answer
Finish a session only if you can answer four questions with names, not vibes. What sold, in units and in net sales? What mixed, meaning which SKUs, variants, channels, and referrers moved the total? What reversed, including refunds, returns, edits, and cancellations? What you will do this week for a specific product or source?
If the only sentence you can write is “sales were down,” you reported a headline. You did not analyze the store. For the broader Monday loop that also covers inventory and landing pages, use the weekly Shopify analytics workflow. Stay here when the job is to read sales reports and leave with a work order.
Start on Analytics, then filter to Sales
From Shopify admin, open Analytics. Shopify says this dashboard shows key sales, sessions, and fulfillment metrics, updated within about 1 minute. Set one date range before you click a card. Last 7 days answers what changed this week. Last 30 days answers what is durable.
Then go to Analytics, then Reports, then filter Category to Sales. According to Shopify’s sales reports documentation, the data is up to date, give or take about 1 minute. Refresh if you just processed a refund. You can also ask Sidekick in plain language to investigate a change. Shopify’s own example: “Why did my sales drop this week compared with last week? Break it down by channel, product, and traffic source.”
On any report that shows a trend, compare the selected range to a previous period. Shopify displays the comparison as dotted or faded in the chart. Some reports, including Total sales over time, already include a previous 30-day comparison. Add Previous period or Previous year yourself when the default comparison is missing.
Read gross sales, net sales, and total sales as different numbers
Shopify publishes the formulas. Mixing them is how a discount-heavy week looks like a demand collapse, and how shipping-heavy orders look like a product win.
| Metric | Shopify definition | Use it to rank products? |
|---|---|---|
| Gross sales | Product price times quantity, before taxes, shipping, discounts, and sales reversals. Pending, canceled, and unpaid orders are included. Test and deleted orders are not. | No. Too easy to inflate with unpaid or canceled orders. |
| Net sales | Gross sales minus discounts minus sales reversals. | Yes. This is the ranking number for SKUs and variants. |
| Total sales | Gross sales minus discounts minus sales reversals, plus taxes, duties, shipping charges, and fees. | No for product rank. Use it as the all-in store figure. |
Average order value has its own formula. Shopify defines it as gross sales excluding adjustments, minus discounts excluding adjustments, divided by the number of orders. Adjustments are edits, exchanges, or returns made after the order was created. Track AOV on Total sales over time or Average order value over time, not as a substitute for product rank.
Sales reports do not track money moving between you and the customer. Shopify states that a sale shows the value of goods, not the payment you have already received. Chargebacks are excluded. Gift card product sales are also excluded from sales reports and from the Home total sales card. Shopify records those in finance reports instead. If a number looks short after a gift-card heavy week, check finance reports before you assume demand fell.
Rank products and variants, not the store total
Total sales over time
Open Total sales over time first. Group by day for last 7 days, then by week for last 30 days. This chart is the warning light. It does not name the SKU.
Shopify notes a trap on this report: if you edit an order after the day it was placed, the edit displays as a separate order. Adding custom columns can also split one order into one row per line item. An exported CSV then counts extra orders. Read order count in the admin table, not in a customized export, when you are judging volume.
Total sales by product and by variant
Open Total sales by product, then Total sales by product variant. These reports break sales down by title, and at variant level by SKU. Shipping is excluded because one order can hold several products and a single shipping charge. Tax on shipping is excluded for the same reason.
Sort by net sales and by net quantity for the last 30 days. Copy the top 10 SKUs. Repeat for the last 7 days. A product that ranks in both windows is a working seller. A product that only ranks in 7 days is a spike until it proves otherwise.
- Write the 10 SKUs with the highest net sales over 30 days, plus net quantity.
- Flag any of those SKUs that disappear from the 7-day list. Demand cooled, or stock ran out.
- Open the variant report when size or color mix matters. Reorder the variant that sold, not the parent product in bulk.
- Treat a dash in Product type or Product title as missing data at the time of the order, not a new SKU.
Shopify captures product details at the time of the sale. If you renamed a product mid-period, the same item can appear on two rows. Treat that as a labeling issue. Net quantity equals items sold minus items returned on this report.
Split sales by channel, referrer, and discount
Open Total sales by sales channel and Net sales by channel. The Sales channel column is the channel or app used to place the order, such as Online Store or Buy Button. Draft orders display as Draft Orders. An unnamed app displays as Other. This split tells you where the order was captured, not which ad the customer saw.
Open Total sales by referrer next. Shopify groups the last-interaction source as Direct, Search, Email, Social, or Unknown, and shows the host. Direct can look large when the referrer is blocked, the customer used a bookmark, a shortened URL, or an app. Do not cut a paid channel on Direct share alone.
High sales from a host you are not funding is a source to protect. High sessions later paired with weak sales from one host is a traffic quality problem. For product-level traffic, use the product traffic sources method after you have the SKU list from sales reports.
Open Sales by discount codes when a promo week is the question. Shopify groups sales by automatic discount name or code, and includes data for sales after May 1, 2017, 12:00am UTC. The sales value covers only line items affected by that discount. If discounts can combine, the same order can appear in more than one row. Do not add those rows together and call it extra revenue.
Diagnose a sales drop before you buy more ads
A falling total has a small set of common causes. Work them in order so you do not spend on traffic that cannot convert, or on ads for a SKU that is already out of stock.
- Compare last 7 days to the previous 7, and last 30 to the previous 30, on Total sales over time. A one-day spike or dip is not a trend.
- Open Total sales by product. If one or two SKUs explain the whole move, stop treating it as a store problem.
- Check sales reversals. Shopify shows a sale as a positive value on the order date and a reversal as a negative value on the process date. A refund week can look like a demand crash.
- Confirm inventory on the SKUs that usually carry the week. A bestseller at zero units will drop net sales while sessions stay flat.
- Open Total sales by referrer and by channel. If one host or channel fell and the catalog mix did not, the issue is acquisition, not the product page.
- Open Sales by discount codes. A code that expired, or a code that is stacking, can move net sales without a traffic change.
Leave sales reports with three SKUs and three moves. A dashboard without a work order is unfinished.
Pair sales with conversion and profit after you know what sold
Sales tell you what paid. Conversion tells you whether sessions turned into orders. Open Conversion rate over time and group by week. Shopify defines conversion rate as the percentage of sessions that resulted in a purchase. If sessions rose and conversion fell, you bought traffic that did not match the catalog. If both fell, you have a demand or availability problem, not only a page problem.
Open Conversion rate breakdown for the path. The default funnel is all sessions, sessions with cart additions, sessions that reached checkout, then sessions that completed checkout. Each step is sessions at that step divided by total sessions. Store-wide conversion is a warning light. It does not name the product that wasted the click. For that comparison, use the product conversion rate method against your own catalog average.
Then open Gross profit by product, but only after cost per item is on the variants. Shopify reports profit only for products and variants that had cost recorded at the time they were sold. Gross profit is net sales minus cost. Gross margin is net sales minus cost, divided by net sales, times 100. Shopify’s own example: $50 net sales and $30 cost is a 40% gross margin.
A high-revenue SKU with a thin margin can still be a bad promote. A lower-revenue SKU with a healthy margin can be the better collection slot. Discounts change the reported gross margin because it uses net sales, not the full price on the product page. For a tighter field list across revenue, conversion, and traffic, use the ecommerce performance metrics checklist on the SKUs you already ranked.
Run this 30-minute Shopify sales analysis
Put this on the same weekday every week. Do not add reports until this loop is boring.
- Set last 7 days and last 30 days on the Analytics dashboard. Write one sentence on what moved.
- Open Total sales over time. Confirm the move is more than one day.
- Open Total sales by product, then by variant if you sell sizes or colors. List the top 10 SKUs by net sales and net quantity.
- Open Total sales by sales channel and Total sales by referrer. Note any host or channel that moved with the total.
- Open Sales by discount codes if a promo ran. Do not sum overlapping rows when discounts combine.
- Open Conversion rate over time. If checkout drop-off grew, fix checkout before you buy more sessions.
- Open Gross profit by product for those same SKUs if cost per item is filled in. Promote margin, not only revenue.
- Hand the operator five actions max: restock, promote, pause a source, rewrite a collection slot, or stop replenishing.
Five actions is enough. Anything else waits a week.
Save the views you reuse, export only when someone else needs the file
Shopify lets you filter columns, change date ranges, and save a modified default report as a custom data exploration. Save a 7-day Total sales by product view with net sales and net quantity only. Save Total sales by referrer for last 7 days. Save Average order value over time grouped by week.
You can export most reports as CSV, XML, JSONL, or Apache Parquet. Print to PDF if you need a static copy. Export when someone outside admin needs the file. Do not rebuild the same sheet every Monday if the saved report already answers the question.
When native sales reports are enough, and when a product layer helps
Native sales reports explain what already sold, by SKU, channel, and last-click referrer. You still join those rows to product-page conversion, collection position, and days of cover by hand. Stay in admin if that join takes minutes. Add a product-level layer when that join is a weekly spreadsheet.
A product-level view is useful when you need conversion, traffic, and revenue on the same SKU without an export. Skymetrics product analytics is built for that join. Skip it if your actual gap is mixed metrics or a messy native setup. Clean gross versus net versus total first.
Open Total sales by product this morning. Set last 7 days. Write three SKUs and three moves before you close the tab.