Variant Upgrade in Cart: Switch to a Bigger Size or Bundle

Short answer: A variant upgrade in the cart is a one-tap offer to swap the size or pack a shopper already chose for a larger one at a lower price per unit. It replaces the line (add the larger variant, remove the smaller) instead of adding an extra item. Show the saving in dollars and keep the tap inside the drawer.
Most stores upsell a second item. That is a cross-sell. A variant upgrade in cart is different. The person already chose the product. You are asking them to take more of the same thing: 500 ml instead of 250 ml, a 90-day bottle instead of 30, a 3-pack instead of one.
We build cart drawers at Oxify. This is one of the cleanest AOV moves we see, and one of the easiest to mess up. Below is the playbook: when it works, the copy, the swap rules, and the traps.
Key Facts (checked 11 October 2026)
- Shopify's
/cart/change.jsendpoint cannot change a line's variant ID. Per Shopify's Cart API reference (read 11 October 2026), it changes only quantity, properties, and selling plan, one line item at a time. A variant "swap" is always two calls: add the new variant, remove the old line. - When you change a
selling_planwith/cart/change.js, you must identify the line by itslineindex, not the variant ID. - Variants of one product share a product ID but carry separate variant IDs, prices, and inventory — so the bigger size can sell out independently of the small one.
- Dawn and Horizon, two free Shopify themes, show a cart line's chosen options as read-only text. We read the cart-line markup of both on GitHub on 11 October 2026 and found no control that switches variants, so a switch-size offer needs an app or theme code.
- Oxify Cart Drawer & Upsells (our app) is Built for Shopify and rated 4.9 across 40 reviews, with plans from $9.99 to $49.99/month by monthly order volume (App Store listing, checked 11 October 2026).

