Short Answer
A discount was profitable if the extra sales it added covered its discount cost and the promo's fixed costs. In Shopify, open Analytics > Reports, set Category to Sales, then read Sales by discount codes for the promo dates. Compare the promo weeks with the same weeks without the promo: the difference is what the promo added.
Total sales during a promo is the wrong number to judge it by. It includes every order that would have come in at full price anyway, and it leaves out what the discount cost you. The question is what the discount added, and whether that covered what it cost.
This page uses Shopify's sales reports and one estimate you make yourself: what the same weeks would have sold without the promo. Set that baseline before you read the promo's numbers, or the baseline you pick will match the result you wanted.
What It Depends On
Three things decide whether a discount paid for itself.
The baseline: what would have sold anyway
If you would have sold $40,000 in a normal week and you sold $50,000 during a promotion, your incremental revenue is $10,000 - not $50,000. The $40,000 baseline represents demand that existed before you ran the promo. You gave away margin on that $40,000 for nothing.
"The most expensive promo mistake is spending a discount on customers who were already going to buy. You did not drive that revenue - you taxed it."
Who bought: new customers or existing ones
A promotion that generates $10,000 in incremental revenue but attracts 200 new customers who each spend $300 over the next 90 days has compounding value. A promotion that generates $10,000 in incremental revenue and brings in 200 price-sensitive buyers who never return is a one-time trade with a thin margin.
The same headline number can represent a great promo or a destructive one. The five metrics below tell you which one you ran.
What the discount cost: depth and margin
High-discount promotions need significant incremental volume to break even on margin. Merchants who chase revenue numbers without tracking margin often run promotions that look profitable and actually destroy value.
How to Decide
The formula
All five metrics combine into a single ROI calculation you can run on any campaign:
Promotional ROI = (Incremental Revenue - Total Discount Cost - Fixed Promo Costs) / Total Promo Spend x 100
Where:
- Incremental Revenue = Promo Period Revenue minus 4-Week Rolling Average
- Total Discount Cost = Discount % x Promo Period Revenue
- Fixed Promo Costs = creative, platform fees, email send costs
- Total Promo Spend = Total Discount Cost + Fixed Promo Costs
At break-even, incremental revenue equals total promo spend, so the formula gives 0%. A result below 0% is a loss. A loss may be acceptable for an acquisition-focused campaign, but it needs the 90-day retention data (Metric 5) to validate the investment.
Metric 1: Incremental Revenue
What it measures: The revenue your promotion actually generated, above what you would have earned without it.
How to calculate it: Take your revenue during the promo period and subtract your four-week rolling average revenue for the equivalent period length. If your promo ran for seven days, your baseline is the average of the four preceding seven-day periods.
Incremental Revenue = Promo Period Revenue - 4-Week Rolling Average
The four-week rolling average is a method choice used in this guide, not a figure Shopify reports.
Shopify path: Analytics > Reports, set the Category filter to Sales, and open Total sales over time. Filter by the promo date range, then run the same report for the four preceding equivalent periods and average them.
Metric 2: New Customer Acquisition Rate
What it measures: Whether your promotion brought in new buyers or primarily rewarded your existing customer base.
How to calculate it: In Shopify Analytics, open the customer reports and filter to your promo date range. Calculate the percentage of orders from first-time buyers. Then run the same reports for a non-promo baseline period of the same length.
New Customer Rate = (First-Time Buyer Orders during Promo / Total Orders during Promo) x 100
Baseline New Customer Rate = (First-Time Buyer Orders during Baseline / Total Orders during Baseline) x 100
Metric 3: Average Order Value Impact
What it measures: Whether your promotion drove customers to spend more per order, or let them spend less.
How to calculate it: Compare your average order value during the promo to your four-week rolling average AOV.
AOV Impact = Promo Period AOV - 4-Week Rolling Average AOV
Metric 4: Margin Erosion Rate
What it measures: How much your promotion cost you in margin relative to the incremental revenue it generated.
How to calculate it: Total Discount Cost is the discount percentage times promo-period revenue. Add the fixed promo costs (creative, platform fees, email sends), then divide by the incremental revenue from Metric 1.
Total Discount Cost = Discount % x Promo Period Revenue
Margin Erosion Rate = (Total Discount Cost + Fixed Promo Costs) / Incremental Revenue
The threshold to watch: If your margin erosion rate exceeds 100% (discount and fixed promo costs exceed incremental revenue), the promotion lost money on margin. This can still be justified for acquisition (see Metric 2 and 5), but it must be a deliberate decision, not a surprise.
Metric 5: 90-Day Post-Promo Retention
What it measures: Whether your promotion attracted buyers who became repeat customers or only returned for the next sale.
How to calculate it: In Shopify Analytics, open the customer reports 90 days after the promotion ends. Find the customers whose first order fell inside your promo window. Calculate the percentage who placed a second order. This metric cannot be read until 90 days after the promo ends.
90-Day Retention Rate = (Promo New Buyers Who Repurchased within 90 Days / Total Promo New Buyers) x 100
How Do I See Which Discount Code Performed Best?
In Shopify, go to Analytics > Reports, set the Category filter to Sales, and open the Sales by discount codes report. Each row is one discount code, or one automatic discount under its title, with its discount amount, number of orders and total sales. Set the date range to the promo dates, and check each row against the baseline from the section above.
With combinable discounts, one order can appear in more than one row. Do not add the rows together to get total promo sales. Use the total sales for the period instead.
A code with the most orders is not always the one that added the most. Read each code's total sales next to its discount amount before you decide which code worked.
How to Make This a Routine
Before the next promo, write down one goal, the number it will be measured by, and the date you will review it. Put that review on the calendar when you set the promo's dates, so the review happens whether or not the early numbers look good.
Set the goal before the promo launches
The most common reason merchants cannot evaluate a promotion afterward is that they did not define what success looked like before it started.
Before every promotion, commit to one primary metric and a threshold for that metric. The four examples below are illustrations, one per promo type, not benchmarks:
- Acquisition-focused: "New customer rate above 35%, with 90-day retention above 20%"
- Revenue-focused: "Incremental revenue above $8,000, margin erosion rate below 80%"
- AOV-focused: "AOV lift of at least 12% above baseline, zero margin erosion on existing demand"
- Clearance-focused: "Units sold above X, margin erosion rate acceptable at any level"
Without a pre-defined goal, every promotion can be made to look successful in retrospect by choosing the right metric to highlight. Pre-defining the goal is what drives the mechanics of better promo decisions over time - see our guide to promotion management for how to structure the goal-setting workflow.
Measuring it automatically
PromoOS records revenue and orders for each promo it runs and shows them on the promo's dashboard card. It only measures promos you set up in PromoOS, not every discount in your store, so for a sale you ran only in Shopify, the formula and the report above are the method. You can see the numbers for each promo on its dashboard card.
The post-campaign debrief checklist
Run this checklist within 48 hours of every promotion ending. For a step-by-step version, use the post-campaign debrief template.
Revenue check
- Calculate incremental revenue using the 4-week rolling average method
- Compare to the pre-launch revenue goal you set
- Note the baseline demand during the promo (what would have sold without it)
Customer acquisition check
- Pull first-time vs. returning customer split for the promo period
- Compare to your store's non-promo baseline rate
- Log the count of new customers acquired - you will follow up at 90 days
AOV check
- Calculate AOV during the promo vs. 4-week rolling average AOV
- If AOV was flat on a threshold promo, review the threshold level
- If AOV declined on a percentage-off promo, note the expected range for this promo type
Margin check
- Calculate total discount cost (discount % x promo revenue)
- Add any fixed costs (creative, platform, email send)
- Calculate margin erosion rate against incremental revenue
- Flag if erosion rate exceeded 100% and document the acquisition justification
90-day calendar entry
- Set a reminder to pull 90-day retention for promo-acquired customers on [date + 90 days]
- Log the benchmark you will compare against (store baseline or your prior promo cohort)
Decision for next campaign
- Did this promo type meet its pre-defined goal? Yes / No
- What would you change about the discount depth, timing, or structure?
- Is this a repeatable campaign template? Tag it accordingly
Key Takeaways
- A discount was profitable if the extra sales it added covered its discount cost and the promo's fixed costs, not if promo-period sales were high.
- Revenue during a promo is not revenue from it. Incremental revenue (promo period minus rolling average) is the number that reflects promotional impact.
- The margin math is counterintuitive. A 20% discount on a 50% gross margin product cuts your contribution per unit by 40% - not 20%.
- New customer rate tells you who responded. Promo buyers who return within 90 days are valuable. Promo buyers who appear only during sales are a cost of acquisition, not a marketing success.
- AOV impact depends on promo type. Threshold promotions are designed to lift AOV; blanket discounts are not. Track them separately.
- Discount cannibalization is a real cost. Giving margin away to customers who were already going to buy is money spent on nothing. The rolling average baseline is your proxy for quantifying it.
- Define the goal before launch. Pre-defined thresholds make post-campaign evaluation objective instead of retrospective.
