Skip to content

How-To: Reach a Free Shipping Threshold with Recommendations

Many webshops offer free shipping when a customer's cart value exceeds a fixed threshold (for example, free shipping above 100 EUR). When a customer is close to this threshold, recommending the right products can help increase conversion, especially if those products make it easy to reach the threshold without overshooting it.

This guide explains how to use Relewise price filtering to recommend products that help customers reach a free shipping threshold in a controlled and predictable way. Examples use EUR.

The core idea

  1. Determine how much value is missing before the customer qualifies for free shipping.
  2. Recommend products priced close to that missing amount.
  3. Avoid recommending products that are far more expensive than necessary.

This ensures recommendations feel helpful rather than pushy, and avoids suggesting products that are unlikely to be added "just for shipping."

Example scenario

  • Free shipping threshold: 100 EUR
  • Current cart value: 70 EUR
  • Missing amount: 30 EUR

In this situation, you want to recommend products priced around 30 EUR, not products costing 5 EUR (too small to matter) and not products costing 120 EUR (unrelated to the goal).

Step 1: Calculate the missing amount

First, calculate how much value is missing before the free shipping threshold is reached:

missingAmount = freeShippingThreshold - cartSubtotal

If the missing amount is less than or equal to zero, the customer already qualifies for free shipping and this recommendation strategy should not be applied.

Use the same rules as your shipping logic

The cart subtotal and the free shipping threshold must be calculated using the same rules and currency as your shipping logic (for example, discounts, coupons, or excluded product types).

Step 2: Define a sensible price range

Rather than filtering on a single price, define a price window around the missing amount. This gives the recommendation engine flexibility while keeping results relevant.

A commonly effective default range is:

  • Minimum price: about 70% of the missing amount
  • Maximum price: about 130% of the missing amount

Example

  • Missing amount: 30 EUR
  • Minimum price: 21 EUR
  • Maximum price: 39 EUR

This range encourages recommendations that can realistically help the customer reach the threshold with one additional product.

The exact multipliers can be adjusted depending on the catalog:

  • Accessory-heavy catalogs may benefit from a wider lower bound.
  • Premium catalogs may require a higher upper bound.

Step 3: Apply list or sales price filters

Relewise supports price-based filtering through ProductListPriceFilter and ProductSalesPriceFilter, which allow you to constrain recommendations to a specific price range.

To cover both list and sales price, wrap the filters in an OrFilter so a product can match either price. If you only store one price type, use that filter alone.

csharp
// Create the recommender client
IRecommender recommender = new Recommender(
  new Guid("DATASET_ID"),
  "API_KEY",
  "SERVER_URL");

// Compute how much value is missing to reach free shipping
decimal freeShippingThreshold = 100m;
decimal cartSubtotal = 70m;
decimal missingAmount = freeShippingThreshold - cartSubtotal;

var currency = new Currency("EUR");
var cartItems = new[]
{
  new ProductAndVariantId("PRODUCT_1", "VARIANT_1"),
  new ProductAndVariantId("PRODUCT_2", "VARIANT_2")
};

// Build the recommendation request
var request = new PurchasedWithMultipleProductsRequest(
  new Language("da-DK"),
  currency,
  "Basket page",
  User.Anonymous(),
  cartItems);

// Allow filling and include pricing in the response
request.Settings.AllowFillIfNecessaryToReachNumberOfRecommendations = true;
request.Settings.SelectedProductProperties = new SelectedProductPropertiesSettings
{
  Pricing = true
};

// Apply price filters only when there is a missing amount
if (missingAmount > 0)
{
  // Define the price window around the missing amount
  decimal minPrice = missingAmount * 0.7m;
  decimal maxPrice = missingAmount * 1.5m;
  var priceRange = new Range<decimal?>(minPrice, maxPrice);

  // Match products by list OR sales price within the range
  request.Filters.Add(new OrFilter(new Filter[]
  {
    new ProductListPriceFilter(priceRange, currency),
    new ProductSalesPriceFilter(priceRange, currency)
  }));
}

// Execute the recommendation request
ProductRecommendationResponse response = await recommender.RecommendAsync(
  request,
  CancellationToken.None);
js
// Create the recommender client
const recommender = new Recommender('DATASET_ID', 'API_KEY', {
  serverUrl: 'SERVER_URL',
});

// Base request settings
const settings: Settings = {
  language: 'da-DK',
  currency: 'EUR',
  displayedAtLocation: 'Basket page',
  user: UserFactory.anonymous(),
};

// Compute how much value is missing to reach free shipping
const freeShippingThreshold = 100;
const cartSubtotal = 70;
const missingAmount = freeShippingThreshold - cartSubtotal;

// Build the recommendation request
const purchasedWithMultipleProductsBuilder = new PurchasedWithMultipleProductsBuilder(settings)
  .addProducts([
    { productId: 'PRODUCT_1', variantId: 'VARIANT_1' },
    { productId: 'PRODUCT_2', variantId: 'VARIANT_2' },
  ])
  .setNumberOfRecommendations(10);

// Apply price filters only when there is a missing amount
if (missingAmount > 0) {
  // Define the price window around the missing amount
  const minPrice = missingAmount * 0.7;
  const maxPrice = missingAmount * 1.5;

  // Match products by list OR sales price within the range
  purchasedWithMultipleProductsBuilder.filters(f => f.or(or => or
    .addProductListPriceFilter(minPrice, maxPrice)
    .addProductSalesPriceFilter(minPrice, maxPrice)
  ));
}

// Execute the recommendation request
await recommender.recommendPurchasedWithMultipleProducts(purchasedWithMultipleProductsBuilder.build());

Step 4: Exclude products already in the cart

To avoid recommending products the customer has already added, exclude all cart items from the recommendation request.

If you use the PurchasedWithCurrentCart or PurchasedWithMultipleProducts recommendation types, pass the current cart items into the request. Those request types already handle excluding the cart items from the results.

Step 5: Handle edge cases

Very small missing amounts

If the missing amount is very small (for example, 2 to 5 EUR), a strict percentage-based range may return no results. In these cases, consider:

  • Allowing a broader maximum price
  • Falling back to a predefined "small add-ons" category

Not enough products in range

If too few products match the initial price window:

  • Gradually widen the upper bound
  • Avoid widening the range so much that recommendations lose relevance

Discounts and shipping rules

Ensure your calculation matches the webshop's shipping logic:

  • Discounted versus list price
  • Inclusion or exclusion of gift cards
  • Market-specific thresholds

Summary

Reaching a free shipping threshold is a highly effective recommendation use case when handled carefully. By calculating the missing amount, applying a controlled price range, and filtering with list or sales price, you can deliver recommendations that feel intentional and helpful.

Don't know us? Don't worry - you can find more information about us, by visiting our main page www.relewise.com