Key Takeaways
- A variant upgrade replaces the line item. Do not add a second bottle beside the first unless you mean to.
- Sell the per-unit price, not a vague "upgrade." "Save $4 vs two small bottles" beats "Go premium."
- Best fit: consumables, beauty, coffee, supplements, pet food, and apparel only as multipacks (a 3-pack of socks), never a bigger shirt.
- One offer per line. Two upgrade cards in a phone drawer freeze people.
- Never offer a cheaper, smaller size as the "upgrade." That is a downsell with a smile.
What Is a Variant Upgrade in the Cart Drawer?
It is a prompt on a cart line that says, in effect: switch this SKU to a bigger size or a bundle variant.
Example:
- In cart: Daily Serum, 30 ml, $28
- Offer: Switch to 50 ml for $38 ($0.76 per ml instead of $0.93)
- Tap: the 30 ml line becomes 50 ml. Quantity stays 1. The line goes from $28 to $38. Unit price goes down.
Shopify stores variants as different IDs on one product. Under the hood, the cart drawer adds variant B and removes the variant A line in the same tap — Shopify's cart API has no single "replace variant" call. The shopper never goes back to the product page. That is the whole trick.
This is not the same as:
| Move | What happens | When to use it |
|---|---|---|
| Variant upgrade | Swap to a larger size / pack | Same product, better unit price |
| Cross-sell | Add a different product | A related add-on they might miss |
| Quantity break | Same SKU, more units, lower unit price | They already like this exact size |
| Subscription upgrade | Same SKU, one-time becomes subscribe | Consumables with a refill rhythm |
If you sell Subscribe & Save, use our subscription upgrade in cart drawer guide. Do not mix "go bigger" and "subscribe" on the same line. Pick one primary ask.
Why This Works After They Already Picked a Size
On the product page, people pick the safe size. Small bottle. One pair. 30-day supply. They are still deciding if they trust you.
In the cart, they have already said yes. The remaining question is "how much?" That is a cheaper question. You are not restarting the sale. You are editing the order.
Unit price is the lever. A 30 ml at $28 is $0.93/ml. A 50 ml at $38 is $0.76/ml. Write that out. Shoppers are not rude. They are busy. Do the math for them.
Where Variant Upgrades Convert
Use this as a yes/no filter before you build anything.
- Yes: skincare, haircare, vitamins, protein, coffee, tea, snacks, pet food, candles, detergent, socks sold as 1 vs 3-pack.
- Yes with care: apparel, if "L" vs "XL" is not the offer. Size is fit. Upgrade is a 2-pack or a kit, not a bigger shirt they did not ask for.
- No: custom, made-to-order, one-size art, anything where the small SKU is the product (a print, a single ticket).
- No: when the "bundle" is a different product family. That is a cross-sell. Treat it like in-cart recommendations.
If the bigger variant is often out of stock, skip the offer. A dead "Upgrade" button trains people to ignore you.
Copy That Gets the Tap
Lead with savings. Name the size. Keep it under two lines on mobile.
Lines that work:
- "Switch to 90-day and save $11 vs three 30-day bottles."
- "Make it a 3-pack. $6 less per pair."
- "Go 500 ml — same formula, 20% less per ml."
Lines that flop:
- "Upgrade your experience."
- "Customers also bought the large." (maybe they did; it still sounds like a generic widget)
- "Add the 50 ml" when the 30 ml is still in the cart. People think they will get both and get charged twice.
Button text should say the action: Switch and save, not Add. Add means extra item. Switch means swap.
How to Set It Up (No-Code and Dev)
Method 1: Cart drawer app (fastest)
In a drawer app that supports variant offers or manual upsells, map each small variant to its larger sibling. Show the offer only when the small SKU is in the cart and the large SKU is in stock.
- List your upgrade pairs in a sheet: small variant ID → large variant ID, prices, unit save.
- In the app, create a rule: if cart has small, show large as a swap, not as "add."
- Exclude the offer if the large is already in the cart.
- Test on a phone: tap switch, confirm the old line is gone and the new line is there. Then repeat with a quantity of 3, with a subscription line, and with the larger size nearly sold out.
Oxify Cart Drawer & Upsells (our app) can run this as a targeted in-cart offer so you do not edit theme files. Whichever app you pick, the swap behavior matters more than the brand, so run the four checks in step 4. For the broader offer stack around it, see how to add upsells to your cart drawer.
Method 2: Theme code (developers)
The cart talks to Shopify over AJAX. A swap is a short sequence of calls behind one tap:
- Add the larger variant with
/cart/add.js, passing the old line's quantity, itspropertiesand, for a subscription line, itsselling_plan. The new variant starts as a new line, so none of these carry over on their own. - Check the response before you go on. Per the Cart API reference, if you ask for more than the stock available,
add.jsadds only the maximum available and returns a 422 error, and a sold-out variant returns a 422 too. On a 422, leave the old line alone and tell the shopper. If your code removes the old line anyway, someone with three small bottles can end up with two large ones. - Read
/cart.jsand take the old line'skey. Shopify recommends the line item key over the variant ID, because one cart can hold several lines with the same variant ID. The key also changes as properties and discounts change, so do not reuse a key saved before the add. - Set that line's quantity to 0 with
/cart/change.js, identified by the key. There is no way to change the variant ID on an existing line —change.jsonly accepts quantity, properties, and selling plan. Putsectionson this call and the response carries the redrawn drawer HTML (up to five sections) along with the new cart. Redraw from that. Never invent the total in the browser.
change.js edits one line at a time, so a swap is always sequential, not batched. If you ever change the plan on an existing line instead, Shopify requires the line property (the 1-based position), not the key or variant ID. Decide on purpose whether the larger variant keeps the subscription plan or lands as one-time.
If you only add the large SKU and forget to remove the small one, you have a messy cart and an angry email. Dawn and Horizon both send sections and sections_url with their cart_change_url requests (we read assets/cart.js in Dawn and assets/component-cart-items.js in Horizon, main branch, on 11 October 2026), so match that pattern if you stay in the theme.
Guardrails So You Do Not Hurt Conversion
- One upgrade per line. If they have two serums, you can show two prompts. Do not stack three sizes for one serum.
- Keep margin. If 50 ml at $38 costs you almost as much as two 30 ml, you are paying for AOV with profit. Run the unit cost first.
- Match images. Show the large pack photo. A tiny thumbnail of the small bottle next to "go large" is confusing.
- Respect selling plans. If the line is already a subscription, do not swap it to a one-time jumbo pack unless that is the point. A naive add-and-remove drops the selling plan silently. Test the swap on a subscription line before you ship it. See subscription upgrades in the drawer for that flow.
- Check the big size's inventory. Variants track stock separately. Gate the offer on the large variant being available, or the tap errors at the worst possible moment.
- Do not fight quantity breaks. If you already shout "buy 3 of this SKU," a size swap on the same line is two different math problems. Pick one primary path. See quantity breaks in the cart drawer.
A Simple Test Plan
Run 14 days. Do not change five other cart widgets in the same window.
- Primary: attach rate — upgrades / carts that saw the offer.
- Secondary: AOV for sessions that opened the drawer.
- Guardrail: drawer-to-checkout rate. If upgrades rise but checkout falls, the prompt is in the way. Move it below the sticky pay button or shorten the copy.
We do not quote a benchmark tap rate for size swaps, because we have no verified one and an unsourced band would only give you a number to miss. Judge the offer against your own baseline, and if your tool allows it, hold back a control group of carts that never see the offer. If you see 0%, the rule is wrong or the button still says "Add." For the full metric setup — what to log, how to segment, and how long to wait — use our guide to measuring cart upsell performance.
Mistakes We See Every Month
- The double bottle. Offer adds the large and leaves the small. Fix the swap.
- The fake bundle. "Bundle" is a separate product, not a variant. Then inventory, shipping, and discounts break. Use a real variant or a real bundle app.
- The smaller size as a deal. Showing 30 ml cheaper after they picked 50 ml trains people to trade down.
- The product-page repeat. They already rejected 90-day on the PDP. Still show it once in the cart with unit math. Once. If they skip it, stop nagging.
Related: Upsizing bags in the cart? See the best Shopify apps for coffee and tea brands.
Frequently Asked Questions
What is a variant upgrade in the cart?
Is a variant upgrade the same as an upsell?
Can Shopify do variant upgrades without an app?
Will a size upgrade annoy shoppers?
Should I upgrade size or add quantity breaks?
What happens to a subscription when the variant is swapped?
What to Do Next
Open your top 20 SKUs. Write the upgrade pair and the dollar save per unit. If you cannot write that in one sentence, you do not have an upgrade. You have a different product.
Then put the switch in the drawer, not in a popup. If you want that offer next to shipping and checkout in one Built for Shopify cart, try Oxify Cart Drawer & Upsells (our app; see what the cart drawer includes). Map one pair, test on a phone, and watch attach rate for two weeks before you add more. When the swap is earning its keep, layer the rest of the drawer using the cart upsell strategy guide.