Skip to content

Shopify's Sales by Discount Codes Report: Did the Promo Pay Off?

Read Shopify's Sales by discount codes report using Shopify's own definitions, then add cost and a baseline to see if your promotion actually made money.

Discount strategyThe diex team12 min read

The promotion is over, the orders are picked and packed, and now you want one number: did it make money? Shopify has a report for this, and it is genuinely useful, but it answers a narrower question than you might expect. This article shows you where the discount reports live, what Shopify's metrics actually mean (in Shopify's own words), the counting trap that combinable discounts create, and how to add the two things Shopify leaves out so you end up with contribution margin instead of a revenue number.

Start with the question the report can and cannot answer

The report tells you how much revenue carried a given discount and how much that discount cost you in list price. That is it.

It does not tell you profit, because the discount report carries no product cost. It does not tell you incrementality, because it has no way of knowing which of those buyers would have bought anyway. And it does not tell you the cost of training your list to wait for the next sale.

So treat the report as a measuring tape, not a verdict. You bring the cost data and the baseline; the report brings the revenue and the discount totals. Together those four inputs give you a defensible answer. One of them alone gives you a story you want to believe.

Find the discount reports in your Shopify admin

There are two native reports worth opening, and they live in different categories.

  1. Go to Analytics > Reports in your Shopify admin. Shopify groups its default reports into categories that include Sales, Finances and Profit, and you can filter the Reports list by Created by and select only Shopify to hide custom reports (Shopify Help Center: Default reports).
  2. In the Sales category, open Sales by discount codes. Shopify says this report "displays your sales grouped by the name of the discount, such as the automatic discount name or discount code" and that it helps you "view how often your discount codes are applied" and "understand which discounts are converting into the most sales" (Shopify Help Center: Sales reports). Automatic discounts appear here under the title you gave them, not just typed codes.
  3. In the Finances category, open Discounts by order. Shopify says this report includes the discounts that customers "received by using discount codes" plus "discounts that you applied during checkout in Shopify POS", and it separates line-item discounts ("discounts that were applied to a single product in an order") from order-level discounts ("discounts that were applied to an order as a whole") (Shopify Help Center: Finances reports). That split is the useful part: it tells you whether the money went off individual products or off the order as a whole. Note the documented scope, codes at checkout and POS discounts, which does not obviously cover a site-wide automatic discount.
  4. Set the window to your promo dates. Click the calendar icon or the Date range value in Filters, pick a custom range, and click Apply. Then click the Compare to or No comparison indicator, click Comparison to past, pick the range and click Apply (Shopify Help Center: Set time ranges).

Default reports "can be edited temporarily by adding or removing metrics, dimensions, or filters", but Shopify says those edits "don't override the original configuration of these reports", and that to keep your changes "you must save the data exploration as a custom report" (Shopify Help Center: Reports overview). Do that if you want the same view next quarter. The same page notes you can export reports for analysis in spreadsheet programs, which is where the real work happens.

What Shopify means by gross sales, discounts and net sales

The confusion usually starts with assuming the column names mean what they mean in your accounting software. Here are Shopify's definitions, verbatim from the Sales reports help page.

Metric Shopify's definition
Gross sales "product price x quantity (before taxes, shipping, discounts, and sales reversals)"
Discounts "line item discount + order level discount share"
Net sales "gross sales - discounts - sales reversals"
Sales reversals "All order adjustments that result in negative monetary value"
Total sales "gross sales - discounts - sales reversals + taxes + duties + shipping charges + fees"
Net quantity "number of sold items - number of returned items"

The same page documents a separate set of metrics specific to Sales by discount codes: Discount amount ("the total value of the reported discount"), Other discounts, Non-shipping discounts, Shipping discounts, Orders ("the number of orders that the discount was applied to"), Total sales and Shipping. Gross sales and net sales are defined on that page as general sales metrics, not as columns of this particular report, so if you do not see them in your view, add them with the temporary column edit above (Shopify Help Center: Sales reports).

Three consequences follow from those definitions.

First, gross sales is a list price figure, not money you received. Shopify also notes that "pending, unpaid, and canceled orders are included in the reports", so a wave of failed payments or canceled orders inflates it (Shopify Help Center: Sales reports).

