Product upsell
Show a short list of products under the cart lines, so shoppers can add one more thing without leaving the drawer.
What it is
The upsell block sits after the last item in the cart drawer. Each card shows a product image, its name, its price, an option picker when the product has more than one option, and an Add button.
You choose where the products come from. Either you pick them yourself, or you let Shopify's own recommendations do it.
When to use it
- You sell obvious companions — a lens with a camera, a case with a phone.
- You want one collection (say “Add-ons” or “Best sellers”) offered in every cart.
- You have no idea what pairs with what, and want Shopify to decide from your own sales data.
Anything you pick yourself is used instead of Shopify's recommendations, never mixed with them. If you name products, those are the only ones a shopper can be offered.
Set it up
- Open your cart in the Cart builder.
- In Add a module, choose Product upsell and press Add.
- Find the new row in the Modules list and press Settings.
- Set Where products come from.
- If you chose Products I choose, press Choose from your catalogue under Products to offer and pick them. If you chose A collection, do the same under Collection to draw from. If you chose Shopify's recommendations, there is nothing to pick.
- Optionally set How many to show, a minimum price, and any products you never want offered.
- Press Save.
- Go back to the cart builder and press Review and publish. Nothing you changed reaches a shopper until you publish.
The product and collection pickers replace whatever is already in the box, they do not add to it. If you have five products picked and open the picker again to add a sixth, select all six.
Settings
| Setting | What it does |
|---|---|
| Where products come from | Three choices. Shopify's recommendations needs no setup and uses your own sales data. Products I choose uses the list below. A collection takes products from one collection. |
| Products to offer | The products you hand-pick, in the order you pick them. That order is kept, so put the one you most want sold first. Only used when the source is Products I choose. At most eight are used. |
| Collection to draw from | One collection. Only used when the source is A collection. Up to eight products are taken from it — see the limitations below, this is a sample, not the whole collection. |
| How many to show | Between 1 and 8 cards. The block is capped at about a third of the drawer's height, so more than four rarely all fit without scrolling. Four is used if you leave it empty. |
| Don't offer anything cheaper than | Optional price floor. Anything below it is dropped, so a £2 sticker cannot dominate a £400 cart. Compared against the price shown on the card. |
| Never offer these | A blocklist of products. It always wins — a blocked product is dropped no matter which source it came from, including from your own hand-picked list. |
How products are chosen
Your choice always beats the algorithm. The drawer checks, in order:
- Your products or your collection, if you set a source and it produced anything. Shopify is never asked in this case.
- Shopify's “complementary” products for the most valuable item in the cart. These only exist if you have set them up in Shopify's Search & Discovery app, so for most stores this is empty.
- Shopify's “related” products for that same item. This is what most stores end up showing.
The list is anchored on the highest-value line in the cart, not the most recently added one. Recommending off a cheap impulse buy tends to recommend more cheap impulse buys.
What is never offered
- Anything already in the cart.
- Anything on your Never offer these list.
- Anything below your minimum price.
- Anything with no variant in stock.
- Anything excluded from your reward thresholds. The upsell reuses the exclusion list from the rewards bar rather than asking you for a second one.
When you pick products yourself or name a collection, a few more are dropped while publishing: draft products, products not published to your online store, products that are entirely out of stock, and products with more than ten variants (one drop-down cannot honestly hold more).
What a shopper sees
- The heading reads You might also like. You can change it, and the button wording, on the Shopper copy screen.
- The price shown is the cheapest variant that is actually buyable, and the product name links to its page.
- A product with more than one available variant gets a drop-down.
Addstays greyed out until an option is chosen. Sold-out variants are listed but cannot be selected, so nobody hunts for a size that does not exist. - After a successful add the button reads Added, the card fades, and it removes itself two seconds later.
- If the add fails, the button quietly goes back to Add. No error is shown — the shopper's own cart is more important than an upsell that did not work.
- Adds made here are tagged on the cart line, so the app can tell an upsell add from a normal one.
How it behaves in the drawer
- It loads after the rest of the drawer has painted, with its height reserved first, so the shopper's own items never jump.
- The block is capped at roughly 30% of the drawer height and scrolls inside that cap. Nothing is clipped out of reach.
- The list is only recalculated when the most valuable item in the cart changes. Changing a quantity elsewhere will not reshuffle the cards under the shopper's finger.
- If there is nothing left to show — every candidate filtered out, or the request to Shopify failed or timed out — the whole block disappears. It never pads itself with a filler product and never shows an empty box.
Limitations
Things a merchant reasonably expects that this module does not do today.
- Your products are frozen at publish time. Hand-picked products and collection products are looked up when you publish and stored with the cart. Add a product to that collection afterwards and it will not be offered until you publish again. Nothing in the admin warns you that the list has gone out of date.
- A collection is sampled, not used whole. At most eight products are taken from it, and the same eight are shown to everyone. It does not rotate, randomise or personalise per shopper.
- More than eight hand-picked products are ignored. Only the first eight in your list are ever used.
- An empty result falls back silently. If you choose Products I choose or A collection and nothing survives publishing — empty list, everything out of stock, everything filtered — the drawer shows Shopify's recommendations instead. It does not go blank, and it does not tell you.
- You are not told what was dropped. The app records why each product was skipped while publishing (not active, not published, out of stock, too many variants) and then does not show you those reasons anywhere.
- The preview does not use your chosen products. The Preview screen falls back to Shopify's recommendations for this module, so it is not a reliable check of a hand-picked or collection source. Check it on the live storefront after publishing.
- A stale warning may appear in the cart builder. The builder can show “This rule doesn't match any products right now. Shoppers won't see the upsell.” even after you have configured the module correctly. The warning is checking the wrong thing. If your settings are saved and published, the module works — ignore this banner.
- The minimum price is not converted per market. It is compared against the price the shopper sees. On a store selling in more than one currency, the floor will filter differently abroad than at home.
- No bundle pricing and no upsell-only discount. Products are added at their normal price. There is no “add all” button, no quantity picker on the card, and no star ratings or review counts.
- No per-product rules. You cannot say “offer the lens only when a camera is in the cart”. Display rules control whether the whole module shows, not which product is offered.
Want the module to appear only for some carts — over a certain value, one country, phones only? Add a display rule from the module's settings screen. And remember: publish before checking your storefront, because saved is not live.