Migrate from Commerce Connect to Configured Commerce
Why migrate from Commerce Connect
Section titled “Why migrate from Commerce Connect”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.
What you will do
Section titled “What you will do”- Assess migration readiness
- Map data from your external platform to Configured Commerce
- Migrate the product catalog
- Migrate pricing and inventory
- Migrate customer data and order history
- Switch transaction routing
- Validate and cut over
Assess migration readiness
Section titled “Assess migration readiness”Before starting, evaluate these factors.
| Factor | Question | Impact |
|---|---|---|
| Data volume | How many products, variants, and categories? | Determines migration batch size and timing |
| Custom logic | What custom pricing, checkout, or fulfillment logic exists? | Must be rebuilt in Configured Commerce |
| Integrations | What external systems connect to your commerce platform? | Must be re-pointed to Configured Commerce APIs |
| Order history | Do you need historical orders in the new system? | Adds migration complexity |
| Downtime tolerance | Can you do a maintenance window cutover? | Determines migration strategy (big bang vs phased) |
Map data structures
Section titled “Map data structures”Create a mapping between your external platform’s data model and Configured Commerce.
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"
};
} Migrate the product catalog
Section titled “Migrate the product catalog”Export products from your external platform and import them into Configured Commerce. Use a batch import approach for large catalogs.
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;
}
} Migrate pricing and inventory
Section titled “Migrate pricing and inventory”Transfer pricing rules and inventory levels. Pay attention to customer-specific pricing that may have been managed in your external platform.
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);
}
} Migrate customer data
Section titled “Migrate customer data”Transfer customer accounts, organizations, and addresses from your external platform.
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);
}
} Switch transaction routing
Section titled “Switch transaction routing”Once data migration is complete, redirect transactional operations from the external platform to Configured Commerce.
- Deploy the Configured Commerce storefront alongside the Commerce Connect storefront
- Run both systems in parallel with Commerce Connect still active for a validation period
- Route a percentage of traffic to the new storefront using feature flags or load balancer rules
- Monitor both systems for order accuracy, pricing correctness, and checkout completion rates
- Increase traffic to the new storefront as confidence grows
- Cut over fully when validation is complete
Validate and cut over
Section titled “Validate and cut over”Before final cutover, verify these areas.
| Validation area | What to check |
|---|---|
| Product data | All products, variants, and categories migrated with correct data |
| Pricing | Base prices, customer group prices, and volume tiers match |
| Inventory | Stock levels accurate across all warehouses |
| Customer accounts | Customers can log in and see their account data |
| Checkout flow | End-to-end checkout works with all payment methods |
| Order history | Historical orders visible in customer accounts (if migrated) |
| Integrations | ERP, shipping, and payment integrations connected |
| Performance | Page load times and API response times meet requirements |
Post-migration cleanup
Section titled “Post-migration cleanup”After successful cutover:
- Remove the Commerce Connect packages from your project
- Decommission the external commerce platform (or retain read-only for historical reference)
- Update DNS and CDN configurations to point solely at the Configured Commerce storefront
- Remove connector-specific configuration from your application settings
- Update monitoring and alerting to target the new architecture