Magento migrations often look successful before they are operationally coherent. Products, Customers, Orders, and Categories can appear in Admin while configurable children, attribute scope, website assignments, stock relationships, URL rewrites, extension records, or indexes remain incomplete.
The recurring pattern is a transfer that preserves visible fields but loses the structures Magento uses to assemble catalog, storefront, and historical behavior. Each pitfall below identifies the failure pattern, the signs that expose it, and the condition that proves the relationship has been restored.
Pitfall 1: Converting Every Product Into a Simple Product
What goes wrong
Magento supports simple, configurable, grouped, virtual, bundle, and downloadable Products. These types use different parent-child, price, stock, file, and cart relationships. Flattening them into simple Products duplicates merchandising content, removes selectable combinations, and changes how Orders identify purchased items.
Early warning signs
| Early warning sign | What it indicates |
|---|---|
| Parent and child SKUs are not separately listed. | Configurable and composite Product identity is incomplete. |
| Bundle components or grouped Products appear only in descriptions. | Sellable relationships have been reduced to content. |
| Download files and access limits are outside the Product export. | The downloadable Product cannot function from the Product record alone. |
| Configurable options are mixed with ordinary custom options. | Inventory-bearing variants and customer-entered choices are being confused. |
Prevention
Classify source Products by commercial behavior before mapping fields. Preserve configurable child links, grouped associations, bundle options, virtual meaning, downloadable files, and the exact SKU that carries inventory and appears on Order lines.
Recommendation example
Use one configurable Product, one grouped Product, one dynamic bundle, and one downloadable Product as reference structures. Record which entity owns price, stock, weight, media, and fulfillment.
Pass condition
Each reference Product retains its correct type, parent-child or component links, selectable values, SKU identity, price source, inventory behavior, files, and historical Order-line meaning.
Pitfall 2: Recreating Attributes Without Their Attribute Sets and Scope
What goes wrong
Magento attributes gain meaning through input type, option vocabulary, attribute set, group placement, storefront flags, search and filter settings, required status, and scope. Copying only attribute codes and values can produce duplicate options, empty filters, incorrect admin forms, or values that overwrite one another across websites and store views.
Early warning signs
| Early warning sign | What it indicates |
|---|---|
| Similar fields use inconsistent codes or option labels. | Attribute identity will fragment across Products. |
| Attribute-set membership is missing from the source inventory. | Fields cannot be assigned to the correct Product families. |
| Global, website, and store-view values are mixed in one column. | Scope-specific meaning will be overwritten. |
| The source uses extension-created attributes with unknown behavior. | A field may depend on code, indexing, or storefront logic outside the value itself. |
Prevention
Preserve the attribute definition before importing values. Map input type, option IDs or labels, attribute set, attribute group, scope, search/filter use, comparison use, visibility, and required status. Merge synonyms only when they represent the same governed vocabulary.
Recommendation example
Use color as a variation attribute, material as a filterable specification, and care instructions as store-view content. Represent each through the correct set, group, scope, and storefront behavior.
Pass condition
The reference attributes appear in the intended attribute sets and groups, retain normalized options and scope, and support the correct variation, filter, search, comparison, and admin-editing behavior.
Pitfall 3: Confusing Custom Options With Configurable Variations
What goes wrong
Custom options can collect a choice or buyer input without creating a separate Product. Configurable Products rely on associated simple Products with independent SKUs and inventory. Mapping stock-bearing source variants into custom options removes child identity; converting personalization into configurable children creates false inventory units.
Early warning signs
- A choice has separate stock or SKU but is proposed as a text or dropdown option.
- Engraving or file upload is proposed as a configurable attribute.
- Source variants have distinct images or prices that are attached only to the parent.
- Order lines cannot identify the purchased child SKU.
Prevention
Classify each choice by whether it creates an independently managed sellable unit. Use configurable children for SKU- and stock-bearing variations; retain custom options for noninventory choices and buyer input. Preserve the selected value on historical Order lines.
Recommendation example
Represent shirt size and color as configurable attributes, gift wrapping as a priced custom option, and engraving as buyer-entered text.
Pass condition
Real variations retain child SKU, price, stock, media, and Order-line identity, while personalization and optional services remain attached to the parent Product and purchased line without generating false variants.
Pitfall 4: Flattening the Magento Store Hierarchy into One Context
What goes wrong
Magento uses websites, stores, and store views to control catalog assignment, root Categories, localized values, URLs, currencies, and configuration. A global transfer can overwrite translations, publish Products in the wrong website, or assign the wrong root Category.
Early warning signs
| Early warning sign | What it indicates |
|---|---|
| The source has several domains, languages, brands, or regions. | A single default scope cannot represent the Store architecture. |
| Product descriptions and URL keys differ by storefront. | Store-view content and SEO meaning need separate ownership. |
| Stores use different root Categories or Product selections. | Navigation and assortment are scope-dependent. |
| Website-specific prices or Customer groups exist. | Commercial rules are tied to website context. |
Prevention
Create a scope map for every website, store, and store view. Separate global Product identity from website assignments and store-view text. Preserve source scope codes used by imports, APIs, or integration mappings.
Recommendation example
Use one Product that is sold on two websites with different store-view descriptions, URL keys, and Category placement. Record each scoped value explicitly.
Pass condition
The representative Product appears only in the intended websites and stores, uses the correct root Categories and localized values, and does not inherit content or routes from the wrong store view.
Pitfall 5: Assuming Category Rows Recreate Navigation and URL History
What goes wrong
Category records alone do not recreate the storefront path. Root Category assignment, parent-child hierarchy, Product membership, visibility, menu inclusion, URL keys, metadata, CMS content, and URL rewrites determine whether a Category supports discovery and continuity.
Early warning signs
- Categories exist in Admin but not in the menu.
- Products are assigned to unexpected branches.
- Source Categories have several historical URLs.
- Landing-page content or internal links are stored separately.
Prevention
Preserve Category hierarchy and Product membership separately from menu and route behavior. Map root Categories by store, identify hidden or landing-page Categories, retain metadata and descriptions, and create explicit rewrite relationships for business-critical paths.
Recommendation example
Use one top-level menu Category, one hidden landing Category, and one Category that moved in the hierarchy. Preserve Product membership, destination route, and source redirects for each.
Pass condition
The reference Categories appear in the intended store hierarchy, contain the correct Products and content, and resolve all important source paths to the correct destination without duplicate or unintended routes.
Pitfall 6: Copying Stock Without Source, Stock, and Salable Context
What goes wrong
Magento inventory can use physical sources, stocks, website sales-channel assignments, source quantities, and salable availability. A positive quantity can still produce an unavailable Product when source assignment, stock assignment, status, reservations, or child-product availability is wrong.
Early warning signs
- Several warehouses are summed into one quantity.
- Imported Products remain assigned only to Default Source.
- Configurable parents and children show conflicting availability.
- An ERP or warehouse system remains authoritative but its item keys are missing.
Prevention
Preserve source codes, quantities, status, stock assignments, website relationships, and external warehouse identifiers. Define whether Magento or another system owns inventory after migration. Keep on-hand quantity separate from the value available to a sales channel.
Recommendation example
Use one SKU stocked at two warehouses and one configurable Product with mixed child availability. Map each source to the stock serving the correct website.
Pass condition
The representative Products retain accurate source quantities, stock and website assignments, child availability, and external inventory keys, producing the intended salable state without collapsing locations.
Pitfall 7: Importing Customers and Orders Without Their Operational Snapshots
What goes wrong
Customer and Order records can exist while addresses, Customer groups, Product selections, discounts, taxes, shipping, payment references, invoices, shipments, refunds, and status history lose their original meaning. Updating a Customer record can also overwrite data that should remain frozen on an old Order.
Early warning signs
- Order addresses are derived from the current Customer address book.
- Configurable, bundle, or grouped lines lose child details.
- Refunds or shipments are exported independently without Order links.
- Customer-group names exist without their historical pricing context.
Prevention
Keep Customer master data separate from Order-time snapshots. Preserve line-item SKU and selected options, addresses, totals, discounts, taxes, method labels, status history, invoices, shipments, refunds, comments, and external transaction IDs.
Recommendation example
Use one guest Order, one registered-Customer Order, one partially shipped Order, and one refunded Order containing a configurable Product.
Pass condition
Each representative Order remains understandable without relying on current Product, Customer, price, payment, or shipping configuration, and every related shipment, invoice, refund, and external identifier remains linked.
Pitfall 8: Treating CMS Content, Media, and SEO Fields as One Generic Page Export
What goes wrong
Magento content can include CMS Pages, CMS blocks, widgets, Product and Category descriptions, media files, metadata, internal links, and store-view-specific routes. A generic page import can preserve text while losing block references, widget directives, media paths, scope, or URL rewrites.
Early warning signs
- CMS content contains directives, widgets, or source media URLs.
- Blocks are reused across several Pages or store views.
- Product and Category descriptions contain hard-coded internal links.
- Meta fields and URL keys differ by scope.
Prevention
Classify CMS Pages, blocks, widgets, catalog content, media, metadata, and rewrite history separately. Translate references to destination entity and media IDs, preserve store-view scope, and avoid carrying obsolete theme markup as business content.
Recommendation example
Use one CMS Page containing a reusable block and media image, plus one Category landing page with localized metadata and an old URL.
Pass condition
The representative content renders through the correct Page, block, widget, media, and store-view relationships, while internal links and important legacy routes reach the intended destination.
Pitfall 9: Copying Extension Tables Without Rebuilding Their Business Ownership
What goes wrong
Magento Stores commonly contain extensions and custom modules for ERP, PIM, loyalty, subscriptions, marketplaces, tax, shipping, search, checkout, and reporting. Their tables and attributes can depend on code, events, cron jobs, APIs, or external taxonomies. Moving rows alone creates orphan values.
Early warning signs
- Important fields use module prefixes or custom entity IDs.
- Staff cannot identify the system that updates a field.
- External systems use keys that are absent from standard Magento entities.
- Source workflows depend on scheduled jobs or observers.
Prevention
Create an ownership register for every custom entity and field. Name the parent Product, Customer, Order, or content record; the module or external owner; the durable key; the update direction; and the destination workflow. Exclude abandoned technical residue.
Recommendation example
Trace one PIM Product ID, one loyalty account, and one marketplace Order reference from source table to destination owner and continuing integration.
Pass condition
Every retained custom record has a known owner, valid parent relationship, stable identifier, and continuing workflow; no critical business process depends on copied data that the destination cannot interpret.
Pitfall 10: Assuming Imported Data Is Storefront-Ready Before Indexes and Caches Reflect It
What goes wrong
Magento uses indexes to prepare catalog, price, Category, Customer-group, and search data for efficient storefront use. Caches serve processed configuration, layout, blocks, and pages. Large imports or direct database changes can leave indexes invalid or scheduled updates incomplete, so Admin values differ from search, filters, prices, or Category listings.
Early warning signs
| Early warning sign | What it indicates |
|---|---|
| Products exist in Admin but are missing from search or Categories. | Data is present, but index-backed storefront visibility is stale or incomplete. |
| Price or Customer-group changes appear inconsistently. | Price-related indexes do not yet reflect the imported state. |
| Indexers show reindex required, suspended, or delayed states. | Storefront results cannot be treated as current. |
| Cache notifications remain after catalog or extension changes. | Customers may still receive an older rendered state. |
Prevention
Include index and cache ownership in the migration runbook. Ensure cron and scheduled indexers are available, record which imports trigger partial or full reindexing, and separate reindexing from cache refresh. Custom import processes should use supported entity operations or explicitly account for indexing effects.
Recommendation example
After a representative bulk catalog import, trace one Product through Admin, Category listing, search, filter results, and Customer-group pricing while observing the related index states.
Pass condition
All required indexers reach a current state, the intended caches contain current output, and representative Products, Categories, prices, and searchable attributes appear consistently across Admin and storefront.
Cross-Pitfall Prevention Priorities
Magento pitfall prevention depends on preserving four connected structures: Product relationships, scoped catalog data, historical commercial snapshots, and extension ownership. Indexing and cache behavior then determine whether those correct records become visible through the storefront.
| Prevention layer | Required control |
|---|---|
| Product structure | Preserve parent-child, grouped, bundle, downloadable, and custom-option distinctions. |
| Attribute governance | Keep attribute code, option, set membership, scope, and storefront use connected. |
| Store scope | Maintain website, store, and store-view differences for content, prices, Categories, and URLs. |
| Historical snapshots | Preserve the Order-time Customer, Product, address, state, shipment, and refund context. |
| Storefront visibility | Treat indexes and caches as the delivery layer for otherwise correct records. |
Conclusion
Magento migration failures are rarely explained by missing Product or Customer counts alone. The more common problem is that Product types, attributes, scope, inventory, Categories, content, Orders, and extension records no longer work together.
The safest destination model preserves each relationship at the correct level and keeps historical evidence separate from current configuration. When the catalog, scope, inventory, Orders, routes, custom records, and indexes agree, the migrated Store becomes operationally coherent rather than merely populated.
Common Questions
Why should Magento Product types be preserved instead of flattened?
Each Product type defines different parent-child, price, stock, file, and cart relationships. Flattening changes what the buyer selects and what staff can manage or trace on Orders.
What is the practical difference between configurable attributes and custom options?
Configurable attributes select independent child Products with their own SKUs and inventory. Custom options modify or personalize the parent Product without creating independently managed stock units.
Why does attribute scope matter during migration?
Global, website, and store-view scope determine whether a value is shared or localized. Using the wrong scope can overwrite translations, prices, metadata, and other storefront-specific values.
Can imported quantity alone prove that a Magento Product is available?
No. Availability can depend on source assignment, stock assignment, status, website relationship, reservations, and child-product state in addition to quantity.
Should old extension data always be copied into custom attributes?
No. Extension records may depend on separate entities, workflows, code, external systems, or taxonomies. Only data with a defined destination owner and continuing use should be retained.
Why can Products appear in Admin but remain missing from the storefront?
Magento uses indexes and caches to prepare catalog, price, Category, and search output. Invalid or delayed indexes, incomplete cron processing, or stale caches can make correct database records appear absent or inconsistent.