How to Tell Coupon, Cart Rule and Catalog Price Discounts Apart in GA4 on Magento 2

|Dan Giura
How to Tell Coupon, Cart Rule and Catalog Price Discounts Apart in GA4 on Magento 2

TL;DR

Magento has three ways to take money off a product, and GA4 sees all three. It can name only one. Cart price rules can require a code; catalog price rules can't [5], and special prices replace the regular price on the product [9]. If an offer has to be judged by name after Black Friday, build it as a coded cart rule now, choose shared or unique codes on purpose, and check one discounted order in DebugView before the sale.

Key Takeaways

  • Order coupon is filled by the event-level coupon parameter [3]. The extension sends the order's code there, and since v1.12.7 (July 26, 2023) an empty string when there is none [1].
  • Item discount amount is the per-unit discount multiplied by quantity [3], and the extension's discount covers coupon, price rule and special price reductions in one figure [1].
  • On the orders you check in DebugView, Item revenue is already net of the discount, because the price sent is the discounted unit price [2] [3]. Confirm it on a discounted configurable product too.
  • Decide for each offer, before the sale, whether anyone will need its name in a report. Only coded cart rules get one.
  • A batch of unique codes can push Order coupon past 500 values, where Google starts calling a dimension high-cardinality [4]. Give generated codes a campaign prefix [8].
  • Black Friday 2023 can't be compared with this year for discounts: the item discount arrived in v1.12.17 (January 12, 2024), and its tax-inclusive calculation changed in v1.14.3 (June 12, 2024) [1].

What each discount type leaves on the purchase

The purchase event has two discount fields, and they sit at different levels. Google's event reference defines the event's coupon as "the coupon name/code associated with the event" and adds that "event-level and item-level coupon parameters are independent" [2]. On each item, discount is "the unit monetary discount value associated with the item", and when one applies, Google asks you to "set price to the discounted unit price and specify the unit price discount in the discount parameter" [2].

The extension sends the code on the order, and on each purchased item it sends the discount per unit, with the item price net of it. It sends no item-level coupon, so GA4's Item coupon dimension stays empty and Order coupon is the one to report on [3]. The change log describes the item discount as applying "whenever a purchased product has a discounted price via coupon, price rule or Special Price" (v1.12.17) [1]. The rest of the purchase payload is in our article on what your old dataLayer still gets wrong.

Magento mechanism Where you set it Order coupon in GA4 Item discount in GA4
Cart price rule, Specific Coupon or Use Auto Generation Marketing > Promotions > Cart Price Rules [6] [7] The code Yes
Cart price rule, No Coupon The same grid [7] Empty Yes
Catalog price rule Marketing > Promotions > Catalog Price Rules [5] Empty Yes
Special price On the product itself [9] Empty Yes

Run it on an illustrative order from a store whose prices exclude tax. A mug has a regular price of $20 and a special price of $16. The shopper buys three and enters BF10, a code worth 10%, which takes $1.60 off each. In DebugView you would expect coupon set to BF10 on the event and, on the item, a price of 14.40 and a discount of 5.60. The special price gap and the code's share arrive as one per-unit number. GA4 then reports an Item discount amount of $16.80 and Item revenue of $43.20 [3]. Nothing in that item row says which part came from BF10.

Where do the discounts show up in GA4's reports?

Google's definitions settle it [3]. Order coupon: "Populate this event-level dimension by sending the event-level coupon parameter with an online-sales event." Item discount amount: "The total cost of an item discount, calculated by multiplying the discount and item quantity." Item revenue is "price x quantity - refunds", and Gross item revenue is "price x quantity".

The last two need care. Where the price your own orders send in DebugView arrives already discounted, Gross item revenue is gross of refunds only and still after the discount, and revenue before discounts is Gross item revenue plus Item discount amount. In the mug example, $43.20 plus $16.80 gives back the $60 that three mugs cost at the regular price. Check this on a discounted configurable product too, as the last section describes.

That gives two reading paths. For coded offers, build a free-form exploration with Order coupon as the rows and transactions and purchase revenue as the values. For the rest, use Item name as the rows with Item discount amount and Item revenue, over the offer's dates. That path shows how much was discounted on which products, and never which offer did it.

Which Black Friday offers need a code for GA4 coupon tracking?

Adobe's documentation draws the line. Catalog price rules "do not use coupon codes, because they are triggered before a product is placed into the shopping cart" [5]. Cart price rules apply "automatically when the conditions are met, or when the customer enters a valid coupon code" [6]. A special price "appears instead of the regular price, followed by a notation that shows the regular price" [9]. Of the three, a cart rule with a Specific Coupon, including auto-generated codes, is the only one that leaves a name on the order [7].

So ask of each offer whether someone will want its result by name in December. A newsletter code, a partner's code and a flyer code each answer yes, and each should be its own coded cart rule. A 20% markdown on last season's category answers no, since you'll judge it by what the category sold, and a catalog rule is fine.

The hard case is two offers on the same products in the same week. Say a catalog rule takes 15% off outerwear and an automatic cart rule takes another 10% off orders over $150. Both reductions land in the same per-unit discount on the same item rows, and no GA4 report will separate them. If you'll need them apart, give one of them a code.

One shared code or a batch of unique ones?

Adobe's Use Auto Generation option creates batches of unique codes and lets you "add a prefix and suffix to associate the code with a specific campaign or initiative" [8], and Uses per Coupon caps how often each can be redeemed [7]. Unique codes keep one code from spreading across coupon sites. They also fill a GA4 report with thousands of coupon values.

