My product CSV imports fine everywhere else, so why does Shopify's importer keep skipping rows?

If Shopify's product importer is quietly dropping rows that another CSV tool imports fine, the cause is almost always a required-field or formatting mismatch Shopify enforces strictly and other tools paper over.

importmigrationcsvproducts

What's going on

A merchant migrating a product catalog notices that Shopify's built-in product importer processes fewer rows than they submitted. There's no crash and no obvious error, just a lower product count than expected once the import finishes. When they run the exact same CSV through a different import tool, it goes through without complaint, which makes it feel like Shopify's importer is the flaky one.

In reality, Shopify's CSV importer is strict about a small set of rules. It needs a Title for every new product row, a matching Handle when updating existing products, and Option1 Name and Value pairs on every variant row. It also expects UTF-8 encoding and column headers that match its template. Any row that violates one of these tends to fail silently rather than importing partially or throwing an error the merchant can trace line by line.

Other importers, whether spreadsheet-based apps or custom migration scripts, often apply looser validation, auto-fill missing values, or surface a more detailed per-row error log instead of Shopify's terse post-import summary. That difference in strictness and error visibility, not a bug in either tool, is usually what's behind one importer accepting rows the other skips.

Why it happens

Shopify's native product CSV importer enforces required fields (Title always, Handle on updates, Option1 Name and Value on variant rows) and expects UTF-8 encoding with headers that match its template. A blank required cell, a mismatched header name, or a stray unescaped comma or quote mark in a description field can be enough for Shopify to reject that row rather than guess at the intent.

Because Shopify reports import results as a summary rather than a per-row error log, merchants often can't tell which specific rows failed or why. That makes the same file look like it 'worked' in a competing tool that happens to surface clearer error messages, auto-correct minor formatting issues, or simply apply looser validation.

5 ways to fix it

1

Check the columns Shopify actually requires first

Shopify's native product importer needs a Title for brand-new products, and Title plus Handle when you're updating existing ones. If you're importing variants, every variant row also needs Option1 Name and Option1 Value filled in; leave those blank and Shopify treats the row as invalid and drops it rather than guessing what you meant. Open your CSV in a plain text editor, not just a spreadsheet app, and scan for blank cells in these columns before you re-upload.

2

Compare your header row against Shopify's own template

Shopify matches columns by header name, so a renamed column, extra whitespace, or a header that doesn't exactly match what Shopify expects (for example, lowercase 'handle' instead of 'Handle') can make it silently ignore or misread that column, which cascades into skipped rows. Download a fresh sample CSV from Shopify's product import screen and compare your header row against it column by column.

3

Re-save as UTF-8 and check for stray quotes or commas

Shopify expects CSV files encoded as UTF-8; files exported from older systems or certain spreadsheet saves can end up in a different encoding or with unescaped quotation marks, which throws off comma-delimited parsing and causes Shopify to misread where one row ends and the next begins. Re-save the file as CSV UTF-8 from Excel or Google Sheets, and make sure any product title or description containing a comma or a quote mark is properly wrapped in quotes.

4

Import in small batches to isolate the bad rows

Shopify reports import results as a summary rather than a detailed per-row error log, so a handful of malformed rows in a file of a few thousand can be hard to pinpoint. Split the file into chunks of 50 to 100 rows and import them one at a time; when a batch's confirmation shows fewer products created than rows submitted, you've narrowed the problem down to that chunk and can inspect it directly.

5

Consider a dedicated import app if your data is genuinely messy

If your source data has duplicate handles, inconsistent variant structures, or mixed encodings built up over years of exports, a purpose-built import app such as Matrixify or Excelify will often show you which row and column failed validation and why, instead of an aggregate pass or fail result. That's usually why a third-party importer appears to 'accept' rows Shopify's own tool skips: it's surfacing, or auto-correcting, the same underlying data problems rather than bypassing them.

Bottom line

Row skips almost always trace back to a real data problem rather than a bug in Shopify's importer: a missing Title or Handle, a variant row missing its Option1 values, a header that doesn't match Shopify's template, or an encoding or quoting issue that breaks the CSV's row structure. Start by comparing your header row and required columns against Shopify's own sample file, re-save as UTF-8, and import in small batches so you can isolate exactly which rows fail. If you migrate large or messy catalogs regularly, a dedicated import app with row-level error reporting will save time over guessing from Shopify's summary email, though this isn't something BesPoP's own app lineup addresses directly.

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.