Skip to content

Migrate from Commerce Connect to Configured Commerce

⏱ 30 minutes advanced
📜Advancedcommerce

Commerce Connect serves well as a bridge, but operating two platforms has ongoing costs: connector maintenance, sync latency, debugging across system boundaries, and feature limitations. Migrating to Configured Commerce eliminates the integration layer and gives you:

  • Single admin experience for content and commerce
  • Zero sync latency since catalog data lives natively in Optimizely
  • Full Commerce feature access including native promotions, approval workflows, and B2B capabilities
  • Simplified architecture with fewer moving parts and failure points

This guide covers the planning, data migration, and cutover process.

  1. Assess migration readiness
  2. Map data from your external platform to Configured Commerce
  3. Migrate the product catalog
  4. Migrate pricing and inventory
  5. Migrate customer data and order history
  6. Switch transaction routing
  7. Validate and cut over

Before starting, evaluate these factors.

FactorQuestionImpact
Data volumeHow many products, variants, and categories?Determines migration batch size and timing
Custom logicWhat custom pricing, checkout, or fulfillment logic exists?Must be rebuilt in Configured Commerce
IntegrationsWhat external systems connect to your commerce platform?Must be re-pointed to Configured Commerce APIs
Order historyDo you need historical orders in the new system?Adds migration complexity
Downtime toleranceCan you do a maintenance window cutover?Determines migration strategy (big bang vs phased)

Create a mapping between your external platform’s data model and Configured Commerce.

Data mapping document
csharp
public class MigrationMapping
{
    // External platform -> Configured Commerce
    public static Dictionary<string, string>
        ProductFields = new()
    {
        ["title"] = "DisplayName",
        ["body_html"] = "Description",
        ["vendor"] = "Brand",
        ["product_type"] = "CategoryAssignment",
        ["handle"] = "UrlSegment",
        ["created_at"] = "Created",
        ["status"] = "IsActive"
    };

    public static Dictionary<string, string>
        VariantFields = new()
    {
        ["sku"] = "Code",
        ["price"] = "ListPrice",
        ["weight"] = "Weight",
        ["inventory_quantity"] = "StockQuantity",
        ["barcode"] = "Gtin"
    };
}

Export products from your external platform and import them into Configured Commerce. Use a batch import approach for large catalogs.

Catalog migration service
csharp
public class CatalogMigrationService
{
    private readonly IContentRepository _repo;
    private readonly IExternalCatalogExporter _exporter;

    public async Task<MigrationResult> MigrateCatalog()
    {
        var result = new MigrationResult();

        // Export from external platform
        var externalProducts = await _exporter
            .ExportAllProducts();

        // Create category structure first
        var categoryMap = await MigrateCategories(
            externalProducts
                .SelectMany(p => p.Categories)
                .Distinct());

        // Migrate products in batches
        var batches = externalProducts
            .Chunk(100);

        foreach (var batch in batches)
        {
            foreach (var product in batch)
            {
                try
                {
                    var categoryRef = categoryMap
                        [product.PrimaryCategory];
                    await MigrateProduct(
                        product, categoryRef);
                    result.Succeeded++;
                }
                catch (Exception ex)
                {
                    result.Failed++;
                    result.Errors.Add(
                        $"{product.ExternalId}: {ex.Message}");
                }
            }
        }

        return result;
    }
}

Transfer pricing rules and inventory levels. Pay attention to customer-specific pricing that may have been managed in your external platform.

Pricing migration
csharp
public async Task MigratePricing(
    IPriceDetailService priceService,
    IEnumerable<ExternalVariant> variants)
{
    foreach (var variant in variants)
    {
        var prices = new List<IPriceDetailValue>();

        // Base price
        prices.Add(new PriceDetailValue
        {
            CatalogKey = new CatalogKey(
                variant.MigratedCode),
            MarketId = new MarketId("US"),
            CustomerPricing =
                CustomerPricing.AllCustomers,
            MinQuantity = 0,
            UnitPrice = new Money(
                variant.Price, Currency.USD),
            ValidFrom = DateTime.UtcNow
        });

        // Migrate customer group prices
        foreach (var groupPrice in
            variant.CustomerGroupPrices)
        {
            prices.Add(new PriceDetailValue
            {
                CatalogKey = new CatalogKey(
                    variant.MigratedCode),
                MarketId = new MarketId("US"),
                CustomerPricing = new CustomerPricing(
                    CustomerPricing.PriceType.PriceGroup,
                    groupPrice.GroupName),
                MinQuantity = groupPrice.MinQuantity,
                UnitPrice = new Money(
                    groupPrice.Price, Currency.USD),
                ValidFrom = DateTime.UtcNow
            });
        }

        priceService.Save(prices);
    }
}

Transfer customer accounts, organizations, and addresses from your external platform.

Customer migration
csharp
public async Task MigrateCustomers(
    IExternalCustomerExporter exporter)
{
    var customers = await exporter.ExportAll();

    foreach (var customer in customers)
    {
        // Create customer in Configured Commerce
        var commerceCustomer = new CommerceCustomer
        {
            Email = customer.Email,
            FirstName = customer.FirstName,
            LastName = customer.LastName,
            Company = customer.Company,
            CustomerGroup = MapCustomerGroup(
                customer.Tags),
            ExternalId = customer.ExternalId
        };

        // Migrate addresses
        foreach (var addr in customer.Addresses)
        {
            commerceCustomer.Addresses.Add(
                new CustomerAddress
                {
                    Line1 = addr.Address1,
                    City = addr.City,
                    State = addr.Province,
                    PostalCode = addr.Zip,
                    Country = addr.CountryCode,
                    IsDefault = addr.IsDefault
                });
        }

        await _customerService
            .Create(commerceCustomer);
    }
}

Once data migration is complete, redirect transactional operations from the external platform to Configured Commerce.

  1. Deploy the Configured Commerce storefront alongside the Commerce Connect storefront
  2. Run both systems in parallel with Commerce Connect still active for a validation period
  3. Route a percentage of traffic to the new storefront using feature flags or load balancer rules
  4. Monitor both systems for order accuracy, pricing correctness, and checkout completion rates
  5. Increase traffic to the new storefront as confidence grows
  6. Cut over fully when validation is complete

Before final cutover, verify these areas.

Validation areaWhat to check
Product dataAll products, variants, and categories migrated with correct data
PricingBase prices, customer group prices, and volume tiers match
InventoryStock levels accurate across all warehouses
Customer accountsCustomers can log in and see their account data
Checkout flowEnd-to-end checkout works with all payment methods
Order historyHistorical orders visible in customer accounts (if migrated)
IntegrationsERP, shipping, and payment integrations connected
PerformancePage load times and API response times meet requirements

After successful cutover:

  1. Remove the Commerce Connect packages from your project
  2. Decommission the external commerce platform (or retain read-only for historical reference)
  3. Update DNS and CDN configurations to point solely at the Configured Commerce storefront
  4. Remove connector-specific configuration from your application settings
  5. Update monitoring and alerting to target the new architecture