Skip to main content
Troubleshooting

Add to cart adds only 1 item at full price (no discount)

If a customer picks "Buy 2" or "Buy 3" but the cart receives only 1 unit at full price with no discount, the bundle never made it into the cart. The good news is that this symptom is specific enough to narrow down quickly. This guide walks you through diagnosing it and the handful of causes behind it.

The exact symptom

This article covers one precise failure pattern:

  • The widget shows on the product page and lets you select an offer (Buy 2, Buy 3, and so on).
  • You click Add to cart, but only 1 unit lands in the cart.
  • That unit is at full price with no discount.
  • The cart line has no _bundlex tag (the hidden attribution property Bundlex normally stamps on every bundle line).

If the discount is applying but the price differs from what the widget showed, that is a separate "cart total doesn't match the widget" issue, not this one. If the widget isn't appearing at all, see Widget not showing on a product page first. For background on how the add-to-cart interception works, see How add to cart works.

The quick fix to try first: hard refresh

Before any deeper diagnosis, have the customer (or yourself) hard-refresh the product page to load the latest widget code:

  • Windows or Linux: Ctrl + Shift + R
  • Mac: Cmd + Shift + R

A stale cached version of the widget can produce add-to-cart oddities that a hard refresh clears. It costs nothing and rules out a caching problem before you spend time reading network requests.

Step 1: Capture the add-to-cart request

Almost every diagnosis here depends on seeing the actual network request your theme sends. To capture it:

  1. Open your browser developer tools (press F12) and go to the Network tab.
  2. On the product page, select a bundle offer (for example Buy 2) and click Add to cart.
  3. Find the /cart/add (or /cart/change) request in the list.
  4. Right-click it and choose Copy, then Copy as cURL.

While you are in developer tools, also open the Console tab and look for any lines that start with [Bundlex]. One specific message is a strong clue, covered below.

Step 2: Run the checks in order

Work through these from the top. The first match is almost always your cause.

Check the endpoint

Look at the URL of the request you captured.

  • If it goes to /cart/add or /cart/add.js, continue to the next check.
  • If it goes to /cart/change.js, that is your problem. Bundlex only intercepts /cart/add, not the cart-update endpoint. Some themes use a non-standard add-to-cart that posts to /cart/change.js instead, so Bundlex never sees the request and can't inject the bundle. This needs custom theme work (see the last section).

Check for the bx-product-form marker

Bundlex adds a hidden input to the product form so it can recognize a bundle submission:

<input type="hidden" name="bx-product-form" value="1">

Look at the body of the request you captured. If the payload is a bare {"id": "...", "quantity": "1"} with no bx-product-form field, the marker did not survive to the network request. There are two sub-cases, and they mean different things:

  • The marker is missing from the form HTML too. Inspect the product form (developer tools, Elements tab) and search for bx-product-form. If it isn't in the form at all, the widget did not initialize on this product. Verify the app embed (or app block) is enabled in your theme, that this product has a published bundle matching it, and that the widget is actually visible on the page. The widget-not-showing guide covers each of these checks in detail.
  • The marker is in the form HTML but not in the request. This means a theme script or another app rebuilt the /cart/add request from scratch and dropped the marker (along with any other line-item properties). When the marker is absent from the body, Bundlex treats it as an ordinary add and passes it through unchanged, so you get 1 full-price unit and no _bundlex tag. This is the most common cause of this exact symptom. It is a consequence of Bundlex's non-invasive design: Bundlex never replaces the request, so it can't recover a marker that was stripped before it ran. This one needs theme or app-side work, covered below.

Check the console for a 422

If the endpoint is correct and the marker is present, look in the Console for this line:

[Bundlex] Modified request returned 422 — retrying with original body

This is the giveaway for a different family of causes. Bundlex built the correct multi-line bundle add, Shopify rejected it with a 422, and Bundlex safely fell back to the original single-item body so the customer at least gets the main product. That fallback is exactly the "1 unit, full price, no discount" symptom. Two configuration mistakes cause this 422:

  • A gift or paid extra is out of stock. If a gift or cross-sell product has inventory tracking on and 0 stock, Shopify refuses the whole multi-item add. Check every gift and extra in the offer by visiting /variants/<variant-id>.js on the storefront and confirming available is true. Fix it by enabling "Continue selling when out of stock" on those products (or unchecking "Track quantity"). Gift and extra products can stay unlisted; they just need to be orderable.
  • A gift uses the same variant as the main product. Shopify will not accept a free gift line that is the identical variant the bundle is already adding, so the combined add returns 422. Open the offer's gift configuration and confirm the gift points at a different product or variant. If your intent is "give a free extra of the same product," configure the offer as a Buy X Get Y (BOGO) offer instead. Shopify accepts a BOGO on the same variant; a same-variant free gift line in a bundle it does not. See Buy X Get Y for setup.

Check that the quantity matches a tier exactly

Bundlex activates an offer only when the cart quantity exactly matches an offer threshold. If your offers are Buy 1 and Buy 2 and the customer enters 5, no offer is selected and Shopify just adds 5 units at the regular price. This is intentional, to avoid applying a tier the customer didn't choose. If customers regularly land between tiers, add the missing tier (for example a Buy 5 offer).

When custom theme work is needed

Two of the causes above can't be fixed from the Bundlex dashboard, because the problem happens in your theme or another app before Bundlex ever sees the request:

  • A theme or app strips the bx-product-form marker. Some themes ship a custom AJAX cart that rebuilds the /cart/add request and forwards only id and quantity, dropping all hidden inputs and line-item properties. The fix is to ask your theme developer (or the other app's support) to preserve all hidden form fields and properties during add-to-cart, especially bx-product-form. This is the same change that keeps file-upload, engraving, custom-text, and subscription apps working, since they all rely on those fields too.
  • The theme posts to /cart/change.js instead of /cart/add. Ask your theme developer to use the standard Shopify /cart/add endpoint for adding products to the cart.

If you aren't sure which case you are in, share the captured /cart/add request (Copy as cURL), the product form HTML, and any [Bundlex] console lines with support, and we can pinpoint it. The out-of-stock and same-variant-gift causes, by contrast, you can fix yourself in minutes from the product and offer settings.

Quick reference

What you seeLikely causeFix
No bx-product-form anywhere in the form HTMLWidget not initializedCheck app embed or block is on, a published bundle matches the product, and the widget is visible
Marker in HTML but not in the request bodyTheme or app strips form fieldsTheme developer preserves all hidden fields and properties
Request goes to /cart/change.jsNon-standard add-to-cart endpointTheme developer uses standard /cart/add
Console shows 422 — retrying with original bodyGift or extra out of stock, or gift equals the main variantEnable continue-selling on the gift, or pick a different gift or use BOGO
Works for some quantities, not othersQuantity doesn't match a tier exactlyAdd the missing offer tier
Intermittent odditiesStale widget cacheHard refresh (Ctrl/Cmd + Shift + R)

Was this article helpful?

Your feedback helps us improve our docs.

Thanks - we'll keep improving this article.

Want to chat with our team? Still have a question?

Still need help?

Our team is one click away. Send us a message and we'll get back to you.

We use a few cookies to keep this site working, measure how it is used, and power our chat widget when you open it. See our cookie policy.