At a glance
Daily timeseries of total discount applied to orders. The promotional health view: when did promotions run, how heavy were they, what was the post-promo recovery shape?
| What it counts | DATE_HISTOGRAM(day, SUM(totalDiscounts)) over the 90-day window. Sum of discount value applied per day, including order-level and line-item-level discounts. |
| API endpoint | Admin GraphQL. Order.totalDiscounts plus Order.discountApplications for breakdown by source. |
| Discount sources included | Manual codes, automatic discounts, Shopify Functions discounts, buy-X-get-Y, free-shipping discounts (where the discount is recorded as a line). |
| VAT / tax treatment | Discount values follow store tax setting; VAT-inclusive stores show VAT-inclusive discount amounts. |
| Shipping | Free-shipping discounts ARE included in totalDiscounts. |
| Refunds | Refund-related adjustments NOT separately tracked here; cross-reference Refund Value. |
| Cancelled / voided orders | Discounts on cancelled orders still bucket on their order day. |
| Currency | Multi-currency arithmetic sum WITHOUT FX conversion. Filter to single currency for accurate stores transacting in multiple. |
| Channels / sources | Online + POS + B2B all contribute. POS price adjustments at the till count as discounts. |
| Time window | 90D (daily buckets) |
| Alert trigger | None on this card directly; pair with Discount % of Revenue for the alerted ratio. |
| Roles | owner, marketing |
Calculation
Worked example
A US apparel brand on Shopify Plus. Period: 12 Feb 26 to 12 May 26. Daily total-discount summary:| Period | Avg discount / day | Notable peaks |
|---|---|---|
| 12 Feb to 25 Feb | $850 | Steady (welcome code, base level) |
| 26 Feb to 04 Mar | $1,140 | Mild lift, tiered loyalty unlocks |
| 05 Mar to 09 Mar | $8,200 | Spring promo: SPRING20 / 20% off |
| 10 Mar to 14 Mar | $4,180 | Code still live but tapering |
| 15 Mar to 24 Mar | $920 | Returned to baseline |
| 25 Mar to 12 Apr | $880 | Steady |
| 13 Apr to 16 Apr | $3,640 | Easter campaign |
| 17 Apr to 25 Apr | $980 | Recovery to baseline |
| 26 Apr to 12 May | $1,020 | Steady, slight lift from Mid loyalty unlocks |
- Two clear promo events stand out. Spring (05-09 Mar peak) and Easter (13-16 Apr). Each shows a clean ramp-up, peak, and return-to-baseline shape.
- The Spring tail (10-14 Mar) reveals coupon stacking. $4,180 / day for 5 days after the peak suggests the SPRING20 code wasn’t fully shut down, or it was extended via influencer codes that overlapped. Pair with Top Discount Codes to confirm.
- Baseline is informative. 1,020 / day is the “always-on” promotional cost: welcome codes for new subscribers, abandoned-cart vouchers, loyalty-tier unlocks. This is structural and rarely worth fighting; the question is whether the promo events are paying back vs the always-on cost.
- Promotion-to-recovery shape matters. Spring’s recovery to baseline took 6 days (15-20 Mar); Easter’s took 3 days. Faster recovery suggests Easter was driven by genuine seasonal demand; Spring may have pulled forward demand that would have come anyway, hurting margin.
- POS discounts contribute the surprise. A staff training week 26-28 Mar included a 20% off employee discount across 3 retail outlets, contributing $640 / day in line items. The card sums all sources; bonus categories (employee, wholesale, charity) need filtering at the source-tag level for cleaner promotional analysis.
Sibling cards merchants should reference together
Discount timeseries needs context. Pair with these:| Card | Why pair it with Discount Over Time | What the combination tells you |
|---|---|---|
| Total Discount | The 30D summary value. | Trend reveals the shape; total gives the headline. |
| Discount % of Revenue | Discount as a share of revenue. | A high discount day on a high-revenue day is healthy; a high discount day on a flat-revenue day is margin destruction. |
| Revenue Over Time | Revenue counterpart timeseries. | Plot together, the lift in revenue on promo days quantifies promotional ROI. |
| Top Discount Codes | Which codes drove the peaks. | Identifies which coupon caused which spike. |
| AOV | AOV usually drops during promos. | The AOV dip during a discount peak quantifies promotional cost in unit-economics terms. |
| Orders Over Time | Volume counterpart. | Orders × AOV × (1 - discount %) = revenue; the timeseries decomposition of growth. |
google_ads.google_promo_keywords | Ad spend on promo keywords. | Aligns promo timing with paid-search amplification. |
Reconciling against the vendor’s own dashboard
Where to look in Shopify Admin: Analytics → Reports → “Discounts” → set the date range and resolution. Shopify’s report gives daily / weekly discount totals plus a breakdown by code. The headline number should align with this card to within sync-lag tolerance. Other Shopify Admin views:- Reports → Sales by discount: same data, different framing.
- Discounts page: shows current active codes; not historical.
- Apps like Lifetimely, Polar Analytics: build profit-aware discount views by allocating margin per discount; useful complement.
| Reason | Direction | Why |
|---|---|---|
| Time zone | Boundary days | Shopify uses store time zone for buckets; Vortex IQ uses store time zone for daily bars but UTC for window edges. |
| Discount source | Either | Shopify can split by discount type or app source; this card aggregates all discount types into one timeseries. |
| Refund-attached discounts | Either | Refunds that adjust the discount allocation can move historical buckets in Shopify; the card uses the latest indexed value. |
| Cancelled orders | Both include | Both Shopify and the card include discounts on cancelled orders. |
| Sync lag | Ours lower for “today” | 5 to 15 minute index lag. |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
google_ads.google_promo_keywords | Ad spend on promo keywords during peak days | Spend lift should precede the discount-give peak by 0 to 2 days; lag suggests organic / email-driven, not paid. |
klaviyo.klaviyo_campaign_revenue | Email-driven promo days | Aligns Klaviyo campaign sends with the discount spikes. |
Known limitations / merchant FAQs
Why is my baseline discount higher than I expected? Always-on promotions add up. Welcome codes, abandoned-cart vouchers, loyalty unlocks, employee discounts, and influencer codes that never expired all contribute to the baseline. Audit your active codes and check what is silently running. Why does the spike look smaller than my “20% off everything” promo would suggest? Several reasons:- Not every order used the code; usage rate is typically 30 to 60% of orders during a promo.
- Customers who would have ordered without the discount used it anyway, the discount went to natural-demand buyers, not incremental ones.
- Order mix shifted; not all line items were eligible (some categories often excluded).
totalShippingPrice set to zero rather than as a discount; check the Free vs Paid card for that view.
Refund timing, do refunds appear here?
No. The card sums discount-at-order-time. Refunds are tracked separately in Refund Value. Discount-and-refund interactions (e.g. customer used 20% off then returned the goods) need cross-card analysis.
Cancelled orders, are their discounts counted?
Yes. Discounts on cancelled orders bucket on their order day. To exclude, filter out cancelledAt IS NOT NULL orders manually.
Multi-currency, any impact?
The card sums in original currency without FX. Stores transacting in multiple currencies see distorted totals; filter to a single presentment currency.
Shopify Plus vs basic?
Plus stores use Shopify Functions for richer custom-discount logic (tier-based, exclusive bundles). The card captures the resulting discount value; the source attribution differs but the totals align.
Refresh cadence?
5 to 15 minute index lag; daily buckets recompute each cycle.
B2B vs DTC?
B2B price catalogues often apply standing discounts (10% off list for tier-A customers). These appear here daily as a steady contribution. A B2B-heavy store should expect a higher baseline; the dynamic peaks usually come from DTC promo events.
The card spiked unexpectedly, what should I do?
- Cross-reference Top Discount Codes for the peak day.
- Confirm the active campaign list, an unintended-still-live code is the most common cause.
- Check whether a partner / influencer code went viral.
- If the peak is genuine promo, evaluate ROI: what was the revenue lift? Did AOV move? Was the campaign profitable?