How to Check What Bundles, Gift Wrap and Shipping Protection Do to Your Shopify Purchase Events

|Dan Giura
How to Check What Bundles, Gift Wrap and Shipping Protection Do to Your Shopify Purchase Events

TL;DR

In your purchase tracking, the event's value and its item list come from different parts of the order, and add-ons are where they drift apart. The value is the order total on all nine destinations. The item list maps the order's lines one to one: a line that isn't tied to a product, such as a custom item, is kept by GA4 and Klaviyo and dropped by Meta, TikTok, Reddit, Snapchat, Pinterest and OpenAI Ads, while Google Ads gets no item list at all. Bundles add a second twist, because Shopify writes the components into the order, not the bundle you sold. Two things Shopify doesn't document, where a bundle's discount lands and whether duties sit in the total, are what the test order answers.

Key Takeaways

  • Look up each add-on under Products in Shopify admin. If it's there, it enters every item list the app sends; if it only shows on orders, it's a custom line, and usually only GA4 and Klaviyo list it.
  • The value doesn't care about the shape: every destination receives the order total, add-on included.
  • A bundle built with Shopify's bundles feature never shows its own product ID in a purchase event. The add to cart carries the bundle, the purchase carries its components [1].
  • Put the components in your Meta and Google catalogs, since those are the IDs the purchase sends.
  • Shopify spreads a bundle discount across components "based on each product's proportional price" [3]; whether that shows in the unit price your events carry is something only a test order shows.
  • The app has no per-product exclusion. If shipping protection shouldn't be in an item list, the fix is in how the add-on lands on the order.

Read one order the way the events read it

Take an illustrative order: a three-candle holiday bundle, gift wrap and shipping protection, all in one checkout. Here's what the order holds and what each group of destinations lists as items, depending on how each add-on was set up:

Line on the order GA4 Klaviyo Meta, TikTok, Reddit, Snapchat, Pinterest, OpenAI Ads Google Ads
Candle 1, 2 and 3 (bundle components) 3 items with IDs 3 items 3 items no items
Gift wrap set up as a product item with ID item item no items
Gift wrap added as a custom line item with a name and no ID item with an empty product ID dropped no items
Shipping protection folded into the shipping charge not a line not a line not a line no items
Value order total order total order total order total

The holiday bundle itself, the product the shopper clicked, isn't anywhere in that table. GA4 and Klaviyo list everything the order contains, while the six ad platforms can list fewer things than the shopper paid for and the value counts all of it.

None of this is broken. GA4's purchase reference says "One of item_id or item_name is required" [6], so a name-only item is valid there. Meta defines contents as JSON objects "that contain the product IDs associated with the event" [7], and a line with no product has no ID to put in one. The mismatch is between the value and the list, and you only see it if you read both.

What happens to a line with no product behind it?

It splits the destinations in two. The app maps each order line to an item and looks up the product identifier the channel is set to send. When a line has no product or variant behind it, there's nothing to look up, unless that channel is set to send SKUs and the line carries one.

  • GA4 keeps the line as an item with a name and no item_id.
  • Klaviyo keeps it, with an empty product ID.
  • Meta, TikTok, Reddit, Snapchat, Pinterest and OpenAI Ads drop it from the item list. The value still includes what it cost.
  • Google Ads receives no item list from the app, so only its value moves.

Tips may land here too. Shopify's order API documents line-item tip fields that are "Present only on tips" [4], so a tip can show up as an order line. If it has no product behind it, it behaves like any custom line. Your test order shows which. Either way the tip is in the value, because Shopify defines the order total as "the sum of all line item prices, discounts, shipping, taxes, and tips" [4].

The item price each item list carries is the line's unit price, which Shopify's REST order reference defines as "The price of the item before discounts have been applied" [4]. Why GA4's item revenue and purchase revenue then disagree, tax and shipping included, is our tax and shipping article's ground. For the full list of GA4 item parameters, see our GA4 ecommerce events canon.

Gift cards have their own rules, covered in our gift cards and store credit piece.

Why does a Shopify bundle change names between cart tracking and the purchase event?

Because Shopify stores it differently at each stage. Its developer docs put it in three lines: "Cart page shows bundle parent", "Checkout lines present bundle products as a group of lines", and "Order lines return bundle components, with a reference to the bundle parent" [1]. Each component line points at a group that stands for the bundle [2], and Shopify's Bundles help confirms that "SKUs are listed for individual items in orders, not for the bundle SKU" [3].

For bundles built on Shopify's bundle feature, the app's add to cart reads the product on the cart line, which is the bundle. Its purchase reads the order's lines, which are the components. So one sale shows up as two different products in your funnel: shoppers add the holiday bundle and buy three candles. The app doesn't regroup them. The bundle's product ID never reaches a purchase event on any destination.

Two consequences follow. Retargeting built on "added the bundle, didn't buy it" can't see that the bundle sold, because no purchase carries its ID. And catalog matching runs on the components, so they need to be in your Meta and Google catalogs under the IDs the app sends; our catalog ID guide walks through the columns. The cart-stage side of bundles, where quantity is the usual trap, sits in our add-to-cart value article.

