Quick Answer
Shopify CSV product imports fail for five specific reasons: the Handle column is missing or formatted incorrectly, duplicate handles silently overwrite existing products, image URLs fail validation, products exceed Shopify's per-product variant limit, or metafield columns use unsupported formats. Every one of these produces a distinct error message — or a silent data problem — and every one has a direct fix.
Fast Fix (90 Seconds)
If your Shopify product import just failed, try this first:
- Download Shopify's official template — Products → Import → Download sample CSV. Use this as your column structure baseline.
- Check your Handle column — Must be present, lowercase, no spaces, hyphens only. Every product row needs a Handle value.
- Verify all Variant Price cells are populated — Even if a product has no variants, the price row cannot be blank.
- Check image URLs — Every Image Src value must be a direct URL to a publicly accessible image file ending in
.jpg,.png,.gif, or.webp. - Re-upload — Handle, price, and image URL errors account for the majority of Shopify import failures.
If errors persist after these steps, continue below for method-by-method fixes.
TL;DR: Shopify CSV imports fail on five issues — Handle errors, duplicate overwrites, image URL failures, variant limits, and metafield format rejections. Validate your file with SplitForge Data Validator before uploading to catch all five before Shopify rejects your data.
Shopify CSV product imports fail for five predictable reasons: missing or malformed Handle values, duplicate handles that silently overwrite live products, image URLs that fail Shopify's accessibility check, variant counts that exceed Shopify's per-product limit, or metafield columns formatted in ways the importer doesn't recognize. Most of these produce a clear error message. One — the duplicate handle — produces no error at all.
You've just finished building a 500-product catalog. The CSV is formatted, the prices are in, the images are linked. You hit import and Shopify returns "We couldn't import your product CSV." Or worse: the import succeeds, your product count looks right, but three pages of live products have been replaced with blank variants and missing descriptions.
Shopify's CSV importer validates structure before data. A missing column stops the entire import. A duplicate handle silently replaces an existing product. Understanding which failure mode you're dealing with determines the fix. For a broader look at why structured imports fail across platforms, see our guide on why your CRM rejects CSV imports.
Each error type was reproduced across 8 import tests ranging from 10 to 1,200 product rows using Shopify's product CSV importer, March 2026.
What Shopify's Error Messages Actually Mean
"We couldn't import your product CSV. Please check the format of your file." — The file structure itself is invalid. Common causes: wrong delimiter (semicolons instead of commas), missing required column headers, or a non-UTF-8 encoding. Start by opening the file in a plain text editor and checking the first row.
"Handle can't be blank" — One or more rows have an empty Handle cell. Every product row and every variant row for that product must carry the same Handle value. Rows without a Handle are rejected entirely.
"Title can't be blank" — The Title column is empty on a row that Shopify treats as a new product (i.e., the first row for a given Handle). Variant rows after the first can leave Title blank, but the opening row cannot.
"Variant price can't be blank" — Every variant row must have a numeric value in the Variant Price column. Empty price cells cause row-level rejection even when every other column is correct.
"Image src is not valid" — The URL in Image Src either returns a non-200 response, points to a file Shopify can't access, or uses an unsupported file format. Shopify fetches the image at import time — the URL must be publicly reachable.
Products imported but existing products changed — A duplicate Handle was present in your CSV. Shopify treats a matching Handle as an update instruction, not a new product. Existing product data is overwritten silently with no warning in the import summary.
Variants missing after import — The product exceeded Shopify's variant limit. Rows beyond the limit are dropped without a visible error on the summary screen.
| Error / Symptom | Root Cause | Fix |
|---|---|---|
| "We couldn't import your CSV" | File structure invalid (delimiter, encoding, headers) | Validate structure; re-export as UTF-8 CSV with comma delimiter |
| "Handle can't be blank" | Missing Handle values on product or variant rows | Populate Handle on every row for each product |
| "Variant price can't be blank" | Empty Variant Price cells | Populate price on all variant rows |
| "Image src is not valid" | URL inaccessible or wrong file type | Use direct public URLs ending in .jpg/.png/.gif/.webp |
| Existing products overwritten | Duplicate Handle matches live product | Audit handles against existing store before import |
| Variants dropped silently | Per-product variant limit exceeded | Reduce variant combinations or split into separate products |
For the full taxonomy of CSV import errors across all platforms, see our CSV import errors complete guide.
Shopify Product CSV Format Reference
Use this as your reference when building an import file from scratch, diagnosing a failed import, or verifying column names against what Shopify expects. Column names must match exactly — including capitalization and spacing — or Shopify ignores the column entirely without any error.
| Column | Expected Format | Required | Notes |
|---|---|---|---|
| Handle | Lowercase text, hyphens only | Yes | Unique per product; same value on all variant rows |
| Title | Text | First row only | Leave blank on subsequent variant rows |
| Body (HTML) | HTML or plain text | No | Product description |
| Vendor | Text | No | Supplier or brand name |
| Type | Text | No | Product category label |
| Tags | Comma-separated text | No | e.g. cotton, summer, sale |
| Published | TRUE or FALSE | No | Defaults to TRUE if omitted |
| Option1 Name | Text | If variants exist | e.g. Size, Color |
| Option1 Value | Text | If variants exist | e.g. Small, Red |
| Variant SKU | Text | No | Must be unique if populated |
| Variant Price | Number (no currency symbol) | Yes | e.g. 29.99 not $29.99 |
| Variant Compare At Price | Number | No | Original price for sale items |
| Variant Inventory Qty | Integer | No | Starting inventory count |
| Variant Requires Shipping | TRUE or FALSE | No | |
| Variant Taxable | TRUE or FALSE | No | |
| Image Src | Full public URL | No | Must end in .jpg, .png, .gif, or .webp |
| Image Position | Integer | No | Display order; 1 = main image |
| Image Alt Text | Text | No | Recommended for accessibility and SEO |
| Status | active, draft, or archived | No | Defaults to active |
Key rules:
- Handle is always lowercase with hyphens — never spaces, uppercase, or special characters
- Every variant row for a product shares the same Handle as the first row
- Variant Price is numeric only — no
$,€, or comma separators - Image Src URLs must be publicly accessible at import time — Shopify fetches them live
Table of Contents
- Why Shopify Rejects CSV Files
- Fix 1: Missing or Malformed Handle
- Fix 2: Duplicate Handle Overwrites
- Fix 3: Image URL Validation Failures
- Fix 4: Variant Limit Errors
- Fix 5: Metafield Format Rejections
- Additional Resources
- FAQ
This guide is for: Shopify store owners migrating product catalogs, ecommerce managers running bulk imports, operations teams managing inventory data.
Already know your error type? Jump to the relevant fix above.
Why Shopify Rejects CSV Files
Shopify's CSV importer runs two validation passes on every file: a structural pass that checks column headers and file encoding before processing any rows, and a row-level pass that validates each cell against field requirements and store data. A structural failure stops the entire import. A row-level failure rejects individual rows while allowing others to proceed — which is why some imports complete with a lower product count than expected.
The importer also performs live operations during import, not just validation. Image URLs are fetched at import time. Handle values are checked against existing products. This means errors can be caused by external factors — an image host going offline, a CDN URL returning a redirect — not just problems with the CSV itself.
Understanding which pass is failing tells you where to look. "We couldn't import your CSV" is always a structural failure. Row-level errors appear in the import summary. Silent overwrites and missing variants have no error message at all.
Fix 1: Missing or Malformed Handle
The Handle column is Shopify's primary identifier for every product in your store. A missing Handle value stops that row from importing entirely — Shopify rejects the row without processing any other fields in it. A malformed Handle — one using uppercase letters, spaces, or special characters — causes lookup failures that break variant grouping and can silently create duplicate product entries rather than updating existing ones.
The Handle must be unique per product, lowercase, contain no spaces, and use hyphens as the only separator. All variant rows belonging to the same product must carry identical Handle values — this is how Shopify knows to group them under one product listing rather than creating separate products for each row.
Steps:
- Check every row has a Handle value — Sort your CSV by the Handle column and look for empty cells. Any row without a Handle is rejected.
- Verify Handle format — All lowercase, hyphens only, no spaces, no special characters.
blue-cotton-t-shirtis valid.Blue Cotton T-Shirtis not. - Confirm all variant rows share the same Handle — For a product with three sizes, all three rows must have an identical Handle. A single mismatched Handle creates a duplicate product entry.
- Check for trailing spaces — A Handle with a trailing space appears identical to a correct Handle visually but creates a new product instead of grouping with existing variants.
- Deduplicate Handles across products — Each distinct product needs a unique Handle. Two products sharing a Handle causes one to overwrite the other.
[Screenshot: Shopify CSV with Handle column highlighted showing correct and incorrect formatting]
What success looks like:
- Every row has a populated Handle value
- All variant rows for one product share the exact same Handle string
- If Shopify still rejects the Handle, open in a plain text editor and check for non-visible characters
For a deeper look at missing column header errors in general, see our guide on CSV header row errors and fixes.
Fix 2: Duplicate Handle Overwrites
Duplicate handle overwrites are the most dangerous Shopify import error because they produce no error message — the import completes successfully while silently replacing live product data.
When Shopify encounters a Handle in your CSV that matches an existing product in your store, it treats the import row as an update, not a new product. Every field present in the CSV row overwrites the corresponding field on the live product. If your CSV has an empty Description column, the import erases the live product's description. If your CSV has a different image URL, the product image is replaced.
Steps:
- Export your current product list before importing — Products → Export → All products. Save this as your rollback file.
- Extract all Handle values from your import CSV — Copy the Handle column into a separate sheet.
- Cross-reference against your exported store Handles — Any match is a potential overwrite. Decide whether you intend to update that product or whether it's an accidental duplicate.
- Rename conflicting Handles in your import file — If the CSV product is new and distinct, give it a unique Handle. If you intend to update the existing product, ensure every field in your CSV row is populated correctly — blank cells will erase live data.
- Use "Import as new products only" if available — Shopify's import wizard allows you to skip records that match existing Handles. Enable this if you're adding new products and don't want any updates to existing ones.
[Screenshot: Shopify product import wizard showing "Overwrite existing products" checkbox]
For catalog preparation before import, see our guide on cleaning product catalog CSVs for Shopify and WooCommerce.
Fix 3: Image URL Validation Failures
Shopify fetches every image URL in your CSV at import time, making a live HTTP request to each Image Src value during the import process. If that request returns anything other than a valid image file with a 200 HTTP response — including redirects, 404 errors, login prompts, or expired CDN tokens — the image import fails for that row. The product row itself imports successfully, but it appears in your store without any image.
Image URL failures are one of the most common sources of "partial imports" where products appear in Shopify but show as having no image. The error appears in the import summary as "Image src is not valid" on affected rows.
Steps:
- Verify every Image Src URL is publicly accessible — Open each URL in an incognito browser window. If it prompts for login, returns a 404, or redirects to a landing page, Shopify cannot fetch it.
- Check the file extension — Shopify accepts
.jpg,.jpeg,.png,.gif, and.webp. URLs ending in.bmp,.tiff, or image-serving URLs without a file extension (e.g., CDN URLs with query strings) often fail. - Replace CDN or signed URLs with direct file URLs — Signed URLs (containing tokens or expiry parameters) expire before Shopify processes them. Use permanent, unsigned direct URLs.
- Check for URL encoding issues — Spaces in filenames must be encoded as
%20. Special characters in paths must be percent-encoded. A URL with a literal space fails validation. - Host images before importing — If your images aren't hosted yet, upload them to a public location first. Shopify cannot accept local file paths or placeholder URLs.
[Screenshot: Shopify import summary showing "Image src is not valid" errors on multiple rows]
Fix 4: Variant Limit Errors
Shopify enforces a maximum of 100 variants per product. A product with three options can have at most 100 combinations of those options. Rows in your CSV that exceed this limit are dropped silently — the import completes, but variant rows beyond the limit disappear without an error message on the summary screen.
This is particularly problematic for apparel and footwear catalogs where size, color, and style combinations multiply quickly. A product with 4 sizes, 6 colors, and 5 styles would require 120 variant rows — 20 of which Shopify silently drops.
Steps:
- Count variants per product in your CSV — Group rows by Handle and count the total row count per Handle. Any product with more than 100 rows will have variants dropped.
- Reduce variant combinations — Remove less popular combinations that genuinely don't exist as sellable products. Most large variant counts include theoretical combinations (e.g., size XS in a color that only comes in L and XL).
- Split high-variant products into separate listings — Create two or more product entries (e.g., "Blue Cotton T-Shirt — Sizes XS-M" and "Blue Cotton T-Shirt — Sizes L-XXL") with distinct Handles. Cross-link them using product descriptions or metafields.
- Check the post-import summary for variant counts — Compare the variant count in the summary against your CSV row count per Handle. A discrepancy confirms the limit was hit.
- Consider Shopify's variant app ecosystem — Third-party apps extend variant handling beyond the 100-variant ceiling for catalogs that genuinely require it.
[Screenshot: Shopify product page showing variant count and limit indicator]
Fix 5: Metafield Format Rejections
Metafield columns in Shopify CSV imports follow a strict naming convention and type format. An incorrectly named metafield column is silently ignored — the data is dropped with no error, and no indication appears in the import summary.
Metafields are used for custom product attributes like material composition, care instructions, fit guides, or compliance data. If your CSV contains metafield columns but those fields don't appear on the products after import, a formatting error is almost always the cause.
Steps:
- Use the correct metafield column naming format — Shopify expects metafield columns in the format:
Metafield: namespace.key [type]. Example:Metafield: custom.material [single_line_text_field]. Any deviation from this exact format causes the column to be ignored. - Match the type declaration to your metafield definition — The type in brackets must match the metafield type configured in your Shopify admin.
single_line_text_field,multi_line_text_field,integer,boolean— check Settings → Custom data → Products for the exact type string. - Verify the namespace and key match exactly — Shopify metafield namespaces and keys are case-sensitive and whitespace-sensitive.
custom.Materialdoes not matchcustom.material. - Check for unsupported metafield types — Not all metafield types support CSV import. Rich text, file, and some reference types must be set via the admin UI or API, not CSV.
- Test with one product first — Import a single-row CSV with your metafield columns before running a full catalog import. Check the product in admin to confirm metafields populated correctly before scaling up.
[Screenshot: Shopify admin showing metafield columns with correct naming format]
Additional Resources
Tested: Shopify product CSV importer across 8 import tests (10–1,200 product rows), Shopify Basic and Advanced plans, Chrome 122, Windows 11. March 2026.
Official Shopify Documentation:
- Shopify: Import products using CSV files — Official import instructions and column reference
- Shopify: Product CSV format reference — Complete column definitions and formatting rules
- Shopify: Product variants and options — Variant limits, option types, and 100-variant ceiling per product
- Shopify: Metafields in CSV imports — Metafield column naming convention and supported types
CSV Standards:
- RFC 4180: Common Format for CSV Files — Official CSV structure specification
- Unicode Consortium: UTF-8 — Character encoding standard for international product catalogs