WordPress

WooCommerce Upsells and Cross-Sells: How to Set Them Up (and Fix Them When They Don’t Show)

How to add upsells and cross-sells in WooCommerce, where each one appears, why cross-sells may not show, and how to choose offers that sell.

On this page 9 sections
  1. Upsell vs cross-sell in WooCommerce: the difference
  2. How to add upsells and cross-sells in WooCommerce
  3. Where upsells and cross-sells appear, and how your theme changes that
  4. Why WooCommerce cross-sells (or upsells) are not showing
  5. Change how many upsells and cross-sells appear (code)
  6. What to offer: choosing upsells and cross-sells that sell
  7. When native linked products are not enough
  8. How to tell whether your upsells work
  9. FAQ

In WooCommerce, an upsell is a better or more complete version of the product a shopper is looking at, and a cross-sell is a product that goes with what is already in the cart. You set both on each product, under Product data → Linked Products. By default, upsells appear on the product page and cross-sells appear on the cart page.

Linking the products takes a few minutes. Most of the work is in two other places: choosing what to offer, and working out why an offer doesn’t appear when you expected it to. This guide covers the setup, where each type shows up, the most common reasons cross-sells go missing, a few code snippets for changing the defaults, and what to do once linking products by hand stops scaling.

Upsell vs cross-sell in WooCommerce: the difference

Both features try to raise the value of an order, but they appear at different moments and serve different purposes.

Upsell Cross-sell
What it offers An alternative to the current product: a higher tier, a larger size, a premium version A complementary product: something used together with what is in the cart
Where WooCommerce shows it Single product page, below the product summary and tabs Cart page
Default heading “You may also like…” “You may be interested in…”
How many show by default All linked upsells (in the classic template) Two (in the classic cart template)
Example Basic headphones → the noise-cancelling model Headphones in the cart → a carrying case

The third related feature is Related products. You don’t pick these yourself. WooCommerce chooses them from the same categories and tags and shows them on the product page under the upsells. You can only influence them by categorizing and tagging your products well. More on that in our article about why related products matter for the customer experience.

How to add upsells and cross-sells in WooCommerce

The setup is the same for both and is done one product at a time:

  1. In your WordPress dashboard, go to Products → All Products and open the product you want to add offers to.
  2. Scroll down to the Product data box and click the Linked Products tab.
  3. In the Upsells field, start typing a product name or SKU and select the products you want to suggest as alternatives.
  4. In the Cross-sells field, do the same for products that complement this one.
  5. Click Update.

A few details that are easy to miss:

  • Cross-sells belong to the product that triggers them. If you want a case suggested whenever headphones are in the cart, add the case as a cross-sell on the headphones, not the other way around.
  • Variable products: the Linked Products fields are on the parent product, so all variations share the same upsells and cross-sells.
  • Grouped products have an extra field in the same tab, Grouped products, which is a different feature. We cover it in our guide to product bundles in WooCommerce.

The official reference is WooCommerce’s own page on related products, up-sells and cross-sells.

Where upsells and cross-sells appear, and how your theme changes that

In a classic WooCommerce setup, upsells are printed on the woocommerce_after_single_product_summary hook, just before related products. Cross-sells are printed on the woocommerce_cart_collaterals hook, next to the cart totals. Those are WooCommerce’s default positions. Your theme decides the rest.

  • Classic themes usually keep these hooks, but they may restyle the sections, rename the headings or move them into a slider.
  • Block themes and the Cart block show cross-sells as part of the Cart block. You can show, hide or edit that section in the Site Editor.
  • Themes with their own builders let you place these sections wherever you like. In XStore, for example, the Single Product Builder controls the product page layout. The theme also includes built-in Frequently Bought Together blocks and can show cross-sells right after a shopper clicks “Add to cart”, so the offer appears while the shopper is still deciding.

If you are not sure what your theme does, add one upsell and one cross-sell to a test product, then view the product page and the cart in a private browser window.

Why WooCommerce cross-sells (or upsells) are not showing