Second, net sales is the number you want for margin work, not total sales. Total sales adds taxes, duties, shipping charges and fees back in. Taxes and duties are not yours, and shipping charges offset shipping cost, so including them makes a discount look more successful than it was.

Third, sales reversals is broader than returns. Shopify's definition covers returned products, cancellations, edits and adjustments to shipping, taxes, fees and discounts, and says they display as negative values on the date they were processed, not the date of the original order. That timing gap matters, and we come back to it below.

Why one order can show up on several rows

This is the trap, and it is the reason you cannot read the report as a list of orders. Shopify says it outright on the same help page: "If you have combinable discounts on your store, then the same order might be included multiple times. The order displays one time in each row for every applied discount." The page also warns that "the sales value in this report includes only the total sales for the specific line items affected by the discount codes" (Shopify Help Center: Sales reports).

So if a customer uses a 20% off product discount and a free shipping discount on the same order, that order contributes to two rows. Add up the net sales column across all discount rows and you will overstate your discounted revenue.

This is not an edge case. Shopify supports combining "order discounts with free shipping discounts", "product discounts with free shipping discounts" and "product discounts with other product discounts on separate items", with product-plus-order and order-plus-order combinations available to eligible merchants and "product discounts combined with other product discounts on the same item" on Shopify Plus. Customers "can use a maximum of 5 product or order discount codes and 1 shipping discount code on the same order" (Shopify Help Center: Discount combinations). If you want a refresher on what stacks with what before you set the next campaign up, we wrote that up in Shopify discount combinations: what actually stacks.

Two practical rules:

  • Use Sales by discount codes to rank discounts against each other, never to total them up.
  • For order counts, read the Orders metric on each row, which Shopify documents as "the number of orders that the discount was applied to". Do not count rows. And do not sum the Orders column either: an order that used two combinable discounts is counted once on each of those rows, so the total across rows exceeds your real discounted order count.

Add the two columns Shopify leaves out: cost and baseline

Cost

Shopify does have cost data, just not in the discount report. Profit reports (including Gross profit by product and Profit margin by order) show cost of units sold and gross margin, which Shopify calculates as "([net sales - cost] / net sales) * 100". The catch is the prerequisite: "Profit is reported only for products and variants that had a cost recorded at the time they were sold", and the Cost per item field "contains static data, which means that the data in your profit reports is only relevant to a specific point in time" (Shopify Help Center: Profit reports).

If you never filled in Cost per item, your profit reports are blank or partial and no amount of reading the discount report will fix it. Fill it in before the next promotion, not after.

The discount report carries no cost column, so the practical move is to export it, apply a blended cost percentage for the products in the promotion, and accept the approximation. That is fine for a go or no-go decision on a repeat promo.

Baseline

A discount week with good numbers is only good relative to a week without it. Pick the comparison period deliberately: four similar weeks before the promo, averaged, is usually better than the single prior week. Avoid periods containing another promotion, a paid traffic spike or a stock-out.

The before-the-fact version of this calculation (how deep you can go before the math stops working) is in how deep a discount can go before it costs you money. Run that first, then use the report to check whether reality matched.

A worked example: reading a 20% off week end to end

Every number in this section is invented to show the arithmetic. None of it is data from real stores. Use your own figures.

For example, say you ran an automatic 20% off site-wide discount for one week. Open Sales by discount codes, find the row for that discount, and make sure Gross sales and Net sales are among the metrics shown; add them with the temporary column edit if they are not. Say the row then reads gross sales of $50,000, discounts of $10,000 and net sales of $40,000. Say your blended cost of goods is 45% of full retail price. Units moved at a list value of $50,000, so cost of goods is 0.45 x $50,000 = $22,500, and contribution for the promo week is $40,000 minus $22,500 = $17,500.

Now the baseline. Say the four weeks before averaged $30,600 gross sales, $600 of discounts (a few loyalty codes) and $30,000 net sales. Cost of goods at 45% of $30,600 is $13,770, so baseline contribution is $30,000 minus $13,770 = $16,230.

