---
title: Promotion engine
slug: commerce-connect-14/docs/promotions-engine
docTags: 
createdAt: 2026-07-23T10:25:33.361Z
---

## Promotion engine flow

![](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/ikpAeORrbhBRsy1-Mitb1-20260723-164627.png)

Promotion engine flow Commerce Connect 10-12

![](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/tiOCBAAyfqBRTRi4Hy3VI-20260723-094559.png)

## Calculate promotions

The components mentioned here are available in the `EPiServer.Commerce.Marketing` namespace. `PromotionEngine` evaluates the condition of all active promotions and rewards specific orders when the conditions are fulfilled.

Here is an example of using the promotion engine to calculate promotions using the order API.

```csharp
var cart = ServiceLocator.Current.GetInstance<IOrderRepository>().LoadOrCreateCart<Cart>(PrincipalInfo.CurrentPrincipal.GetContactId(), Cart.DefaultName);
    IEnumerable<RewardDescription> rewardDescriptions = ServiceLocator.Current.GetInstance<IPromotionEngine>().Run(cart);
```

## Get promotion prices

```csharp
var promotionEngine = ServiceLocator.Current.GetInstance<IPromotionEngine>();
    var currentMarket = ServiceLocator.Current.GetInstance<ICurrentMarket>();
    IEnumerable<DiscountedEntry> discountedEntries = promotionEngine.GetDiscountPrices(entryLink, currentMarket);
```

You can also get promotion prices for a collection of entries.

```csharp
var promotionEngine = ServiceLocator.Current.GetInstance<IPromotionEngine>();
    var currentMarket = ServiceLocator.Current.GetInstance<ICurrentMarket>();
    var market = currentMarket.GetCurrentMarket();
    IEnumerable<DiscountedEntry> discountedEntries = promotionEngine.GetDiscountPrices(entryLinks, market, market.DefaultCurrency);
```

## Evaluate entries

Evaluate a single entry.

```csharp
IEnumerable<RewardDescription> rewardDescriptions = ServiceLocator.Current.GetInstance<IPromotionEngine>().Evaluate(entryLink);
```

Evaluate a collection of entries.

```csharp
IEnumerable<RewardDescription> rewardDescriptions = ServiceLocator.Current.GetInstance<IPromotionEngine>().Evaluate(entryLinks);
```

## Get promotions and items for campaign

```csharp
IEnumerable<PromotionsItems> promotionItemsList = ServiceLocator.Current.GetInstance<IPromotionEngine>().GetPromotionItemsForCampaign(campaignLink);
```

## Calculate promotions using workflows

You can run the promotion system with the workflow system (legacy) to calculate and remove promotions. Updated workflow activities use the `EPiServer.Commerce.Marketing.IPromotionEngine` to make calculations and manipulate the cart.

The promotion system is used by default in the workflows. Use one of these methods to disable it.

- Update `Configs\ecf.app.config`.

```xml
<Application defaultApplicationName="ECApplication">
          <Features>
            <add feature="WorkflowsVNext" 
                 state="Disabled" 
                 type="Mediachase.Commerce.Core.Features.WorkflowsVNext, Mediachase.Commerce" />
          </Features>
        </Application>
```

- Use the Servicelocator.

```csharp
var featureSwitch = ServiceLocator.Current.GetInstance<IFeatureSwitch>();
        featureSwitch.Features.Add(new WorkflowsVNext());
        featureSwitch.DisableFeature(WorkflowsVNext.FeatureWorkflowsVNext);
```

**Related blog post:** [Old promotion system is (already) dead, long live the new promotion system](https://world.optimizely.com/blogs/Quan-Mai/Dates/2018/3/old-promotion-system-is-dead-long-live-the-new-promotion-system-/)
