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
_bundlextag (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:
- Open your browser developer tools (press F12) and go to the Network tab.
- On the product page, select a bundle offer (for example Buy 2) and click Add to cart.
- Find the
/cart/add(or/cart/change) request in the list. - 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/addor/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.jsinstead, 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/addrequest 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_bundlextag. 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>.json the storefront and confirmingavailableistrue. 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-formmarker. Some themes ship a custom AJAX cart that rebuilds the/cart/addrequest and forwards onlyidandquantity, 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, especiallybx-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.jsinstead of/cart/add. Ask your theme developer to use the standard Shopify/cart/addendpoint 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 see | Likely cause | Fix |
|---|---|---|
No bx-product-form anywhere in the form HTML | Widget not initialized | Check 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 body | Theme or app strips form fields | Theme developer preserves all hidden fields and properties |
Request goes to /cart/change.js | Non-standard add-to-cart endpoint | Theme developer uses standard /cart/add |
Console shows 422 — retrying with original body | Gift or extra out of stock, or gift equals the main variant | Enable continue-selling on the gift, or pick a different gift or use BOGO |
| Works for some quantities, not others | Quantity doesn't match a tier exactly | Add the missing offer tier |
| Intermittent oddities | Stale widget cache | Hard refresh (Ctrl/Cmd + Shift + R) |
Was this article helpful?
Your feedback helps us improve our docs.