Compare the two numbers you just calculated. Net sales in this example went from $30,000 to $40,000, a rise of about 33%, which looks like a clear win. Contribution went from $16,230 to $17,500, a rise of $1,270, or about 8%. That gap is the whole point of doing the calculation: you moved about 63% more goods measured at list value and kept an extra $1,270 for it.

Then the returns arrive. Say $2,000 of sales reversals land in the following two weeks and the goods come back sellable at $1,100 of cost. Net sales for the promo drops to $38,000 and you recover $1,100 of inventory, so contribution falls by $900 to $16,600. The gain over baseline is now about $370, before any ad spend, email send cost, extra pick and pack labor or payment processing on the higher order count.

In that example, the promotion broke roughly even and consumed a week of your team's attention. Worth knowing. Also worth knowing that the same calculation on a 10% depth might have cleared a real profit.

Red flags in the numbers: returns, stacking and self-selection

  • Returns land late. Sales reversals are recorded on the date the adjustment was processed, so a report pulled the day after a promo looks better than the same report pulled 30 days later. Re-pull it after your return window closes.
  • Stacking double-counts. Covered above. If your discount rows sum to more than your store's net sales for the period, that is the symptom, not a bug.
  • Self-selection. With a site-wide automatic discount, everyone who would have paid full price that week took it anyway. With a code, some full-price buyers never apply it. Either way the report cannot separate them from new demand, so a high net sales figure on a site-wide discount is partly just your normal business, repriced.
  • Shipping discounts sit outside the Discounts column. Shopify defines Discounts as "line item discount + order level discount share", so a free shipping discount does not land in that column; it shows up as lower shipping charges collected. The report does carry a separate Shipping discounts metric, "the total value of all shipping discounts applied to orders with this discount", so pull that column if free shipping was part of the offer (Shopify Help Center: Sales reports).
  • Missing cost data. If Cost per item was blank at the time of sale, that product contributes nothing to profit reports. Partial cost coverage produces a margin number that is quietly wrong.
  • Cannibalization across rows. A deep code can starve a shallower one. Compare both rows for the period, not the deep one in isolation.

Record the intent alongside the numbers while you still remember it. If you run your campaigns with diex - Discount Expert, every discount has a timeline where your staff can leave comments only staff can see, which is a reasonable place to write "tested 20% site-wide, net sales up but contribution barely moved, try 10% next time" before the context evaporates.

What to check this week

  1. Open Analytics > Reports, find Sales by discount codes in the Sales category, set the date range to your last promotion, and compare it to the four weeks before.
  2. Export it. Add a column for blended cost of goods and a column for your baseline, then compute contribution for both periods.
  3. For order counts, read the Orders metric on each discount row instead of counting rows, and remember that an order using two combinable discounts appears once under each, so those counts cannot be summed. If you also want the line-item versus order-level split, open Discounts by order in the Finances category, keeping in mind its documented scope is codes used at checkout plus Shopify POS discounts.
  4. Re-pull the same report once your return window has closed and see how much of the gain survives.
  5. Audit Cost per item on the products you plan to discount next. If it is blank, fill it in now so the profit reports work after the next campaign.
  6. Write down the depth you will test next time and why, before the planning meeting decides for you.

Sources

  1. Shopify Help Center: Sales reports (gross sales, discounts, net sales, sales reversals, total sales, Sales by discount codes metrics)
  2. Shopify Help Center: Default reports (report categories in the admin, filtering by Created by)
  3. Shopify Help Center: Finances reports (Discounts by order, line-item and order-level discounts)
  4. Shopify Help Center: Profit reports (gross margin formula, cost per item requirement)
  5. Shopify Help Center: Reports overview (editing default reports, exporting, custom reports)
  6. Shopify Help Center: Set time ranges in reports (date range and comparison)
  7. Shopify Help Center: Discount combinations (classes that combine, 5 code limit)

Drafted with AI from the sources above and checked automatically against them and our product facts. Spotted a mistake? Email help@diex.app.

More articles

Run the promotions you actually want to run

Install diex from the Shopify App Store. One plan at $29.99 a month, billed by Shopify.