---
title: Workflows and activities
slug: commerce-connect-14/docs/workflows-and-activities
docTags: 
createdAt: 2026-07-23T10:25:34.040Z
---

In Optimizely Commerce Connect, activity flows were used to validate and calculate checkout totals. An *activity flow* is a container of steps or activities that can be executed. When executing an activity flow, a list of configured activities and if/else conditions are executed.

Activities can be replaced by the following validation services and processors:

- `OrderValidationService`
- `IPurchaseOrderProcessor`
- `IPaymentPlanProcessor`
- `IShipmentProcessor`
- `IPlacedPriceProcessor`
- `IInventoryProcessor`
- `IPaymentProcessor`
- Order total calculators

These components mentioned here are available in the `EPiServer.Commerce.Order` and `EPiServer.Commerce.Order.Calculator` namespaces.

### Activity flows

- **CartValidateActivityFlow**
  Use `OrderValidationService.ValidateOrder()` instead.
- **CartPrepareActivityFlow**
  Use `OrderValidationService.ValidateOrder()` and `OrderGroupExtensions.CalculateTotals()` instead.
- **CartCheckoutActivityFlow**
  Use `OrderValidationService.ValidateOrder()` and `OrderGroupExtensions.CalculateTotals()` instead.

**Example Commerce Connect 14 and higher:**

```csharp
CartBuilder ch = new CartBuilder();
    foreach (VariationContent entry in entries)
    {
       ch.AddEntry(entry, quantity, false);
    }
    ch.Cart.ProviderId = "FrontEnd";
    OrderValidationService.ValidateOrder(ch.Cart);
    ch.Cart.AcceptChanges();
```

**Example Commerce Connect 10-13:**

```csharp
CartBuilder ch = new CartBuilder();
    foreach (VariationContent entry in entries)
    {
       ch.AddEntry(entry, quantity, false);
    }
    ch.Cart.ProviderId = "FrontEnd";
    ch.RunWorkflow(OrderGroupWorkflowManager.CartValidateWorkflowName);
    ch.Cart.AcceptChanges();
```

### Activities

- **AdjustInventoryActivity**
  Use `IOrderGroupExtensions.AdjustInventoryOrRemoveLineItems()` instead.
- **CalculateDiscountsActivity**
  Use `IOrderGroupExtensions.ApplyDiscounts()` and `IOrderGroupExtensions.UpdateInventoryOrRemoveLineItems()` instead.
- **CalculateTotalsActivity**
  Use `IOrderGroupExtensions.CalculateTotals()` instead.
- **CheckInventoryActivity**
  Use `IOrderGroupExtensions.UpdateInventoryOrRemoveLineItems()` instead.
- **ProcessPaymentActivity**
  Use `IPaymentProcessor.ProcessPayment()` instead.
- **RemoveDiscountsActivity**
  Use `IOrderGroupExtensions.ApplyDiscounts()` instead.
- **ShipmentSplitActivity**
  Use `IOrderGroupExtensions.CalculateTotals()` instead.
- **ValidateLineItemsActivity**
  Use `IPlacedPriceProcessor.UpdatePlacedPrice()` instead.
