Why does my Shopify CSV import keep failing even though the data looks fine?

Shopify's product importer matches columns by exact header name, so a renamed, reordered, or malformed header row is the single most common reason a CSV import silently fails or creates duplicate products.

CSV importproduct importbulk editShopify admin

What's going on

You built a CSV of products to bulk-import or update, uploaded it under Products > Import, and Shopify either rejects it outright, silently skips rows, or worse, creates duplicate products instead of updating the ones you meant to edit. There's no obvious typo when you eyeball the file, and the error message (if there is one) doesn't clearly say which column is wrong.

This is one of the most common Shopify merchant frustrations around bulk product management, and it almost always comes down to the same root cause: Shopify's importer maps your spreadsheet columns to product fields by matching the exact header text in row one. It is not smart about synonyms, doesn't infer column meaning from position, and doesn't forgive extra whitespace, different capitalization, or headers copied from an outdated template or a different platform's export format.

Why it happens

Shopify's product importer works off exact, case-sensitive header names (Handle, Title, Variant SKU, Variant Price, and so on). If a CSV was built from an old template, exported from another platform, hand-typed, or edited in a spreadsheet app that silently reformats text, the header row can drift just enough that Shopify no longer recognizes a column, even though a human reading the file would understand it fine.

Spreadsheet software is a frequent hidden cause. Excel in particular can save CSVs with a byte-order-mark (BOM) character at the very start of the file, auto-correct straight quotes into curly ones, or use a semicolon instead of a comma as the delimiter depending on regional settings, any of which can make the entire header row unreadable to Shopify's parser even when every visible header spells correctly.

Because Shopify also uses the Handle column to decide whether a row is a new product or an update to an existing one, a header problem that drops or renames that single column doesn't just fail loudly. It can succeed and quietly create duplicate products, which is often more disruptive to catch and clean up than an outright import error.

5 ways to fix it

1

Export first, edit that file, don't build a CSV from scratch

From Products, click Export > Export all products > Plain CSV file and download it. That file has the exact current header names, order, and casing Shopify expects for your store (including any custom columns from apps or markets). Open your problem file and the fresh export side by side, or better, paste your data into the export's columns rather than typing headers by hand. This eliminates almost all header-mismatch errors because you're reusing headers Shopify just generated, not guessing at them from an old blog post or template.

2

Diff the header rows to find the mismatch

Copy the first row of your CSV and the first row of a fresh Shopify export into two lines in a text editor or a free online diff tool, then compare column by column. Look for the usual culprits: 'Variant SKU' vs 'SKU', trailing spaces after a header name, smart quotes or curly apostrophes swapped in for straight ones, US vs UK spelling, and columns from an outdated template that Shopify has since renamed or split into separate columns. Fixing the header row alone resolves the vast majority of failed imports.

3

Save as CSV UTF-8 and check for a hidden BOM or wrong delimiter

If you edited the file in Excel, resave using 'CSV UTF-8 (Comma delimited)' rather than the default CSV, since Excel's default save can insert a byte-order-mark or use a semicolon delimiter in some regional settings, both of which make Shopify misread the header row entirely (it looks like one giant column name instead of many). Google Sheets' File > Download > CSV is a safer default if you're unsure, since it doesn't add a BOM.

4

Keep the Handle column and don't rename or reorder it away

If you're updating existing products rather than creating new ones, the Handle column is what Shopify uses to match each CSV row to an existing product. A missing, renamed, or blank Handle column causes Shopify to treat rows as brand-new products, creating duplicates instead of updating the ones you meant to edit. When troubleshooting a failed import, confirm Handle survived whatever spreadsheet software you used to edit the file.

5

Import in small batches to isolate the bad row or column

If the header row checks out but the import still fails or behaves oddly, split the CSV into small chunks (10-20 rows) and import them one at a time. Shopify's import errors sometimes point to a row number rather than the actual problem column, so narrowing the file down quickly shows whether it's really a header issue or a data problem in a specific cell (like an invalid price format or a missing required field for a given row).

Bottom line

There's no way around Shopify's importer being strict about exact header names, since that's how it maps spreadsheet columns to product fields at all. The fix is almost always procedural, not technical: always start from a fresh product export instead of an old template, resave through a plain-text-safe tool, and diff header rows when something fails. This is a data-hygiene problem, not something a Shopify app can fix for you, so a careful export-diff-reimport habit will save more time than any tool.

Still Stuck?

Browse the rest of the problem library, run a free storefront scan to catch issues like this automatically, or email us and we'll work out a custom solution for it.