Google's line is "Any dimension with more than 500 values should be considered a high-cardinality dimension", and when a table has more rows than its limit, GA4 folds the rest into an (other) row [4]. A campaign that generates 5,000 single-use codes crosses it as soon as 501 of them are redeemed.

If the question is how the campaign did, one shared code per campaign gives you one Order coupon row. If single use matters more, generate unique codes with a campaign prefix such as BF26-NL-, and group them in an exploration with a filter on the prefix.

One gap we haven't verified: since Commerce 2.4.7, "shoppers can apply multiple coupons to a cart" [8], and what the order's coupon field then holds is untested here. If your store allows it, place one order with two codes and look at the purchase in DebugView before you build reports on codes.

Comparing this Black Friday with last year's

The item discount exists from v1.12.17, released January 12, 2024 [1]. Black Friday 2023 purchases have no per-item discount, so a discount comparison against 2023 has nothing on one side. Only the coupon field goes back that far; v1.12.7 (July 26, 2023) is when an order without a code started sending it as an empty string [1].

Black Friday 2024 needs one more check if your catalog prices include tax. v1.14.3 (June 12, 2024) "Added improvements to discount parameter calculations for products with tax included in the price" [1]. A store still on an older release that November recorded its 2024 discounts under the earlier calculation, so check which version you ran before you put the years side by side. If you're due for an update before the sale, our guide to upgrading without breaking your analytics covers the order of operations.

Before the sale, run the check our DebugView guide describes on three orders: a simple product with a special price and a code, a discounted configurable product, and an order with no code. The first should show the code in coupon and a discount and price on each item. On the configurable one, confirm the discount matches what the shopper saved under your own edition and parent or child settings. The third should send coupon empty.

FAQ

Does the PRO server-side purchase carry the coupon and the item discounts too?

Yes. The Measurement Protocol purchase carries the same order coupon and per-unit item discounts, and with Enable File Log on you can read the payload in var/log/ga4.log [1]. The browser copy of the purchase follows the Consent Management Method in the GA4 configuration (with the Magento Cookie Restriction Mode method, GTM loads only after the shopper accepts cookies); the PRO server-side purchase is separate, and since v1.17.4, with Require Visitor Consent for Server-Side Events switched on, it is sent only if the shopper consented, judged on the consent stored with the order [1]. Our guide to server-side events and consent has the detail.

Can the Sale Product custom dimension show which products were discounted?

No. Custom Dimension - Sale Product sends "the value of Magento's Sale attribute for the product in question" [1], which is a flag you maintain on the product. It doesn't record whether a discount applied to the order. Setup is in our guide to GA4 custom dimensions on Magento 2.

Is this the same as GA4's promotion reporting?

No. Banner and promo-block clicks use separate promotion events, covered in our GA4 promotion tracking guide. Price rules and coupons ride on the purchase.

Why do so many orders show an empty Order coupon?

Every order without a code sends coupon as an empty string [1]. Catalog rules, special prices and No Coupon cart rules all leave it empty, so on a sale weekend that row can be the largest one in the report.

The Magento 2 Google Analytics 4 extension sends the code on every purchase and a per-unit discount on every discounted item; which offers you can read by name afterward is decided in your cart price rules. The current release is v1.17.5, September 16, 2026 [1].

Sources

  1. WeltPixel Google Analytics 4 User Guide and Change Log (v1.12.7, v1.12.17, v1.14.3, v1.17.4 and v1.17.5 entries; Custom Dimensions; Consent Management Method), retrieved October 6, 2026, https://docs.weltpixel.com/GA4/User-Guide-WeltPixel-Google-Analytics-4.html
  2. Recommended events reference: purchase, Google Analytics developer documentation, last updated September 16, 2026, retrieved October 6, 2026, https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtm#purchase
  3. GA4 dimensions and metrics (Order coupon, Item coupon, Item discount amount, Item revenue, Gross item revenue), Google Analytics Help, retrieved October 6, 2026, https://support.google.com/analytics/answer/9143382
  4. About the (other) row, Google Analytics Help, retrieved October 6, 2026, https://support.google.com/analytics/answer/13331684
  5. Catalog price rules, Adobe Commerce Admin User Guide, last updated June 15, 2026, retrieved October 6, 2026, https://experienceleague.adobe.com/en/docs/commerce-admin/marketing/promotions/catalog-rules/price-rules-catalog
  6. Cart price rules, Adobe Commerce Admin User Guide, last updated June 15, 2026, retrieved October 6, 2026, https://experienceleague.adobe.com/en/docs/commerce-admin/marketing/promotions/cart-rules/price-rules-cart
  7. Create a cart price rule, Adobe Commerce Admin User Guide, last updated October 1, 2026, retrieved October 6, 2026, https://experienceleague.adobe.com/en/docs/commerce-admin/marketing/promotions/cart-rules/price-rules-cart-create
  8. Coupon codes, Adobe Commerce Admin User Guide, last updated August 20, 2026, retrieved October 6, 2026, https://experienceleague.adobe.com/en/docs/commerce-admin/marketing/promotions/cart-rules/price-rules-cart-coupon
  9. Special price, Adobe Commerce Admin User Guide, last updated June 15, 2026, retrieved October 6, 2026, https://experienceleague.adobe.com/en/docs/commerce-admin/catalog/products/pricing/product-price-special

Ready to upgrade your tracking?

Server-side tracking for Magento and Shopify — accurate data, better attribution, full privacy compliance.