Postmortem of a failed e-commerce migration
A public account of a project that went wrong, what we did about it, and what we would do differently next time.
We rarely write public postmortems of work that went badly. We are writing this one because the client agreed and because the lessons are useful enough that not publishing them would feel wasteful.
The engagement was a migration of a mid-sized Danish furniture retailer from a templated Magento 1 storefront to a headless Shopify Plus stack. The brief was straightforward: move the catalogue, preserve the SEO, redesign the storefront, and ship in time for the autumn campaign. We had nine weeks. We took fourteen. The autumn campaign launched with a partial migration and a banner asking customers to be patient.
The single biggest cause was that we underestimated the complexity of the existing data model. The Magento store had been live for nine years and had accumulated thirty-one custom attributes, a parallel B2B catalogue with different pricing rules, and a set of bundled products whose configurations were defined in a spreadsheet maintained by a single member of staff. We mapped the catalogue twice and missed the bundled products both times.
The second cause was that we did not get the staff member who maintained the spreadsheet into the discovery sessions. She was busy and the operations director assured us we had everything we needed. We did not. We had everything that the operations director knew about, which is a different set.
The third cause was that we treated the SEO migration as a phase 3 problem rather than a phase 1 problem. The redirects map should have been written in the first week of design, not the last week of build. By the time we got to it, several URL patterns had already been built in a way that did not match the legacy patterns, and we had to ship a layer of edge redirects that we did not particularly like.
What we did differently from there: we paused the campaign launch by one week and shipped a stable partial migration; we extended the engagement by five weeks at our cost to complete the bundled products and the SEO work; and we wrote a longer post-launch report than we have ever written, to let the client see exactly what had happened and to let us learn from it without filtering.
The lesson we took away is that data-model discovery is a separate sprint from technical discovery, and it should always include the people who maintain the data, not the people who manage them. We now run that as a default first sprint on any commerce migration.