A critical vulnerability was discovered in React Server Components (Next.js). Our systems remain protected but we advise to update packages to newest version. Learn More

Erik Norberg
Jun 1, 2017
  2831
(2 votes)

Marketing: The sorrows of exclusion

Today I would like to share with You how exclusion in the new Episerver promotion engine works and what marketers needs to be aware of.

Let's start by setting up the premise.

We are selling clothes in an online store and a customer have added two different pants to their cart.

No discounts:

Article Category Brand Price Discounted Price
Purple party pants Pants Chic clothes cooperation 500 500
Soft sienna slacks Pants Amazing apparel association 1000 1000
Sum: 1500

 

Now our marketing departments adds a discount for 30% off on everything in the pants category, which of course affects both items in the cart.

30% off pants:

Article Category Brand Price Discounted Price
Purple party pants Pants Chic clothes cooperation 500 350
Soft sienna slacks Pants Amazing apparel association 1000 700
Sum: 1050

 

So far so good but then marketing wants to clear the warehouse of the "Chic clothes cooperation" and adds a discount of 50% to that brand.

30% off pants and 50% off brand:

Article Category Brand Price Discounted Price
Purple party pants Pants Chic clothes cooperation 500 175
Soft sienna slacks Pants Amazing apparel association 1000 700
Sum: 875

Now this is not what we wanted, the Purple party pants shouldn't get both discounts we just want it to have 50% since that is the highest discount.

(It gets a 65% discount since the result is: price*(1-0.3)*(1-0.5) = price*0.35)

 

Ok we see that discounts stacks and to counter that we add an exclusion on the two discounts in Episerver Marketing, we also make sure to set the priority of the "Chic clothes cooperation" discount higher than the other one so that the customer gets the best of the two discounts.

30% off pants and 50% off brand with exclusion:

Article Category Brand Price Discounted Price
Purple party pants Pants Chic clothes cooperation 500 250
Soft sienna slacks Pants Amazing apparel association 1000 1000
Sum: 1250

Great now we get the 50% discount on the Purple party pants, but wait! Compared to when we only had the discount for all pants the price on the cart has actually gone up with 200? The Soft sienna slacks now cost full price and doesn't get the 30% discount anymore, why is that?

The answer is that even thou our two discounts are both item level discounts the exclusion always operates on the order level.

 

Conclusion:

Exclusion only operates on the whole order/cart, it can't be used to avoid stacking discounts on a single item.

As a marketer, You have the following options:

  1. Accept the stacking and pay the price, the easy way :)
  2. Avoid creating overlapping promotions, easier said than done
  3. Create special promotions for the non-overlap, in our example this would mean a discount for pants of all other brands that isn't excluded, very hard to maintain
  4. Use the exclusion and try to handle the frustrated customers that are affected, bad for user experience

 

At times like these I am glad I am not a marketer. ;)

 

Disclaimer: all article and brand names are pure fictional and any similarity with existing articles and brands are fully accidental and unintentional.

Jun 01, 2017

Comments

Erik Norberg
Erik Norberg Dec 11, 2017 03:10 PM

Episerver have listened to our concerns and excluding different promotions can now be achieved on unit level and not just order level.

This new feature was introduced in Commerce version 11.3 and requires a small code change to use, details are here:

https://world.episerver.com/documentation/developer-guides/commerce/marketing/promotion-exclusions/

(We have tested and confirmed it works for our use cases and are live with it.)

Please login to comment.
Latest blogs
Scheduled job for deleting content types and all related content

In my previous blog post which was about getting an overview of your sites content https://world.optimizely.com/blogs/Per-Nergard/Dates/2026/1/sche...

Per Nergård (MVP) | Jan 30, 2026

Working With Applications in Optimizely CMS 13

💡 Note:  The following content has been written based on Optimizely CMS 13 Preview 2 and may not accurately reflect the final release version. As...

Mark Stott | Jan 30, 2026

Experimentation at Speed Using Optimizely Opal and Web Experimentation

If you are working in experimentation, you will know that speed matters. The quicker you can go from idea to implementation, the faster you can...

Minesh Shah (Netcel) | Jan 30, 2026

How to run Optimizely CMS on VS Code Dev Containers

VS Code Dev Containers is an extension that allows you to use a Docker container as a full-featured development environment. Instead of installing...

Daniel Halse | Jan 30, 2026

A day in the life of an Optimizely OMVP: Introducing Optimizely Graph Learning Centre Beta: Master GraphQL for Content Delivery

GraphQL is transforming how developers query and deliver content from Optimizely CMS. But let's be honest—there's a learning curve. Between...

Graham Carr | Jan 30, 2026

Optimizely Graph Best Practices - Security, Access Control and Performance Optimisation

Introduction Building on Part 1's content modeling and querying practices , this Part 2 focuses on the security and performance considerations...

Jon Williams | Jan 29, 2026