This is one of the most common WooCommerce support questions. Work through these causes in order:

1. You are looking on the product page

By default, cross-sells appear only on the cart page. If you want complementary products on the product page as well, see the snippet further down, or use a Frequently Bought Together feature.

2. The suggested product is already in the cart

WooCommerce leaves out any cross-sell that is already in the cart, which is sensible. If every suggestion is already there, the section disappears.

3. The product isn’t visible in the catalog

WooCommerce only shows upsells and cross-sells that a shopper could buy: published, not hidden from the catalog, and not out of stock when WooCommerce → Settings → Products → Inventory → Hide out of stock items is turned on. A draft, private or sold-out product is skipped without any warning.

4. You expect more than WooCommerce shows

The classic cart template shows two cross-sells and picks them at random from everything linked to the cart contents. If you linked six products, you’ll see a different two on each visit. That is expected behavior, not a bug.

5. The Cross-Sells section is hidden in the Cart block

If your cart page uses the Cart block (the default for new stores since WooCommerce 8.3), open the Cart page in the editor and check that the Cross-Sells section is present and visible.

6. Your theme or page builder removed the hook

A custom cart template built with a page builder may never call woocommerce_cart_collaterals. To check, switch to a default theme such as Storefront or Twenty Twenty-Five on a staging copy. If cross-sells appear there, the cause is in your theme or builder template.

7. A plugin is filtering them out

Some “smart recommendation” or cart plugins replace the native sections. To find the culprit, deactivate plugins on a staging copy one at a time.

Change how many upsells and cross-sells appear (code)

WooCommerce has filters for the number of items and columns. Add the code below to your child theme’s functions.php or to a code snippets plugin. It affects classic templates. The Cart block has its own settings in the editor.

// Show up to 4 cross-sells in 4 columns on the cart page
add_filter( 'woocommerce_cross_sells_total', function () { return 4; } );
add_filter( 'woocommerce_cross_sells_columns', function () { return 4; } );

// Limit upsells on the product page to 3
add_filter( 'woocommerce_upsells_total', function () { return 3; } );
add_filter( 'woocommerce_upsells_columns', function () { return 3; } );

Want cross-sells on the product page too? Don’t call woocommerce_cross_sell_display() there: that function reads the cart’s cross-sells, not the current product’s. Read the product’s own list instead:

