Loading tutorials…
Loading tutorials…
The Magento catalog is the most powerful — and most easily mismanaged — part of the platform. Most stores ship with attributes used once, sets that nobody understands, and categories indexed into oblivion. Here's the catalog architecture that scales past 10,000 SKUs without grinding to a halt.
Who this is forOperators about to import their first 100-10,000 products, or operators who inherited a catalog and suspect it was built ad-hoc. If your search returns weird results, your filters miss obvious products, or reindexing takes 6+ hours, the catalog architecture is the root cause.
What you'll need
Step 1
Every attribute is a column in the EAV table. Plan the full set in a spreadsheet, then create them all at once. Adding attributes ad-hoc creates orphans.
Open a spreadsheet. Column A: attribute label (e.g., "Material"). Column B: attribute code (snake_case, lowercase — e.g., `material`). Column C: input type (text, dropdown, multiselect, price, date, etc.). Column D: scope (Global, Website, Store View). Column E: is filterable in layered nav? Column F: is used in search?
Default rule: most attributes should be scope=Global. Only translatable attributes (description, name in multi-language stores) or per-store-price attributes should be Website/Store View scope.
Filterable attributes: keep under 10 per category. Each one becomes a "Shop by" filter on the storefront and an index entry. 20 filterable attributes = reindex hell.
For dropdowns/multiselects (color, size, material, brand), define ALL possible option values upfront. Adding options mid-import causes duplicate-value chaos.
Distinguish between display-only attributes (e.g., 'Care Instructions' — shown on product page, not searchable) and structural attributes (color, size — used for variants and filters). The first should be `Used for Sorting in Product Listing` = No.
Step 2
An attribute set is the schema for a product type. Apparel needs size + color + material. Electronics needs voltage + warranty + spec. Don't put everything in one set.
Stores → Attributes → Attribute Set → Add New Set. Use the 'Default' set as a base, then customize.
Name sets after product type, not category: "Apparel," "Electronics," "Books," "Furniture." A product can only belong to ONE attribute set — picking the wrong set means rebuilding the product.
Drag attributes from "Unassigned Attributes" into the relevant Groups (General, Prices, Meta Information, Images, Design). Group order matters — it determines the order on the product-edit page.
For variant-based products (apparel, anything with size/color), make sure `size`, `color`, and any other variant-defining attributes are present in the set and configured as "Visible on Storefront" = No (handled by the configurable product layer instead).
Save. Test by creating one product with the new set: do all expected fields appear? Anything missing? Edit the set, don't create a new attribute mid-product.
Step 3
A configurable product is a parent that exposes variants (simple products) to the storefront. The most-misconfigured Magento construct — get it right or every category page double-counts inventory.
Each variant (e.g., 'Red T-shirt size M') must be a Simple Product first. Create the variants via Catalog → Products → Add Simple Product, set unique SKUs, weights, and stock. Don't enable them for the storefront yet (Visibility = Not Visible Individually).
Create the configurable parent: Add Product → Configurable. Pick the same attribute set. In the Configurations tab, select the attributes that define variants (e.g., size + color).
Magento generates the matrix (Red×S, Red×M, Red×L...). Either link existing simples (the recommended path) or have Magento auto-create them — auto-creation is usually messy and creates duplicate SKUs.
On the configurable parent: set Visibility = Catalog, Search. On every variant simple: set Visibility = Not Visible Individually. This is the difference between one product showing on category pages vs all 24 variants polluting search.
Inventory: configurable products use the SUM of variant stocks. Setting stock on the parent does nothing. Set it on each simple.
Pricing: configurable parents inherit from the cheapest variant by default. To force a single 'starting from' price, configure custom price logic via a sales rule or set per-variant prices that align.
Step 4
Categories drive navigation AND URL structure. Plan 2-3 levels deep, not 5. Use anchor categories for product flow.
Catalog → Categories. The Root Category is the top of your store hierarchy — never assign products directly to root. Build categories below it.
Recommended depth: 2-3 levels. Example: Root → Apparel → Mens → T-Shirts. Anything 4+ levels deep hurts crawl depth and customer findability.
Enable 'Is Anchor' = Yes on every category that should aggregate sub-category products into its listing. Without this, a category page shows only directly-assigned products — the typical store has Tops → T-Shirts where Tops is empty because nobody set the anchor flag.
URL keys: category URL key + parent URL keys form the URL. /mens/t-shirts/ is good. /category-9824/ (default if nobody sets a key) is terrible for SEO. Set every category URL key explicitly.
Meta data (title, description, H1 override) per category — Magento defaults to "{Category Name} - Buy Online" which is generic. Custom meta titles + descriptions per category lift category-page CTR 20-40% in our experience.
Set "Display Mode" per category: "Products only" (most common), "Static block only" (for landing categories), or "Static block + products" (best for SEO — adds a content paragraph above the product grid).
Step 5
Magento has a built-in CSV importer that handles 10K+ rows. Use it. Manual product creation is fine for the first 20, agony past that.
System → Data Transfer → Import. Entity Type = Products. Image File Directory = pub/media/import/ (create this directory and upload images there first).
Download the sample CSV: System → Data Transfer → Export to get the exact column order. Magento is strict about column names — 'sku' not 'SKU,' 'product_type' not 'type.'
Required columns: sku, product_type (simple/configurable/grouped/virtual/bundle), attribute_set_code, name, price, qty, weight, visibility (Catalog Search / Not Visible Individually), status (1=enabled), and category_ids or categories.
For configurable products, the import handles them via two passes: first import the simples, then import the configurable parents with a `configurable_variations` column listing variant SKUs and attribute values.
Run the import in "Validate" mode first. If errors appear (missing attribute, invalid category, image not found), fix the CSV — never proceed with errors. The "Stop on Error" behavior is the default and right setting.
After successful import, reindex: `bin/magento indexer:reindex`. On a 5K SKU catalog, expect 2-10 minutes depending on hardware.
Step 6
Stores → Configuration → Catalog → Layered Navigation. Set "Display Product Count" and "Display Out of Stock Products" correctly — defaults are usually wrong.
Stores → Configuration → Catalog → Layered Navigation → Display Product Count = Yes. Without this, customers see filters with no idea how many products they will yield.
Layered navigation uses Elasticsearch in 2.4.x. Confirm your search engine is set to elasticsearch7 (or opensearch) at Stores → Configuration → Catalog → Catalog → Catalog Search.
Set "Number of Top Search Terms" + "Number of Bottom Search Terms" via Marketing → SEO & Search → Search Terms. Monitor weekly — your top search terms reveal navigation gaps and demand you cannot see in category browsing.
Configure search weight per attribute: Stores → Attributes → Product → [attribute] → Storefront Properties → Search Weight (1-10). SKU and name should be 10. Description should be 5. Color/Size should be 7 if you want filter matches in fulltext search.
Run `bin/magento indexer:reindex catalogsearch_fulltext` after any search-weight change. Effects do not appear until reindex completes.
Step 7
Indexers are how Magento turns catalog data into storefront-fast lookup tables. Schedule them via cron — never on "Update on Save" in production.
System → Tools → Index Management. You see 8-10 indexers (Product Price, Category Products, Catalog Search, Stock, etc.). All should be "Update by Schedule," not "Update on Save."
Update on Save sounds convenient — it reindexes every time you save a product. On a small catalog it's fine. On a 5K+ catalog, saving one product can lock the admin for 30+ seconds per save. Switch all indexers to Update by Schedule.
Set "Update by Schedule" via the bulk action at the top of the index list. Cron will then run reindexing in the background every minute.
Monitor via `bin/magento indexer:status`. All indexers should show "Ready" most of the time. "Reindex required" persisting for >30 minutes means cron is broken or an indexer has died.
For catalog imports of 1K+ products: switch to manual reindex mode (`bin/magento indexer:set-mode manual`), run the import, then `bin/magento indexer:reindex` once. This is 5-10x faster than letting it reindex per-row.
Common mistakes
Creating attributes ad-hoc as you build products
What goes wrong: You end up with 50+ attributes, half of which are used on 2-3 products and forgotten. Layered navigation surfaces useless filters. Database EAV tables bloat. Reindex time grows linearly with attribute count.
How to avoid: Plan all attributes in a spreadsheet first. Create them all upfront. Audit quarterly — anything used on under 5% of products should probably be deprecated or merged.
Wrong visibility setting on variant simples
What goes wrong: Every variant SKU appears as its own product on category pages and search. A catalog of 100 t-shirts becomes 2,400 listings. Customers see duplicate-looking products. Google deduplicates and ranks none of them well.
How to avoid: On every variant simple: Visibility = 'Not Visible Individually.' On the configurable parent: Visibility = 'Catalog, Search.' Verify by browsing a category page after save.
Anchor flag off on parent categories
What goes wrong: Top-level category 'Apparel' shows zero products even though child categories Mens/Womens/Kids are full. Customers click 'Apparel' from the nav, see an empty grid, and bounce.
How to avoid: Catalog → Categories → [Category] → Display Settings → Is Anchor = Yes on every category that has sub-categories with products.
Indexers stuck on "Update on Save" in production
What goes wrong: Every product save locks the admin while reindexing runs synchronously. On a 5K catalog, save = 30-60 seconds wait. Admin team blames "Magento is slow" — actually you just have the wrong index mode.
How to avoid: System → Tools → Index Management → select all → Action: Update by Schedule. Re-run any pending indexer manually after the switch.
Missing category URL keys
What goes wrong: Categories get auto-generated URLs like /catalog/category/view/id/47/. Terrible for SEO, terrible for sharing links, terrible for customer trust. Even a small change to category name regenerates the URL and breaks every old link.
How to avoid: Set the URL Key field manually on every category. Use lowercase, hyphens, keyword-rich (e.g., 'mens-running-shoes' not 'cat-47').
Importing via Excel copy/paste
What goes wrong: Excel mangles special characters, drops leading zeros (SKU `00123` becomes `123`), and converts dates to numbers. Imported catalog has 5-15% of rows broken. Cleanup takes longer than re-importing would have.
How to avoid: Export to CSV (UTF-8 encoding). Use the built-in import: System → Data Transfer → Import. Always validate before committing.
Over-filtering layered navigation
What goes wrong: Every attribute marked as "Filterable" appears in the left rail. Customers face 15 filter groups, get overwhelmed, and bounce. Mobile screens cannot fit them all. Reindex time inflates.
How to avoid: Keep filterable attributes under 7 per category. Use category-specific filter visibility if needed via a third-party extension or custom code.
Recap
Done — what's next
How to set up a Magento store from scratch
Read the next tutorial
Hand it off
Catalog architecture is the single highest-leverage Magento decision you make. A well-architected 10K SKU catalog reindexes in 5 minutes; a poorly-architected one takes 4 hours. A Magento specialist can audit your catalog and rebuild attribute architecture, category trees, and configurable product setup in 1-2 weeks at $14-16/hr — typically $800-1,500 total for the audit + rebuild.
See specialist rates
Over 100 attributes total, or over 10 filterable per category, is usually too many. Magento's EAV model handles up to 200+ attributes technically, but admin UX and reindex performance degrade noticeably past 80-100 active attributes.
Configurable = same product with variants (size/color t-shirts). Grouped = related products bought together but priced separately (a furniture set you can buy individually). Bundle = a kit with required + optional add-ons (custom PC builder). Most catalogs need only Simple + Configurable. Grouped and Bundle are niche.
Yes, but it is non-trivial. Adobe's official Data Migration Tool handles core catalog, but custom attributes, extensions, and any heavily-customized M1 store needs hand-holding. Plan 4-8 weeks for a real migration. This is one of the highest-value places to hire a Magento specialist.
Use the CSV import in "Add/Update" mode with just the sku + price columns. Catalog Price Rules (Marketing → Catalog Price Rule) handle percentage discounts across categories. Avoid editing 1000 products one by one in the admin.
Some, yes. Out-of-box Magento lacks: real-time inventory across warehouses (needs MSI configured or Brightpearl), advanced product reviews (Yotpo/Trustpilot integrations), product Q&A. For tiered B2B pricing and customer-group-specific catalogs, Magento outperforms Shopify natively.
Three likely causes: (1) Indexers haven't run — check `bin/magento indexer:status` and run `bin/magento indexer:reindex catalogsearch_fulltext`. (2) Product status is Disabled. (3) Visibility is set to Not Visible Individually but you're searching for it directly. Check all three.
Adobe Commerce
Magento is the most powerful e-commerce platform you can run — and the easiest to misconfigure on day one. Most DIY installs skip Elasticsearch, run on shared hosting, and ship with /admin still publicly addressable. Here's the install path that won't haunt you in month three.
Adobe Commerce
Magento generates more duplicate-content URLs by default than any other major e-commerce platform. Pagination, layered nav, product attributes, store-view duplicates — every one is an SEO leak. Here's the essentials checklist that handles 90% of Magento SEO issues.
Shopify
Product pages get the love. Collection pages get the rankings. For ecommerce SEO, your collection pages are the equivalent of category pages on Amazon — and most Shopify stores leave them as glorified product grids. Here's how to make them rank.