Available now
All prices net, plus VAT.
You buy the licence directly from us and receive an invoice from us. Installation by upload in the admin without SSH, updates through our licence platform, support straight from the developer.
From the first generation to the discount in the basket: build and approve sets, configure sources and limits, choose the position - and find out why a discount is not applying when in doubt.
Shopware 6.7 with Storefront, PHP 8.2 or newer. Background runs and the scheduled run need a working message queue; the built-in admin worker is enough.
Upload the ZIP in the admin under Extensions, install and activate it. Then enter the licence key on the licence screen.
If several sources are active, their weights add up. Genuine co-purchases count triple; "viewed together" weighs more than the catalogue sources and less than real purchases.
The maximum partner price limits how expensive a partner may be relative to the anchor product. At 60, a product costing 100 euros only gets partners up to 60 euros. This produces sets with accessory character rather than arbitrary pairings of cheap and expensive articles. Zero disables the rule.
Only available products excludes clearance articles without stock so no sets are created that the shop immediately hides again.Exclude manufacturers and exclude categories keep products out entirely - they become neither anchor nor partner. Useful for vouchers, spare parts or shipping articles.The normal run considers the strongest products from order history and is capped by "maximum anchor products per run".
In the Individual products tab you select articles deliberately. Sets are created for them without that cap, even if they barely appear in the order history. After the run the results appear directly below the selection and can be approved, rejected, deactivated or edited there.
A selected parent product includes its variants; the data basis always comes from the purchasable products.
If a run finds nothing for a product, relax the rules helps: for that single run all data sources are used, minimum values are set to one, price ratio and minimum AI score are suspended and the period widens to two years.
In a relaxed run the AI no longer discards sets but only scores and names them; its assessment still appears on every set. Results of a relaxed run always go into the review pool, even with auto-approval active.
Another run for the same product does not replace the existing sets but adds further ones - identical combinations are merely updated. How many sets a product shows in the shop is controlled by "maximum bundles shown"; the default is one. A marker points out anchor products with several sets, and the filter "only products with several bundles" in the review pool shows exactly those.
A set is either open, approved or rejected. The available buttons follow from that:
The coloured figures next to a set explain themselves on hover.
In the Individual products tab a set can also be assembled without any analysis. Pick products through the search, by name or article number. The first product chosen is the anchor and carries the "anchor" marker; the arrow on another product moves the anchor at any time. The rest are the partners.
Mutual assignment, name and discount can be set right away. The set goes into the review pool without analysis and without AI.
In the review pool it carries the source "created manually" and can be found through the source filter; right after creation it also appears in the result list below the selection.
The review pool can be filtered by source, category, property and manufacturer. The filters sit behind a toggle with a counter; active ones appear as removable chips below the bar.
The "select all" checkbox above the list reveals the bulk actions. "Approve selection" opens a window with the same fields as editing a single set: discount, mutual assignment, layout and collapsed state. The values apply to every selected set, which are then approved.
"Clean up rejected" sits next to the Rejected figure and removes the rejected sets in one go.
Four positions are available: at the top of the buy box, directly above the price; below the complete buy box; above the tab bar, meaning above description and reviews; or below the entire tab area.
"Do not display" hides the box without deleting the generated sets.
Show heading and show description text switch the two text lines of the box on or off. The texts themselves are maintained per set through "Edit".A set is always bought as a whole. Individual products cannot be deselected, so the discount clearly belongs to the complete set.
Show article number displays the article number under every product in the box and additionally behind the product names in the review pool. The search there then finds sets by article number too.The set button text can be adapted: either one text for all languages or one per language. Empty fields fall back to the general text first, then to the translated default.
With assign bundles both ways a set appears not only on the anchor product but also on the product pages of the partners it contains. The anchor product is shown there as an equal member of the set.
Link products controls whether the product name in the box leads to the product page. Switched off the name stays plain text and the customer stays where they are.
Click on a product defines what happens when a product in the box is tapped. The choices are quick info in a modal with image, article number, price and short description, product page in a new tab, product page in the same tab and nothing. The anchor product is never linked, since the visitor is already on its page.
Show unit price puts the unit price below the price, for example 12.90 € / 1 l. The value comes from Shopware and only appears for products that carry a content declaration. Strike price in red shows the crossed out original price in red; when off it stays grey.
The product layout determines the arrangement in the box. Wrap into rows shows four products per row, two on tablets, one on phones. Slider keeps all products in one swipeable row; on desktop arrows appear that disable themselves at the ends. List gives every product its own row across the full width.
With AI scoring active, every set is sent to the chosen provider. The AI decides whether the products belong together, assigns a score and, on request, writes a short sales headline. Sets below the minimum score are discarded and never reach the review pool.
Names, description texts and discount reasoning are produced by the AI in the default language of the shop.
At the top of the settings you choose the level: sales channel and language. Only storefront channels are offered, and only the languages assigned to the chosen channel.
Headline, description and button text are available per level and language. Empty fields inherit in this order: channel and language, general and language, the language-independent field, and finally the shop's own snippet.
The language selector starts with All languages (default) - that is where the language-independent texts live.
With this setting active, customers enter a quantity per product in the box. The total, the struck price and the saving recalculate at once.
The saving can be shown as a money amount instead of a percentage.
Switched off by default. When active, the discount applies as soon as all products of an approved set are in the basket. It appears there as its own line item and is determined afresh on every recalculation: if a product of the set leaves the basket, the discount disappears automatically.
The percentage from the settings applies to all sets. Through "Edit" a deviating value can be set per set, which then takes precedence.
The minimum set value prevents discounts on very small orders.
With bundle name as discount name the discount line carries the name of the set, such as "Garden set (-25 %)". The customer then sees in the basket which set triggered it.
With discount amount in cart set to Hide the discount line stays visible in the storefront, only the amount is not shown: in the cart, offcanvas cart, checkout, finish page and the orders in the customer account. The discount is still deducted, the totals stay the same. Order mail, invoice and admin keep showing the amount. Through "Edit" discount amount in cart can be set to Hide or Show per set, "General setting" follows the switch.
With image of the discount row you store an image in the settings that is used in the cart for the discount row of every set. Through "Edit" an own image can be chosen per set, which takes precedence over the general setting. Without a selection the Shopware placeholder stays.
Instead of a percentage, a discount as an amount can be stored per set: a fixed deduction in the shop currency, for example 5 for five euros. A value above zero wins over the percentage and never exceeds the set total. A zero means the percentage still applies.
The box in the shop shows the exact rate from the administration, including intermediate values such as 2.5 percent. The discount amount in the basket is rounded commercially to the decimal places of the currency.
Whether a set also appears on the variants of the anchor product is controlled globally in the settings and additionally per set through "Edit". Set to off, the set stays with the exact product it was created for, which is how a set for a single variant works.
With this setting the AI assigns a discount suggestion to every set during generation. The basis is how well the products fit - very coherent sets need only a small incentive, loosely fitting ones a larger one - and the price level of the set, because with expensive sets a few percent already carry weight.
The maximum AI discount caps the suggestion hard; the AI can never exceed it. The value lands as a percentage on the set, is visible in the review pool and can be changed through Edit at any time. Existing sets keep their value.
The discount is still only granted when the set discount is switched on overall.
The discount diagnosis in the settings checks whether a combination of article numbers would trigger a discount. It runs server side through exactly the same logic as the basket calculation.
If no discount applies, it names the concrete reason: switch off, unknown article number, no approved set, missing set product or a percentage of zero.
Changes to sets take effect in the shop immediately. On approval, rejection, deactivation, editing or deletion the affected product pages are removed from the cache specifically - the page of the anchor product and those of all partners it contains, variants included.
When generating from the administration a window shows the progress: anchor products processed, sets created and sets discarded by the AI. Continue in the background hands the run to the message queue - the admin is immediately usable again, a slim bar shows the state, and the run continues even with the browser closed.
The run is protected against interruptions: if a segment fails, the admin retries with growing pauses, and after reloading the page a running generation is picked up automatically. It works in segments and can be cancelled at any time - sets already created are kept.
On the console: bin/console staw:product-bundles:generate --size=3 --per-product=2
If no set appears on a product page although one should, the "check display" tool answers that in one go: enter an article number and it names the sets that appear on that page - and for the rest, the reason why not.
The check uses exactly the same matching as the storefront, including variants and mutual assignment. What it shows is therefore precisely what the customer sees.
Questions and requests come straight to us - support is from the developer, not from a queue. You can also request a feature through the Plugin Suite in the admin.
Every setting of the plugin with its default value and explanation, in the same order as in the administration. The texts come straight from the plugin (version 1.7.26).
Turns the bundle box in the shop on or off entirely.
Defines where the bundle box appears.
For themes that replaced the default templates so the box never appears. The box is then rendered at the end of the page and moved to the given place. It only kicks in when the regular position did not render.
CSS selector of the element the box should appear at, for example .product-detail-description.
Where the box sits relative to the chosen element.
Also shows the main product bundles on all of its variants.
Defines on which variants a bundle appears. Only the contained variant: box and discount apply only to the variant chosen as anchor in the bundle, for example when quantities in the set depend on the variant. For older bundles pick the variant as anchor in the edit dialog and save.
A bundle then also appears on the pages of its partner products, not only on the anchor product. Can additionally be set per bundle in the edit dialog.
How many bundle boxes appear on a product page at most. Allowed range: 1 to 6.
Limits the width in pixels and centres the box. 0 means no limit, then it follows the theme container. It has no effect in the buy widget, where the narrow column sets the width. Allowed range: 0 to 2400.
Wrap shows four products per row, two on tablets and one on phones. Slider keeps everything in one swipeable row, with arrows on desktop. List puts every product on its own row - the calmest option with many products.
Separate arrangement below 768 pixels. This allows a list on the desktop and a slider on mobile. The slider arrows do not appear there, swiping is used instead.
The bundle box shows only its heading at first, a click expands it. Requires the heading to be shown.
Shows or hides the headline of the bundle box. The text is maintained per bundle via "Edit".
Shows or hides the line below the headline. The text is maintained per bundle via "Edit".
Hides a bundle as soon as one product is no longer available or visible.
Uses the sum of the recommended retail prices as the struck through price where products carry one. The discount then looks larger. Without an RRP the regular total stays the basis.
Used in the cart for the discount row of every bundle. An image on the individual bundle takes precedence. Without a selection the Shopware placeholder stays.
Shows the crossed out original price in red. When off it stays grey.
Customers can enter a quantity per product in the box. The total updates immediately. When off every product is added once.
If a product of the set is a variant, a dropdown with its sibling variants appears. Price and cart follow the selection, and the discount still applies when another variant was chosen.
Shows the unit price below the price, for example 12.90 € / 1 l. The value comes from Shopware and only appears for products that carry a content declaration.
Shows the product number under every product of the bundle box and in the review pool.
What happens when a customer taps a product in the box. The anchor product is never linked, since the visitor is already on its page.
How many products a bundle contains in total, including the anchor product.
How many different bundles are created for one product. The sets do not overlap.
Allows bundles with fewer products when not enough matching partners are found.
Limits the runtime on large catalogs.
Skips products that already have a bundle.
Products bought together in the order history. The strongest source.
How often two products must have been bought together.
How far back the order history is evaluated.
Products that visitors looked at within the same visit. Needs the tracking switched on and some time to collect data.
Records on product pages which products are viewed in the same visit. No cookies, session only, bots are discarded.
How many recently viewed products per visit are paired with the current product. Allowed range: 2 to 20.
How often two products must have been viewed together before the pair counts.
Older counters are deleted during generation and by the scheduled task. Allowed range: 30 to 3650.
Counts per bundle how often it was seen, added to the cart and ordered. The numbers appear on every bundle in the review pool. When off nothing is counted any more, existing numbers are kept.
Cleans up the review pool automatically. 0 keeps rejected bundles forever. Allowed range: 0 to 3650.
Products from the same categories. Helps when there is little order history.
Products with the same property values.
Products of the same manufacturer. Only useful as a last resort.
Ignores disabled products during creation.
A partner may cost at most this share of the anchor price. 60 means: for a 100 euro product only partners up to 60 euro qualify. 0 disables the rule. Allowed range: 0 to 1000.
Combinations rejected once are not suggested again, not even after the review pool was cleared.
Excludes products sold as closeout without stock. Prevents bundles that vanish from the shop right away.
Grants the discount once every product of a bundle is in the cart. Off by default.
Applies to all bundles. A value set on a bundle takes precedence, 0 means use this value. Allowed range: 0 to 90.
The discount line in the cart carries the name of the bundle, e.g. "Garden set (-25 %)". The customer immediately sees which set earned the discount. When off, the label below is used.
Leave empty to use the bundle name.
How the discount reacts to quantities differing from the one stored in the bundle. Only the stored quantity: less is not possible, more is not discounted. More allowed: the stored quantity is required, every further unit counts fully. Any quantity: one unit per position is enough. Only takes effect with a changeable quantity.
Shows the saving as a sum of money instead of a percentage. With a fixed amount or the RRP basis this applies anyway.
Below this set value no discount is granted. 0 disables the limit.
Lets the AI check and name every set. Without AI only the data sources count.
The selected provider is used for scoring.
Sets below this value are discarded. Allowed range: 0 to 100.
Lets the AI write a short sales headline for the set.
During generation the AI suggests a discount rate per bundle - based on how well the products fit together and the price level of the set. The suggestion is stored as the percentage on the bundle and can be changed in the review pool at any time. Only takes effect while the bundle discount is switched on.
Cost brake for large catalogues. Once the limit is reached the remaining bundles are created without AI. 0 means no limit.
Upper limit for the suggestion. The AI can never assign more than this value. Allowed range: 1 to 50.
Approves bundles from the configured score without a manual review.
Only bundles from this total score are approved automatically. Allowed range: 0 to 100.
Regularly creates new bundles via the scheduled task.
All prices net, plus VAT.
You buy the licence directly from us and receive an invoice from us. Installation by upload in the admin without SSH, updates through our licence platform, support straight from the developer.
The plugin will be listed in the official Shopware Community Store. Installation and automatic updates then run through the plugin manager in the backend, billing through your Shopware account. We will link it here as soon as it is available.