HomeDev GuideAPI Reference
Dev GuideAPI ReferenceUser GuideGitHubNuGetDev CommunityDoc feedbackLog In
GitHubNuGetDev CommunityDoc feedback


Describes the promotion functionality, which is part of campaign management in Optimizely Customized Commerce.

Components mentioned here are available in the EPiServer.Commerce.Marketing namespace.

A promotion is a marketing tool used to increase sales of certain products or product lines. There are three promotion types.

  • EntryPromotion. Applies reward to a specific entry.
  • OrderPromotion. Applies reward to entire order.
  • ShippingPromotion. Applies reward to order's shipping cost.

Included promotion types

Item promotions

  • Cheapest items for free. Buy at least X items, get the cheapest Y for free.
  • Most expensive items for free. Buy at least X items, get most expensive Y for free.
  • Buy products for fixed price. Buy X items from catalog entries for a fixed price.
  • Buy products for discount from other selection. Buy at least X items, get discount on selected items.
  • Buy products for discount on all selections. Buy at least X items, get discount on all.
  • Buy products for discount in same category. Get discount an all items in selected category.
  • Spend for discounted selection. Spend amount to receive a discount on selected items.
  • Spend for free items. Spend amount to receive gift items.

Order promotions

  • Spend for discount on order. Spend amount to receive discount on total order value.
  • Buy products and get discount on order. Buy at least X items, get discount on total order value.

Shipping promotions

  • Spend for discount on shipping cost. Spend amount to get discount on shipping cost.
  • Buy products for discount on shipping cost. Buy at least X items to get discount on shipping cost.
  • Buy products for free shipping. Buy at least X items and get free shipping.
  • Spend for free shipping. Spend amount to get free shipping.

If an order has several shipments, the shipping discount only applies to the shipment with the highest shipping cost.

For example: Shipment 1 has a shipping cost of $39.76. Shipment 2 in the same order form has a shipping cost of $28.00. If you apply a 10% discount, the discount amount is $3.98.

Extend promotions example

Sometimes it is useful to add properties to promotions for marketing purposes but use the base processor for evaluation.

using EPiServer.Commerce.Marketing;
    using EPiServer.Commerce.Marketing.Promotions;
    using EPiServer.Core;
    using EPiServer.DataAbstraction;
    using EPiServer.DataAnnotations;
    using System.ComponentModel.DataAnnotations;
    namespace EPiServer.Commerce.Sample.Models.Discounts
        [ContentType(GUID = "530a7f07-8d12-4625-bda3-8e135a10b74d")]
        [AvailableContentTypes(Include = new[] { typeof (PromotionData) })] 
        public class MyCompanyBuyQuantityGetItemDiscount: BuyQuantityGetItemDiscount
            [Display(Order = 13, GroupName = SystemTabNames.PageHeader, Prompt = "Other Info")]
            public virtual string OtherInfo { get; set; }

Use render templates

Promotion content uses normal rendering templates as described here. By default, only partial views are available for promotion content.

using System.Web.Mvc;
    using EPiServer.Framework.DataAnnotations;
    using EPiServer.Web.Mvc;
    namespace MyOptimizelySite.Controllers
        [TemplateDescriptor(Default = true)]
        public class MyCompanyBuyQuantityGetItemDiscountPartialController : PartialContentController<MyCompanyBuyQuantityGetItemDiscount>
            public ActionResult Index(MyCompanyBuyQuantityGetItemDiscount currentDiscount)
                // Implementation of action view the page. 
                return View(currentDiscount);

Example: The corresponding rendering view for displaying the promotion partial view.

@using EPiServer.Core
    @using EPiServer.Web.Mvc.Html
    @model EPiServer.Commerce.Sample.Models.Discounts.MyCompanyBuyQuantityGetItemDiscount 
        @Html.DisplayFor(m => m.Name)
        @Html.PropertyFor(m => m.Description)
        @Html.PropertyFor(m => m.OtherInfo)

Related blog post: Old promotion system is (already) dead, long live the new promotion system