Skip to content

Smart Product Recommendations Engine

Magento 2.4.7 – 2.4.9 Luma Hyvä

Replace fragile, hand-curated product relations on Adobe Commerce and Magento Open Source with a small set of rules over any product attribute (name, color, manufacturer, custom tags, price) and let the storefront populate Related Products, Up-Sells, and Cross-Sells on its own. For example, a fashion store can configure a single "same-color" rule, and every product page then automatically shows colour-matched Related Products – with no need to edit product relations one item at a time.

Smart Recommendations is a deterministic, rule-based engine. It plugs into the platform's three native product-link blocks via plugins, never replaces them, and respects existing admin-curated relations under its Append and Fill-up modes. There is no AI, no external API, no SaaS dependency – the engine runs on your server and reads only your live EAV catalog.

Each of the three positions (Related, Up-Sell, Cross-Sell) is configured independently:

  • Choose one of four interaction modes – Replace native, Append after native, Fill-up to max, or Auto only.
  • Define matching rules with priority ordering. Each rule pairs a product attribute with one of seven match types: Token overlap, Slash-tag overlap, Same value, Any value matches, Price range ±%, Starts with, or Exact match.
  • Cap output with "Max products" – native and engine output combined always honour the cap. Deduplication across rules is automatic.

The Cross-Sells position aggregates from every line item in the cart and excludes items already added.

A master switch turns the entire module on or off site-wide without clearing rule configuration. Out-of-stock filtering and "hide block when empty" are global toggles that apply to all three positions.

The admin rules editor is a collapsible accordion. Each rule has auto-built title summaries, inline JSON validation for matcher parameters, and compatibility hints when the chosen attribute does not match the matcher's expected EAV input type.

Hyvä Theme is supported out of the box – the module ships an additional plugin on Hyvä's ProductList ViewModel so engine output flows into the same three positions on Hyvä storefronts. No additional setup; install on a Luma + Hyvä multi-store project and both storefronts pick up the engine. The module renders only on product, category, and cart pages and does not modify the checkout flow, so it is compatible with both Magento's native checkout and any third-party checkout layer.

Multi-store ready: every configuration field is store-scoped, so different store views can run different rule sets.

The module owns no database tables. Configuration lives in core_config_data. Disabling the module leaves no orphaned data.

Key Features

  • Drives Magento's three native product-link blocks – Related Products, Up-Sells, and Cross-Sells – from rules instead of per-product manual curation.
  • Four interaction modes per position: Replace native, Append after native, Fill-up to max, Auto only.
  • Seven match types over any product attribute: Token overlap, Slash-tag overlap, Same value, Any value matches, Price range ±%, Starts with, Exact match.
  • Works with built-in and custom EAV attributes – the attribute picker reads the live catalog.
  • Deduplication and budget enforcement across rules: never repeats a product, never exceeds the position's "Max products" cap.
  • Out-of-stock filter and "hide block when empty" as global toggles.
  • Master Enabled toggle for site-wide on/off without losing rule config.
  • Admin rules editor with collapsible accordion, auto-built rule titles, inline JSON validation, and matcher compatibility hints.
  • Hyvä Theme storefront support out of the box.
  • Multi-store: every field is store-scoped.
  • Cache-aware: saves invalidate full_page and block_html automatically.
  • No own database tables – configuration in core_config_data.
  • 88 PHPUnit tests, 35+ E2E tests across Luma admin, Luma desktop, and Hyvä desktop.

Versions

v1.0.2 Sep 15, 2026

Version 1.0.2 (2026-06-18) – maintenance release.

Fixed:

  • Installable on PHP 8.5: the Composer PHP constraint now admits 8.5, so the module installs on Magento 2.4.9 environments running PHP 8.5. No functional changes.

Compatibility:

  • Magento Open Source / Adobe Commerce 2.4.7 – 2.4.9
  • PHP 8.1, 8.2, 8.3, 8.4, 8.5

FAQ

Adobe Commerce and Magento Open Source show Related Products, Up-Sells and Cross-Sells only for the links someone set by hand, product by product. On a catalogue of any size those blocks end up empty on most pages, or stale on the pages that were curated once and never revisited.

