Post-Purchase Upsell & Cross-Sell
Choosing the offer
You can run as many campaigns at once as you like. For any single order, though, the customer sees exactly one offer – never several at the same time and never another after responding.
How the winner is picked
When more than one campaign could apply, the winner is picked like this:
- Qualify. Every campaign assigned to the order's sales channel is checked against the whole order (all items together). To qualify it must be active and within its valid-from/until dates; its trigger must be present in the order; the order's net value must be between the campaign's minimum and maximum order values; and the customer group, shipping country and the order's payment method must all be allowed. A campaign is skipped if one of its excluded products is in the order. For a fixed product, the offer product must not already be in the order; for a Dynamic Product Group or cross-selling, this check happens when a candidate product is considered.
- Rank by trigger. Campaigns for a specific product take precedence over category and manufacturer campaigns. These take precedence over campaigns for any order. Priority decides only within the same tier.
- Rank by priority within the same tier. When two qualifying campaigns are equally specific (for example two product-to-product campaigns, or a category and a manufacturer campaign), the highest Priority wins.
- Break ties. If two are still level, the most recently edited one wins, so give same-tier campaigns distinct priorities when you want to be certain which shows.
- Select and check the offer product. The offer source determines which products are checked. The first eligible product is offered. If none qualifies, the next-best campaign is checked while the time limit permits.
Trigger and offer source
The trigger decides which orders the campaign targets. The offer source decides where its one offer product comes from.
- Trigger
- Customer bought a coffee machine.
- Offer source
- Dynamic Product Group "Coffee accessories"
- Offer
- One suitable product from that group.
- Trigger
- Always (any order)
- Offer source
- Cross-selling: include the name "Upsell".
- Offer
- One suitable product from an included cross-selling in the order.
Product selection by offer source
- Fixed product: The extension checks the selected product.
- Dynamic Product Group: The search starts at a random position in the group's index. Active products available in the customer's sales channel are checked in random order.
- Cross-selling: Products matching the campaign's trigger are checked first, followed by the remaining order lines, each group in descending line-value order. For Always (any order), all product lines follow that order. Their included active cross-sellings follow their tab order; several can have the same name. Manually assigned products are checked in their configured order from a random starting position. Cross-sellings based on a Dynamic Product Group use the group search.
Parent products and products already in the order are skipped. With Dynamic Product Groups and cross-selling, ordering one variant also excludes the other variants of that parent. The campaign's stock and shipping policies still apply.
Search limits
| Offer source | Limit |
|---|
| Dynamic Product Group | Up to 2,048 members are read and up to 24 products from them are checked. |
| Cross-selling | Up to 10 order lines, up to 8 active cross-sellings included by the campaign per line, up to 24 products checked per cross-selling and at most 96 distinct candidate products per campaign. |
A few things worth knowing
- Product groups follow Shopware's index. After changing a group, let Shopware finish indexing it. Each selected product is also checked against the group's conditions in the customer's sales channel. The preview uses the current conditions directly, so it can show products before indexing finishes. For a cross-selling based on a Dynamic Product Group, all group members can be considered; the cross-selling tab's sorting and display limit do not restrict the offer source. Manually assigned cross-selling products keep their configured order, starting at a random position.
- Add a condition on the active status and one on visibility in the sales channel to the group. Shopware's index of a product group does not take sales channels into account. If a group holds many products that are not active or not visible in the customer's sales channel, the offer search has to check more members; if fewer than one in every 2,048 group members is sellable in the sales channel, the offer search may find no offer, depending on where it starts. The two conditions ensure that the group contains sellable products; where the product ranges of the sales channels differ significantly, create one group per sales channel.
- A time limit keeps the search bounded. The default is 1,000 milliseconds for the whole search, not for each campaign. If the limit is exceeded, the customer sees the ordinary order confirmation page without an offer. See Offer search time limit (milliseconds).
- Recorded rejections are not retried on reload. While an order has a Suppressed entry, reloading the confirmation page does not search again, even after stock or campaign changes. Removing the entry, deleting its campaign or the automatic history cleanup can allow a new search. If no campaign qualified and no entry was recorded, a later visit can search again.
- The whole order decides, not a single item. Any item can satisfy a trigger. A larger order can make more campaigns qualify (more triggers met, higher value) or fewer (it contains an excluded product, already contains the fixed offer product or a considered group member, or pushes the value over a maximum).
- One offer for the order, not one per product. If two products would each suggest an add-on, the customer still sees only the single best-ranked offer.
- After acceptance or decline, the order receives no further offer.
- Cart promotions count too. If the order contains a cart promotion, a campaign whose policy is Suppress offer when a cart promotion exists is held back (visible on the Activity tab with the suppression reason); a campaign set to Stack promotion and calculate the actual add-on amount stays in the running. Voucher line items without a product reference do not break campaign matching.
Tip
Aim campaigns with the tightest trigger you can – a product-to-product campaign always outranks a broader one for the orders it targets. Use Priority to order campaigns of the same specificity, and tight filters so the right campaign wins for the right order.