HomeDev GuideAPI Reference
Dev GuideAPI ReferenceUser GuideGitHubNuGetDev CommunitySubmit a ticketLog In
GitHubNuGetDev CommunitySubmit a ticket


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