This extension fills the same three blocks from a small set of rules over your product attributes – same colour, same manufacturer, overlapping name words, a price within 20 % – configured once per position rather than once per product. Linking products by hand stops being the only way to get anything into those blocks.

  • Your Related, Up-Sell or Cross-Sell blocks are mostly empty because nobody has time to link products one at a time.
  • Your attributes already describe what belongs together. Colour, brand, material, a tag attribute like summer/sport/casual, or simply the product name – the rules match on what the catalogue already holds, built-in and custom attributes alike.
  • You have curated some links and want to keep them. Append and Fill-up modes show your hand-set products first and let the rules fill the rest.
  • You run Luma and Hyvä side by side, or plan to move from one to the other. The same configuration drives both storefronts.
  • Different store views need different logic – every setting, rules included, is store-scoped.
  • You want recommendations based on what shoppers do – "customers who bought this also bought", recently viewed, trending, or per-customer suggestions. This extension never looks at orders, sessions or customers; a behaviour-based product is the right tool.
  • You need recommendation blocks outside the three native positions – home page, category listing, CMS pages, checkout or e-mail. This extension adds no new blocks or widgets; it fills the product page and cart page blocks the platform already has.
  • Your storefront is headless (PWA Studio or another GraphQL front end). The extension works through the Luma blocks and the Hyvä view model; the GraphQL product-link fields are not changed.
  • Your attributes are thin. If products carry little more than a name and a price, the rules have little to match on. Enriching the catalogue comes first.
  • A handful of hand-picked links per product is all you need. The platform's own product relations do that, at no cost.
  • Fills three positions, each enabled and configured on its own: Related Products and Up-Sells on the product page, Cross-Sells on the cart page.
  • Four modes per position: Replace native, Append after native (the default), Fill-up to max, and Auto only.
  • Seven match types: Token overlap, Slash-tag overlap, Same value, Any value matches, Price range ±% (20 % unless set), Starts with, and Exact match. A rule pairs one attribute with one match type, a priority, a count and optional JSON parameters; the attribute list is read from your live catalogue.
  • Keeps within limits: rules run in priority order, a product never appears twice, and native and rule-based items together never exceed the position's Max products (4 by default).
  • Filters what it shows to enabled products visible in the catalogue for the current store, and by default leaves out out-of-stock products. An empty block is hidden unless you switch that off.
  • Cross-Sells from the whole cart: rules run for every cart line, and items already in the cart are excluded.
  • Admin rules editor as a collapsible list with automatic rule titles, inline JSON validation that blocks Save Config until the JSON is valid, and a hint when an attribute's input type does not suit the chosen match type.
  • Master switch that returns the storefront to native behaviour without losing any rule. The extension ships switched off.
  • Clears full-page and block caches when its configuration is saved, so a rule change shows on the next page load.
  • Works on Luma and Hyvä with the same configuration, and adds no database tables – settings live in the platform's configuration table.
  • It does not learn anything. There is no purchase, browsing or customer data behind a match and no model of any kind – a rule compares attribute values, and the same rule over the same catalogue gives the same pool of products. Where several products match equally well, the pick among them is shuffled, so a page can show a different selection after its cache refreshes.
  • It does not personalise per shopper. Every visitor to a store view sees the result of the same rules.
  • It does not add blocks, widgets or positions. No home page, category page, CMS, mini-cart, checkout or e-mail recommendations, and no "frequently bought together" bundle with a combined add-to-cart.
  • It does not scope a rule to part of the catalogue. Rules apply to every product in the store view for that position; there is no "only for this category" or "only for this attribute set" condition, and no product to pin or exclude by hand beyond the platform's own links.
  • It does not pre-compute anything. Matches are queried from the catalogue when a block renders. Product pages are then held by full-page cache; the cart page is never cached by the platform, so Cross-Sell rules run on each cart view.
  • It has no reports, A/B testing, console command or cron job, and does not change the GraphQL API.
  • It calls nothing and sends nothing. No external service, no telemetry, no account.

Reviews

No reviews yet. Be the first to share your experience.

Sign in to write a review.