The price is the open question. Shopify says a bundle discount "calculates on the parent bundle product first. The amount then allocates to component products by weighted price" [3]. It doesn't say, on any page we read, whether that share shows in the component line's unit price or as a separate discount on it. Since the events carry the unit price before discounts [4], the difference decides whether your item prices add up to what the shopper paid for the bundle. The order page and DebugView will tell you in a minute.

Gift wrap and shipping protection come in three shapes

How an add-on lands on the order decides everything downstream, and you can usually find out without asking the vendor.

A real product. The add-on exists under Products, with its own ID. It enters every item list except Google Ads', and the value. Its ID goes to Meta, TikTok, Pinterest and the rest like any other product's, so decide whether it belongs in your catalog. If it's missing there, the platform receives a product ID it can't find.

A custom line. The add-on appears on the order but not under Products. GA4 and Klaviyo list it; the six ad platforms don't; the value includes it. It's the one shape that never raises a catalog question.

Not a line at all. The charge is folded into the shipping rate or handled outside the order lines. It reaches the value only through whatever it's folded into, so a charge inside shipping follows your shipping choice, and that choice is our tax and shipping article's to settle.

The app has no setting that leaves one product out of the item lists, and it doesn't treat tips, gift wrap or protection specially. If the shape you have isn't the one you want, the change is in the add-on's setup, not in tracking.

Duties belong in this conversation too. Shopify lets stores "collect an estimate of those amounts at checkout" [5], and its GraphQL order object says additional fees "can include charges such as duties, import fees, and special handling" [8]. Neither page says whether duties sit inside the order total the events use. Read it off a real international order before assuming either way.

Test one order per add-on

If you added an add-on app in a hurry last season and never checked what it did to the events, spend ten minutes here:

  1. Route the test away from live reporting. Our server-side testing guide explains which platforms keep test events out of reports and why a second pixel instance is the safe route.
  2. In Shopify admin, go to Products and search for each add-on by name. Write down which ones exist as products.
  3. Place one order with a bundle, gift wrap, shipping protection and a tip if your checkout offers tips.
  4. Open the order in admin. Note every line, its unit price and any discount shown against it, and the order total.
  5. Turn on Enable Debug Mode in the app's Advanced Settings, open GA4 DebugView (our DebugView walkthrough shows where) and expand the purchase. Count the items, check which have no item_id, and compare value with the order total.
  6. Open one ad platform's test view and count the items there. The gap between that count and GA4's is your product-less lines.
  7. Add up price times quantity for the bundle components in DebugView and compare it with what you charged for the bundle.

Fill in a four-line record and keep it. Each question mark is yours to fill in, and the other cells show example answers:

Add-on            | Shape          | In GA4 items | In ad-platform items | In value
Gift wrap         | custom line    | yes, no ID   | no                   | yes
Shipping protect. | product        | yes          | yes                  | yes
Tip               | ?              | ?            | ?                    | yes
Bundle components | 3 lines        | yes          | yes                  | yes

Repeat the order when you install or change an add-on app, and before the November 13 app stop on our BFCM readiness page if you can, so the holiday weeks run on a setup you've already read.

FAQ

Can the app leave shipping protection out of the item list?

No. The app has no per-product exclusion. Setting the add-on up as a custom line with no SKU keeps it out of the six ad platforms' item lists; GA4 and Klaviyo still list it, and every value includes it.

Does Google Ads see bundle components?

No. The app sends Google Ads the order total with no item list, so bundles and add-ons only move its value.

Why does Meta show fewer items than the order has?

Meta's item list is a list of product IDs [7], so the app leaves out lines with no product behind them, such as custom items, while their cost stays in the value.

Read what each destination got

WeltPixel Conversion Tracking sends each order's total to all nine destinations and its lines to all but Google Ads, with GA4 on the free plan and the other eight on Plus. Place one test order per add-on and bundle before the November app freeze, and read what each destination got.

Sources

  1. Shopify developer documentation, "About bundles", shopify.dev/docs/apps/build/product-merchandising/bundles, accessed October 6, 2026
  2. Shopify developer documentation, GraphQL Admin API LineItemGroup object, shopify.dev/docs/api/admin-graphql/latest/objects/LineItemGroup, accessed October 6, 2026
  3. Shopify Help Center, "Shopify Bundles", help.shopify.com/en/manual/products/bundles/shopify-bundles, accessed October 6, 2026
  4. Shopify developer documentation, REST Admin API "Order" resource (line items, total_price), shopify.dev/docs/api/admin-rest/latest/resources/order, accessed October 8, 2026
  5. Shopify Help Center, "Duties and import taxes", help.shopify.com/en/manual/international/duties-and-import-taxes, accessed October 6, 2026
  6. Google Analytics developer documentation, GA4 events reference, purchase, developers.google.com/analytics/devguides/collection/ga4/reference/events, accessed October 6, 2026
  7. Meta for Developers, Conversions API "Custom Data Parameters", developers.facebook.com/docs/marketing-api/conversions-api/parameters/custom-data, accessed October 6, 2026
  8. Shopify developer documentation, GraphQL Admin API Order object, shopify.dev/docs/api/admin-graphql/latest/objects/Order, accessed October 6, 2026

Ready to upgrade your tracking?

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