The cart said the gift was free. The checkout summary says $19. Usually the customer notices before you do.
Nothing has actually charged anyone. On Shopify a free gift is rarely a $0 product: it is a normal product line with a discount attached, and checkout is where Shopify decides which discounts apply. When the discount does not apply, the line falls back to its real price. The question is which of seven things stopped it.
First rule out the simplest case: did the shopper add the gift product themselves? The discount applies to the line the campaign designated as the reward, not to every copy of that product.
Check these in order
1. Another discount is winning
Symptom: carts with a code, or orders during a sitewide sale, show the gift at full price. Other carts are fine.
Why: Shopify makes every discount declare which classes it combines with, and both sides have to opt in. When they do not, Shopify does not error: it applies whichever combination is the better deal for the customer, and the gift discount is frequently the one dropped.
Fix: open Discounts in Shopify admin, open your discount, find Combinations, and tick Product discounts (yes, even on a product discount). The gift app's side is usually opted in already. Discount stacking walks through each case.
Confirm: rebuild the cart in a private window without the code.
2. The shopper checked out with Buy Now or Shop Pay
Symptom: express orders are wrong, ordinary cart checkouts are fine.
Why: those buttons build a checkout straight from the product page and never render the cart, so a gift app watching the cart never sees one. Either no gift is added, or the shopper added it by hand and it goes through as a paid line. Every gift app hits this.
Fix: turn on your app's express-checkout handling (in Valotrix Cart Rewards, Settings -> Gift delivery -> Include express checkout, on by default, catching the majority of express orders rather than all). If express is a big share of your volume, hide Shopify's dynamic checkout buttons on trigger products. Express checkout and gifts has both paths.
Confirm: place one test order via Buy Now and one through the cart.
3. The threshold was met in one currency and set in another
Symptom: international orders are wrong and domestic ones are not, or the reverse.
Why: a threshold is a number in a currency. If your rule says $50 and the shopper pays in euros, something has to decide what $50 means to them. A sensible app refuses to guess: with no threshold for that currency nothing qualifies, and a gift the customer added by hand is charged.
Fix: set the threshold for every currency you sell in. In Valotrix Cart Rewards the cart-value condition has a per-currency panel that pre-fills from current Shopify Markets rates and rounds, so 50 dollars becomes 45 euros rather than 45.32. Per-currency thresholds covers the order of resolution.
Confirm: switch your storefront to that currency and rebuild the cart.
4. A cart drawer or the theme rebuilt the gift line
Symptom: the gift reads $0 on the cart page but checkout charges for it.
Why: gift apps mark the lines they add with hidden line properties, and the checkout-side discount finds the gift by those markers. Slide-cart apps and older hand-rolled cart JavaScript re-render the cart from their own template and drop the properties, so checkout sees an ordinary line.
Fix: open https://yourshop.com/cart.js with the broken cart and read the gift line's properties. If they are gone, disable the competing drawer app's storefront output, or make sure each cart row carries the key attribute your app uses to find lines. When a theme breaks the gift line lists the usual offenders.
Confirm: the same cart with that drawer switched off keeps its properties.
5. The shopper changed the gift quantity
Symptom: the order shows two of the gift, one free and one charged.
Why: the discount covers the units the campaign granted, not everything sharing that line. Bumping the gift from 1 to 2 correctly produces one free unit and one paid one, which reads like a half-broken discount.
Fix: lock the quantity on the gift row. In Valotrix Cart Rewards that is on the Gift line display sub-page reached from Settings. If your theme rebuilds cart rows (cause 4), the lock may not render even when it is on.
Confirm: add the gift, raise it to 2, go to checkout.
6. A $0 duplicate variant drifted back to its real price
Symptom: it worked for months, then every gift started being charged, and nothing changed in the app.
Why: many setups, including most do-it-yourself guides, add a duplicate variant priced at $0. That zero is ordinary product data, so anything that writes prices can overwrite it: a bulk edit, a spreadsheet re-import, an inventory sync, a supplier feed. Afterwards there is no discount to fail, because there never was one.
Fix: set the variant back to 0 in Products, then move the offer to a discount-based setup so there is no second price to keep in sync. If you keep the variant, exclude it from every sync and feed you run.
Confirm: open the variant and read its price.
7. The gift stayed after the cart stopped qualifying
Symptom: the customer earned the gift, removed the trigger product, and checked out with the gift still there.
Why: rules differ on what happens to an earned gift once the cart stops matching. Keep the gift while the discount is judged against the same conditions, and checkout has a gift line with no valid discount for it.
Fix: set the rule to remove the gift when the customer stops qualifying, so cart and checkout never disagree. In Valotrix Cart Rewards this is Auto-remove gift on the rule's Trigger tab, on by default; the gift returns on the next cart change if they qualify again.
Confirm: cross the threshold, remove the trigger item, watch the gift line.
Why the two setups fail differently
There are two ways a gift reaches $0, and which one you run decides which causes above can happen to you at all.
A duplicate variant priced at $0. The price is data in your catalog and checkout simply reads it. Easy to reason about, fragile in one way: every system that can write a price can break your gift, silently, months later. The duplicate also carries its own inventory count and shows up in feeds and reports.
The real variant, discounted at checkout by a Shopify Function. The gift line is the actual product at its actual price, and a small program Shopify runs on its own servers while building the checkout applies the discount. The app declares in advance which products a campaign may give away and at what percentage, so the figure is computed on Shopify's side each time rather than stored in your catalog. No price edit, import or sync can change what the gift costs, which takes cause 6 off the table entirely.
It is still a discount, though, so cause 1 applies, and it still needs a line the campaign designated, so causes 2, 4 and 5 apply.
If it is still not working
Whatever app you run, send support these in one message:
- The order number and a screenshot of the checkout summary showing the charge.
- A cart that reproduces it, plus its
https://yourshop.com/cart.jsoutput. - Your theme name, and whether a cart-drawer app is installed.
- Whether the order came through Buy Now or Shop Pay.
- Every other discount active at the time, codes included.
Where Valotrix Cart Rewards fits
Valotrix Cart Rewards (listed on the App Store as VLTRX Gift with Purchase BOGO) adds the real variant of your gift product and discounts it at checkout with a Shopify Function, so there is no duplicate $0 variant to drift. The Stop $0 checkouts guard in Settings blocks checkout whenever the cart total is $0, on every checkout path. You can install it from the Shopify App Store and rebuild your current offer alongside your existing app before switching anything off.
On one Romanian beauty store that has run the app since spring 2026, about a fifth of March orders included the gift, and those orders averaged around $130 against about $50 for the rest (72 orders that month, converted from RON at roughly 4.6 to the dollar). One store, early numbers - your results will vary.
Keep reading
- Free gift not showing in the cart on Shopify - the other half of this problem.
- Automatic discounts vs discount codes - why combination settings behave as they do.
- How free gifts get a $0 cart line - the three delivery methods.
Install Valotrix Cart Rewards - the Free plan runs one campaign with a progress bar, paid plans have a 7-day trial: apps.shopify.com/valotrix-cart-rewards.