Shopify CSV import errors are the most frustrating part of managing a large catalog — and almost every one of them is preventable. A store owner on the Shopify Community forums uploaded 3,200 products last Tuesday. The import failed on row 847. No useful error message — just "there was a problem with your CSV file." They fixed the encoding, re-uploaded, and it failed again on row 2,104. Different error. Four hours later, they'd uploaded the same file six times and still had zero products in their store.
This happens every day. CSV import is one of Shopify's most-used features and one of its worst-documented. The official help page lists errors after they've already ruined your afternoon. Every guide out there does the same thing: here's what went wrong, now go fix it. That's backwards. You shouldn't be debugging a broken import — you should be preventing the failure before you click "Upload."
If you're managing more than 100 SKUs, a broken CSV import doesn't just waste time. It delays product launches, creates duplicate listings that confuse customers, and can overwrite live inventory numbers with bad data. One merchant on Reddit reported a CSV import that silently zeroed out inventory on 400 variants because of a formatting mismatch — they didn't notice until customers started getting "out of stock" errors on products they had 200 units of. If you're selling across multiple channels, bad import data compounds fast — see our guide on keeping inventory in sync across platforms.
The Encoding Trap That Breaks 40% of First Imports
Shopify requires UTF-8 encoding. That sounds simple until you realize that Excel on Windows saves CSV files in ANSI encoding by default. Google Sheets exports in UTF-8. Numbers on Mac uses its own flavor. If you've ever seen garbled characters in your product titles — "Womens" instead of "Women's" — encoding is the reason.
The fix is boring but non-negotiable: always save your CSV in UTF-8 with BOM (Byte Order Mark). In Excel, go to File > Save As > CSV UTF-8. In Google Sheets, export as CSV directly — it handles encoding correctly. If you're using a text editor like Notepad++, check the encoding in the bottom-right corner and convert to "UTF-8-BOM" before saving.
One more thing Excel does that'll break your import: smart quotes. Excel automatically converts straight quotes (') into curly quotes ('). Shopify's parser chokes on them. Run a find-and-replace across your file — replace all curly quotes with straight ones before uploading.
Why Are Your Shopify CSV Import Errors Caused by Column Headers?
Shopify's CSV parser requires exact column header names. "Title" works. "title" doesn't. "Body (HTML)" works. "Body (html)" doesn't. One wrong capital letter and the entire column gets silently ignored — your products upload with blank descriptions, missing prices, or no images, and you won't know why until a customer sees an empty product page.
Here are the exact headers Shopify expects, character for character:
- Handle — lowercase URL slug, no spaces (use hyphens)
- Title — required for the first row of each product
- Body (HTML) — note the space, parentheses, and capitalization
- Vendor, Product Category, Type, Tags
- Published — must be "TRUE" or "FALSE" (all caps)
- Option1 Name, Option1 Value — note the number right after "Option" with no space
- Variant SKU, Variant Grams, Variant Inventory Qty, Variant Price
- Image Src, Image Position, Image Alt Text
Download Shopify's official sample CSV from their help center and use those exact headers. Don't type them yourself. Copy them from the sample file. One mistyped header costs you an hour of debugging.
The Handle Is Your Anchor — Get It Wrong and You'll Create Duplicates
Every product in your CSV is grouped by its Handle column. All rows with the same handle belong to the same product. If you accidentally misspell a handle on one variant row — "blue-cotton-tshirt" on rows 1-3 and "blue-cotton-tshrt" on row 4 — Shopify creates a second product with just that one variant. You now have a duplicate listing in your store and you won't notice until a customer lands on a product page with one size option.
Before uploading, sort your CSV by the Handle column and visually scan for inconsistencies. Better yet, run a quick duplicate check: in Google Sheets, use =COUNTIF(A:A, A2) next to each handle. Any value greater than 1 that doesn't match your expected variant count is a problem.
Handles also control what happens during updates. If you're importing to update existing products, the handle must match exactly what's already in Shopify. "Blue-Cotton-Tshirt" and "blue-cotton-tshirt" are different handles. Shopify treats one as an update and the other as a new product.
The 15MB Ceiling and the 1,000-Variant Throttle Nobody Mentions
Shopify caps CSV uploads at 15MB per file. That sounds generous until you add product descriptions with HTML formatting. A catalog of 5,000 products with detailed descriptions, multiple images per product, and 3-4 variants each can easily hit 20MB+.
If your file exceeds 15MB, split it. But don't split randomly — split by complete products. Every row for a single handle must be in the same file. If handle "blue-cotton-tshirt" has 6 variant rows, all 6 must be in the same CSV. Split between products, never within one.
The throttle catches even more people off guard. Non-Plus stores can only create 1,000 new variants per CSV upload within a 24-hour window. If you're importing 3,000 products with 2 variants each, that's 6,000 variants. You'll need to split across 6 files and upload one per day — or consolidate your import into fewer variants and add the rest later. Shopify Plus stores don't have this limit.
Variant Deduplication: The Error That Looks Like Success
This one is insidious because the import appears to succeed. If two variant rows under the same handle have identical Option values — say, both have Option1 Value set to "Large" and Option2 Value set to "Blue" — Shopify silently drops the duplicate. No error message. Your product just shows up with fewer variants than you expected.
The fix requires checking every product's option combinations before upload:
- In your spreadsheet, create a helper column that concatenates Handle + Option1 Value + Option2 Value + Option3 Value
- Sort by that column
- Use conditional formatting or COUNTIF to highlight duplicates
- Resolve each duplicate — usually it's a typo in the option value or a row that was accidentally copied
Also watch for products where you've defined options inconsistently. If one row says Option1 Name is "Size" and another row for the same product says Option1 Name is "Sizes" (plural), Shopify treats these as different options and you get a malformed product page.
Images Need Full URLs and Metafields Don't Work at the Variant Level
Every URL in the Image Src column must be a complete, publicly accessible URL starting with https://. Not a relative path. Not a local file reference. Not a Google Drive sharing link (those redirect and Shopify can't resolve them). The image must be directly accessible — paste the URL in a browser tab, and the image should load instantly. If it shows a download prompt or a login page, Shopify can't import it.
For image position, start counting at 1. Position 1 is the main product image. Positions 2+ are gallery images. If you leave Image Position blank, Shopify assigns positions in the order rows appear — which might not be what you want.
Metafields have a limitation that Shopify barely documents: variant-level metafields included in your CSV are silently ignored. If you're trying to import custom data for individual variants (like a supplier code per size), it won't work through CSV. You'll need the Shopify API or a third-party app for variant metafields. Product-level metafields work fine in CSV imports — just add columns with the format Product Metafield: namespace.key [type].
How Do You Prevent Shopify CSV Import Failures Before They Happen?
Print this out. Tape it to your monitor. Run through it every single time before you hit "Upload."
- Encoding — File is saved as UTF-8 (with BOM). No curly quotes. No special characters from Excel auto-formatting.
- Headers — Column names copied directly from Shopify's sample CSV. Not typed manually.
- Handles — All lowercase, hyphens only, no spaces. Sorted and checked for typos. Grouped correctly (all variants of one product share the same handle).
- Required fields — Every product has a Title on its first row and a Handle on every row.
- Published column — Values are "TRUE" or "FALSE" in all caps. Not "Yes/No" or "1/0."
- Options consistency — Option Name columns use the exact same text across all rows of a product. No singular/plural mismatches.
- No duplicate variants — Helper column confirms every Handle + Option combination is unique.
- File size — Under 15MB. If over, split by complete products, not arbitrary row counts.
- Variant count — Total new variants under 1,000 for non-Plus stores (per 24-hour window).
- Image URLs — All start with https://, all load directly in a browser, no redirects or login walls.
- Backup — You've exported your current products from Shopify before importing, so you can roll back if something goes wrong.
That last point matters more than people think. Shopify CSV imports can overwrite existing product data. If your import file has a handle that matches an existing product and includes a Variant Inventory Qty column, it'll overwrite your live inventory numbers. Always export a backup first.
The next time you need to upload 500 products, don't start with the upload button. Start with this checklist. Spend 10 minutes validating the file and save yourself the 3 hours you'd lose to Shopify's unhelpful error messages. Your catalog — and your afternoon — will thank you.
Once your products are uploaded cleanly, the next step is making sure your product pages actually convert. Optimizing your order form can lift conversion rates significantly — especially if you're selling COD. EasySell helps you build high-converting order forms, upsells, and quantity discounts that turn your freshly uploaded catalog into actual revenue.