add_action( 'woocommerce_after_single_product_summary', function () {
    global $product;
    $ids = $product ? $product->get_cross_sell_ids() : array();
    if ( empty( $ids ) ) {
        return;
    }
    echo '<section class="product-cross-sells"><h2>Pairs well with</h2>';
    echo do_shortcode( '
' ); echo '</section>'; }, 16 );

Priority 16 places the section right after upsells (15) and before related products (20). Test on staging first, and if you translate your store, wrap the heading in a translation function.

What to offer: choosing upsells and cross-sells that sell

The technical part is simple. Most of the results come from picking the right products to suggest. These rules hold up in most catalogs:

Good upsells

  • Meet the same need, better. A bigger capacity, a better material, a longer warranty. If the shopper has to rethink what they wanted, it isn’t an upsell, it’s a distraction.
  • Are a reasonable step up in price. For example, suggesting a $99 waterproof version of a $79 jacket is an easy decision. A $300 version is a different purchase.
  • Make the difference obvious. Use product titles or short descriptions that say what the upgrade adds, so shoppers can compare at a glance.

Good cross-sells

  • Complete the use. Filters for a coffee machine, a case for a phone, care spray for leather shoes.
  • Cost less than the main item. A low-priced add-on is easy to accept at the cart. A second expensive item needs its own decision.
  • Need no extra choices. One-size accessories work better than items that require picking a size or color in the cart.

Examples by store type

Store Upsell idea Cross-sell idea
Fashion Basic tee → premium cotton tee or a 3-pack Jeans → belt, socks
Electronics Standard charger → fast charger Laptop → sleeve, mouse, USB-C hub
Beauty Travel size → full size Cleanser → toner, cotton pads
Coffee 250 g bag → 1 kg bag Beans → grinder, filters

Use your own data where you have it. Export recent orders that contain more than one item and look for pairs that show up again and again. Those pairs are your best cross-sell candidates.

When native linked products are not enough

WooCommerce’s built-in upsells and cross-sells are a solid start, but they have clear limits:

  • Everything is manual. With hundreds of products, linking and maintaining offers by hand rarely gets done.
  • No rules. You can’t say “suggest this to anyone with a camera in the cart” or “offer this when the cart is under the free-shipping threshold”.
  • Fixed places and random order. Cross-sells appear only in the cart, and both lists show in random order.
  • No discount and no reporting. You can’t offer the cross-sell at a better price, and you can’t see which suggestion actually earned money.

When you hit these limits, you have two routes. If you are choosing a theme, XStore already includes Frequently Bought Together and cross-sells after “Add to cart”, with no extra plugins needed. If you want to keep your current theme, SalesMax is an upsell plugin from 8theme that covers each point of the buying journey. It includes Frequently Bought Together and Smart Recommendations (rules based on category, cart contents, order history or totals) on the product page, Cart Page Upsells and a Free Shipping Bar in the cart, Checkout Offers, and Post-Purchase Offers after the order. Every booster reports the revenue it generated. Plans start at $5/month (billed annually) with a 14-day money-back guarantee.

Not sure where your store loses add-on sales? The free SalesMax AI store scan goes through your store the way a shopper would, from the product page to the cart and checkout, and shows which selling moments have no offer. It reads only public pages, needs no signup and takes a couple of minutes.

For a wider view of order-value tactics, see our guides on how to increase average order value in WooCommerce and the top WooCommerce plugins for average order value.

How to tell whether your upsells work

Don’t judge by gut feeling. Use numbers you already have:

  1. Write down a baseline. In WooCommerce → Analytics → Orders, note your average order value and average items per order for the last 30 days before you change anything.
  2. Change one thing at a time. If you add cross-sells and also launch a sale in the same week, you won’t know which one moved the numbers.
  3. Compare equal periods. Give it two to four weeks, then compare with the same period before, keeping seasonality and campaigns in mind.
  4. Look at products, not only totals. If an accessory starts selling more often since you added it as a cross-sell, keep it. If a suggestion never sells, replace it.

Also keep an eye on speed. Native upsells add almost nothing to page weight, but every extra plugin adds scripts. After any change, run your product and cart pages through the free FlashMax speed test.

FAQ

What is the difference between an upsell and a cross-sell in WooCommerce?

An upsell suggests a better alternative to the product being viewed and appears on the product page. A cross-sell suggests a complementary product and appears on the cart page. You set both under Product data → Linked Products.

Can I show cross-sells on the product page?

Not by default. You can add them with a small code snippet that reads the product’s cross-sell IDs (shown above), use a theme that offers a Frequently Bought Together block, or use a plugin such as SalesMax.

Why are my WooCommerce cross-sells not showing?

The most common reasons: you are looking on the product page instead of the cart; the suggested product is already in the cart; it is out of stock, hidden or unpublished; the Cart block’s Cross-Sells section is hidden; or your theme’s cart template doesn’t call the WooCommerce hook.

How many upsells should I add to a product?

Usually two or three relevant ones. More options make the choice harder, and WooCommerce shows every linked upsell by default, so a long list can push related products and reviews far down the page.

Can I give a discount on a cross-sell?

Not with native linked products. You can create a coupon, but it won’t be tied to the suggestion. Plugins like SalesMax let you attach offers and discounts to specific moments such as the cart or checkout.

Do upsells slow down WooCommerce?

Native upsells and cross-sells have very little effect on speed. Plugins that add pop-ups, sliders or tracking scripts can, so test your key pages before and after installing one.

Share

Written by

Alex Carter

Alex writes practical WordPress and WooCommerce guides for the 8theme blog.

All 17 articles by Alex Carter