Catalog Promotions Feature #3895
Replies: 7 comments
-
|
@dlhck Hi In projects targeting real-world ecommerce (especially B2C in MENA), merchants consistently expect “catalog-wide” promotions — e.g., “Buy 1 Get 1”, “20% off all Jackets”, or “Flash Sale for Accessories” — applied before the cart, visible on PLP/PDP, and SEO-indexable. As a strong reference, Sylius has a clean separation between: Their CatalogPromotion system allows: For Vendure, even a minimal core layer (e.g. CatalogPromotion, condition evaluation, price mutation at product query time) would: |
Beta Was this translation helpful? Give feedback.
-
|
eligible-promotions-resolver.txt This is indeed something we've been struggling with. We have a custom build solution for now. Explanation🏷️ eligiblePromotions Resolver
Purpose: To return a list of promotions relevant to a specific product variant, using mock orders to simulate different eligibility scenarios. 💸 promotionPrice Resolver Creates a single mock order for the given variant with a quantity of 1.
Purpose: To provide the storefront with a final promotion-adjusted price and its validity period, so the discounted price can be shown to users. |
Beta Was this translation helpful? Give feedback.
-
|
@dlhck @michaelbromley Looking for your feedback |
Beta Was this translation helpful? Give feedback.
-
|
🔍 Clarification: What Are Catalog Promotions? Currently, Vendure supports cart-level promotions, but does not have built-in support for adjusting the actual catalog price as part of a promotional campaign. 📈 Why This Is Important Magento: Has dedicated “Catalog Price Rules” for product-level discounts. Sylius: Supports catalog promotions natively and independently of cart logic. Shopify: Allows merchants to schedule and display sale prices across the storefront. BigCommerce / Salesforce Commerce: Separate catalog and cart rules for flexibility. 💡 Most platforms treat catalog and cart promotions as complementary, with catalog discounts improving visibility and conversion during browsing, while cart promotions drive upselling at checkout. 💡 Suggested Design for Vendure Define promotions based on category, product, collection , customer groups, or facet conditions. Support scheduled activation (start/end dates) and channel-specific scope. Store effective promotional prices per variant (e.g., in a catalog_price table or cache). Product Price Resolution Override ProductVariant.priceWithTax logic to return discounted price if an active catalog promotion applies. Optionally expose originalPriceWithTax for strikethrough display. Frontend / API API should return both discounted and original prices. Support labels like “On Sale”, badges, or flags for frontend display. Admin Allow admins to bulk-apply catalog promotions (e.g., “20% off all summer collection”). Support fixed or percentage-based overrides. Channel and date filtering to allow campaign scheduling. 🔁 Interaction with Cart Promotions Catalog price is applied first and shown in the storefront. Cart promotion is applied afterward (e.g. “Spend $100, get 10% more off”). Optional: Rules can block stacking if needed (e.g. “cannot combine with other discounts this can be configuration wise”). This mirrors the behavior in Magento, Sylius, and other major platforms. ✅ Adding catalog-level promotion support would significantly improve Vendure's competitiveness for B2C use cases, especially where conversion visibility and sale campaigns are essential. |
Beta Was this translation helpful? Give feedback.
-
|
Thanks for the suggestion @mezzat11. The ability to easily see the promo price of a variant before it is added to the cart is indeed something that would be great to support. The main reason we don't yet support it, is that it's a rather tricky one to do in a performant way, due to the way our promotions engine works. Evaluating all potential promotions in the So I like the idea of a separate query resolver that has the sole task of resolving the best promo price for a given list of variants. There are still a number of technical & design challenges here. Because the current Promotion engine allows basically arbitrary code in the conditions & actions, so having them run in bulk eg on a product list page could become really bad for performance. As you say, maybe a solution is to have a separate type of promotion that is very constrained in the type of logic it is allowed to contain, so we can guarantee (or at least be more confident of) acceptable performance, especially at scale. |
Beta Was this translation helpful? Give feedback.
-
|
@dlhck can this planned with your amazing achievement last time |
Beta Was this translation helpful? Give feedback.
-
|
@mezzat11 this is such a big feature, I need to sit down with the team and scope this out first. Once we've that done I will update in here! |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Is your feature request related to a problem? Please describe.
Vendure currently supports cart-level promotions that are applied during checkout, but it lacks native support for catalog-level promotions — that is, applying promotional discounts directly to product prices before the cart stage.
This makes it difficult to run storefront-visible promotions (e.g., "20% off all T-shirts") where customers can see the discounted prices directly in product listings or on product detail pages. This limitation affects merchandising, sales campaigns, and the overall user experience.
Describe the solution you'd like
I'd like to see Vendure support catalog-level promotions similar to Sylius Catalog Promotions, with features such as:
Ability to define promotional rules that adjust product prices at the catalog level, not just in the cart.
Discounted prices reflected in API responses (e.g., productVariant.priceWithTax, price) so they can be shown in the storefront.
Conditions and scopes such as:
Product collections, tags, or categories
Customer groups (e.g., VIP, logged-in users)
Time-based promotions (e.g., flash sales, seasonal discounts)
Support for stacking or prioritizing multiple catalog promotions.
Optional visibility labels (e.g., "Discounted", "On Sale") for the storefront.
Describe alternatives you've considered
Using cart promotions only — but this leads to a poor UX where customers only see discounts after adding items to the cart.
Custom logic on the storefront to simulate discounts — but this risks desynchronization between catalog and actual pricing logic.
Manual price overrides — but these are not scalable for short-term or dynamic campaigns.
Additional context
Sylius handles this very well with its Catalog Promotions module. Bringing similar functionality to Vendure would greatly enhance marketing capabilities, align promotions across the site, and reduce the need for front-end workarounds.
Thanks again for your amazing work on Vendure.
Best regards,
Beta Was this translation helpful? Give feedback.
All reactions